diff --git a/TempleOSCD/0000Boot/0000Kernel.BIN.C b/TempleOSCD/0000Boot/0000Kernel.BIN.C index 1640f89..ba5aeff 100644 Binary files a/TempleOSCD/0000Boot/0000Kernel.BIN.C and b/TempleOSCD/0000Boot/0000Kernel.BIN.C differ diff --git a/TempleOSCD/Adam/ADefine.HC b/TempleOSCD/Adam/ADefine.HC index f4e2ba4..2517b47 100644 --- a/TempleOSCD/Adam/ADefine.HC +++ b/TempleOSCD/Adam/ADefine.HC @@ -15,7 +15,7 @@ U0 LoadDocDefines() //$LK,"DD_BOOT_HIGH_LOC_DVD",A="FF:::/Adam/Opt/Boot/BootDVD.HC,DD_BOOT_HIGH_LOC_DVD"$ $TR,"LineRep"$ -$ID,2$DefinePrint("DD_TEMPLEOS_LOC","81,445"); +$ID,2$DefinePrint("DD_TEMPLEOS_LOC","80,800"); $ID,-2$ DefinePrint("DD_MP_VECT","%08X",MP_VECT_ADDR); DefinePrint("DD_MP_VECT_END","%08X", diff --git a/TempleOSCD/Adam/AExts.HC b/TempleOSCD/Adam/AExts.HC index 9006192..7e63cf8 100644 --- a/TempleOSCD/Adam/AExts.HC +++ b/TempleOSCD/Adam/AExts.HC @@ -5,13 +5,10 @@ extern U0 ACFillIn(I64 n); extern U0 ACMan(I64 n,CTask *parent_task=NULL); extern I64 AdamFile(U8 *filename,Bool warn_ext=TRUE); extern Bool AutoComplete(Bool val=OFF); -extern I64 BMPWrite(U8 *filename,CDC *dc,I64 bits=4); extern U0 ClipDel(); extern CCtrl *CtrlFindUnique(CTask *haystack_task,I64 needle_type); extern Bool CtrlInside(CCtrl *c,I64 x,I64 y); extern U8 *DC2Sprite(CDC *tmpb); -extern U0 DocBMP(CDoc *doc=NULL,U8 *filename, - Bool dither_probability=FALSE,Bool use_ms_paint_palette=FALSE); extern U0 DocBinDel(CDoc *doc,CDocBin *b); extern U0 DocBinsValidate(CDoc *doc); extern U0 DocBottom(CDoc *doc=NULL); diff --git a/TempleOSCD/Adam/ASnd.HC b/TempleOSCD/Adam/ASnd.HC new file mode 100644 index 0000000..fa6bf00 --- /dev/null +++ b/TempleOSCD/Adam/ASnd.HC @@ -0,0 +1,412 @@ +#help_index "Snd" +public U0 SndTaskEndCB() +{//Will turn-off snd when a task gets killed. + Snd; + Exit; +} + +#help_index "Snd/Math;Math" +public F64 Saw(F64 t,F64 period) +{//Sawtooth. 0.0 - 1.0 think "(Sin+1)/2" + if (period) { + if (t>=0.0) + return t%period/period; + else + return 1.0+t%period/period; + } else + return 0.0; +} + +public F64 FullSaw(F64 t,F64 period) +{//Plus&Minus Sawtooth. 1.0 - -1.0 think "Sin" + if (period) { + if (t>=0.0) + return 2.0*(t%period/period)-1.0; + else + return 2.0*(t%period/period)+1.0; + } else + return 0.0; +} + +public F64 Caw(F64 t,F64 period) +{//Cawtooth. 1.0 - 0.0 think "(Cos+1)/2" + if (period) { + if (t>=0.0) + return 1.0-t%period/period; + else + return -(t%period)/period; + } else + return 1.0; +} + +public F64 FullCaw(F64 t,F64 period) +{//Plus&Minus Cawtooth. 1.0 - -1.0 think "Cos" + if (period) { + if (t>=0.0) + return -2.0*(t%period/period)+1.0; + else + return -2.0*(t%period/period)-1.0; + } else + return 1.0; +} + +public F64 Tri(F64 t,F64 period) +{//Triangle waveform. 0.0 - 1.0 - 0.0 + if (period) { + t=2.0*(Abs(t)%period)/period; + if (t<=1.0) + return t; + else + return 2.0-t; + } else + return 0.0; +} + +public F64 FullTri(F64 t,F64 period) +{//Plus&Minus Triangle waveform. 0.0 - 1.0 - 0.0 - -1.0 -0.0 + if (period) { + t=4.0*(t%period)/period; + if (t<=-1.0) { + if (t<=-3.0) + return t+4.0; + else + return -2.0-t; + } else { + if (t<=1.0) + return t; + else if (t<=3.0) + return 2.0-t; + else + return t-4.0; + } + } else + return 0.0; +} + +#help_index "Snd/Music" + +public class CMusicGlbls +{ + U8 *cur_song; + CTask *cur_song_task; + I64 octave; + F64 note_len; + U8 note_map[7]; + Bool mute; + I64 meter_top,meter_bottom; + F64 tempo,stacatto_factor; + + //If you wish to sync with a + //note in a Play() string. 0 is the start + I64 play_note_num; + + F64 tM_correction,last_Beat,last_tM; +} music={NULL,NULL,4,1.0,{0,2,3,5,7,8,10},FALSE,4,4,2.5,0.9,0,0,0,0}; + +#help_index "Snd/Music;Time/Seconds" +public F64 tM() +{//Time in seconds synced to music subsystem. + return (cnts.jiffies+music.tM_correction)/JIFFY_FREQ; +} + +public F64 Beat() +{//Time in music beats. + F64 res,cur_tM; + PUSHFD + CLI + if (mp_cnt>1) + while (LBts(&sys_semas[SEMA_TMBEAT],0)) + PAUSE + cur_tM=tM; + res=music.last_Beat; + if (music.tempo) + res+=(cur_tM-music.last_tM)*music.tempo; + music.last_tM=cur_tM; + music.last_Beat=res; + LBtr(&sys_semas[SEMA_TMBEAT],0); + POPFD + return res; +} + +#help_index "Snd/Music" +U8 *MusicSetOctave(U8 *st) +{ + I64 ch; + ch=*st++; + while ('0'<=ch<='9') { + music.octave=ch-'0'; + ch=*st++; + } + return --st; +} + +U8 *MusicSetMeter(U8 *st) +{ + I64 ch; + ch=*st++; + while (ch=='M') { + ch=*st++; + if ('0'<=ch<='9') { + music.meter_top=ch-'0'; + ch=*st++; + } + if (ch=='/') + ch=*st++; + if ('0'<=ch<='9') { + music.meter_bottom=ch-'0'; + ch=*st++; + } + } + return --st; +} + +U8 *MusicSetNoteLen(U8 *st) +{ + Bool cont=TRUE; + do { + switch (*st++) { + case 'w': music.note_len=4.0; break; + case 'h': music.note_len=2.0; break; + case 'q': music.note_len=1.0; break; + case 'e': music.note_len=0.5; break; + case 's': music.note_len=0.25; break; + case 't': music.note_len=2.0*music.note_len/3.0; break; + case '.': music.note_len=1.5*music.note_len; break; + default: + st--; + cont=FALSE; + } + } while (cont); + return st; +} + +public I8 Note2Ona(I64 note,I64 octave=4) +{//Note to ona. Mid C is ona=51, note=3 and octave=4. + if (note<3) + return (octave+1)*12+note; + else + return octave*12+note; +} + +public I8 Ona2Note(I8 ona) +{//Ona to note in octave. Mid C is ona=51, note=3 and octave=4. + return ona%12; +} + +public I8 Ona2Octave(I8 ona) +{//Ona to octave. Mid C is ona=51, note=3 and octave=4. + I64 note=ona%12,octave=ona/12; + if (note<3) + return octave-1; + else + return octave; +} + +public U0 Play(U8 *st,U8 *words=NULL) +{/* Notes are entered with a capital letter. + +Octaves are entered with a digit and +stay set until changed. Mid C is octave 4. + +Durations are entered with +'w' whole note +'h' half note +'q' quarter note +'e' eighth note +'t' sets to 2/3rds the current duration +'.' sets to 1.5 times the current duration +durations stay set until changed. + +'(' tie, placed before the note to be extended + +$LK,"music.meter_top",A="MN:CMusicGlbls"$,$LK,"music.meter_bottom",A="MN:CMusicGlbls"$ is set with +"M3/4" +"M4/4" +etc. + +Sharp and flat are done with '#' or 'b'. + +The var music.stacatto_factor can +be set to a range from 0.0 to 1.0. + +The var music.tempo is quarter-notes +per second. It defaults to +2.5 and gets faster when bigger. +*/ + U8 *word,*last_st; + I64 note,octave,i=0,ona,timeout_val,timeout_val2; + Bool tie; + F64 d,on_jiffies,off_jiffies; + music.play_note_num=0; + while (*st) { + timeout_val=cnts.jiffies; + tie=FALSE; + + do { + last_st=st; + if (*st=='(') { + tie=TRUE; + st++; + } else { + st=MusicSetMeter(st); + st=MusicSetOctave(st); + st=MusicSetNoteLen(st); + } + } while (st!=last_st); + + if (!*st) break; + note=*st++-'A'; + if (note<7) { + note=music.note_map[note]; + octave=music.octave; + if (*st=='b') { + note--; + if (note==2) + octave--; + st++; + } else if (*st=='#') { + note++; + if (note==3) + octave++; + st++; + } + ona=Note2Ona(note,octave); + } else + ona=ONA_REST; + if (words && (word=LstSub(i++,words)) && StrCmp(word," ")) + "%s",word; + d=JIFFY_FREQ*music.note_len/music.tempo; + if (tie) { + on_jiffies =d; + off_jiffies =0; + } else { + on_jiffies =d*music.stacatto_factor; + off_jiffies =d*(1.0-music.stacatto_factor); + } + timeout_val+=on_jiffies; + timeout_val2=timeout_val+off_jiffies; + + if (!music.mute) + Snd(ona); + SleepUntil(timeout_val); + music.tM_correction+=on_jiffies-ToI64(on_jiffies); + + if (!music.mute) + Snd; + SleepUntil(timeout_val2); + music.tM_correction+=off_jiffies-ToI64(off_jiffies); + + music.play_note_num++; + } +} + +U0 MusicSettingsRst() +{ + music.play_note_num=0; + music.stacatto_factor=0.9; + music.tempo=2.5; + music.octave=4; + music.note_len=1.0; + music.meter_top=4; + music.meter_bottom=4; + SndRst; + PUSHFD + CLI + if (mp_cnt>1) + while (LBts(&sys_semas[SEMA_TMBEAT],0)) + PAUSE + music.last_tM=tM; + music.last_Beat=0.0; + LBtr(&sys_semas[SEMA_TMBEAT],0); + POPFD +} + +MusicSettingsRst; + +U0 CurSongTask() +{ + Fs->task_end_cb=&SndTaskEndCB; + while (TRUE) + Play(music.cur_song); +} + +#help_index "Snd" + +#define SE_NOISE 0 +#define SE_SWEEP 1 + +class CSoundEffectFrame +{ + I32 type; + I8 ona1,ona2; + F64 duration; +}; + +U0 SoundEffectEndTaskCB() +{ + Free(FramePtr("CSoundEffectFrame")); + music.mute--; + SndTaskEndCB; +} + +U0 SoundEffectTask(CSoundEffectFrame *ns) +{ + I64 i,ona; + F64 t0=tS,t,timeout=t0+ns->duration; + FramePtrAdd("CSoundEffectFrame",ns); + Fs->task_end_cb=&SoundEffectEndTaskCB; + switch (ns->type) { + case SE_NOISE: + i=MaxI64(ns->ona2-ns->ona1,1); + while (tSona1; + Snd(ona); + t=Clamp(3000.0/Ona2Freq(ona),1.0,50.0); + if (t+tS>timeout) + t=timeout-tS; + Sleep(t); + } + break; + case SE_SWEEP: + while (tSduration; + ona=(1.0-t)*ns->ona1+t*ns->ona2; + Snd(ona); + t=Clamp(3000.0/Ona2Freq(ona),1.0,50.0); + if (t+tS>timeout) + t=timeout-tS; + Sleep(t); + } + break; + } +} + +public CTask *Noise(I64 mS,F64 min_ona,F64 max_ona) +{//Make white noise for given number of mS. + CSoundEffectFrame *ns; + if (mS>0) { + ns=MAlloc(sizeof(CSoundEffectFrame)); + ns->type=SE_NOISE; + ns->duration=mS/1000.0; + ns->ona1=min_ona; + ns->ona2=max_ona; + music.mute++; + return Spawn(&SoundEffectTask,ns,"Noise",,Fs); + } else + return NULL; +} + +public CTask *Sweep(I64 mS,F64 ona1,F64 ona2) +{//Sweep through freq range in given number of mS. + CSoundEffectFrame *ns; + if (mS>0) { + ns=MAlloc(sizeof(CSoundEffectFrame)); + ns->type=SE_SWEEP; + ns->duration=mS/1000.0; + ns->ona1=ona1; + ns->ona2=ona2; + music.mute++; + return Spawn(&SoundEffectTask,ns,"Noise",,Fs); + } else + return NULL; +} diff --git a/TempleOSCD/Adam/DolDoc/DocFile.HC b/TempleOSCD/Adam/DolDoc/DocFile.HC index a524ecf..ae5bdc3 100644 --- a/TempleOSCD/Adam/DolDoc/DocFile.HC +++ b/TempleOSCD/Adam/DolDoc/DocFile.HC @@ -296,8 +296,7 @@ U0 DocUndoRestore(CDoc *doc) DocUnlock(doc); } -#help_index "Graphics/Windows BMP Files;Graphics/GR Files;"\ - "DolDoc/Output;StdOut/DolDoc" +#help_index "Graphics/GR Files;DolDoc/Output;StdOut/DolDoc" public Bool DocType(CDoc *doc=NULL,U8 *filename,I64 trailing_new_lines=1) {//Output txt or graphic file to document. Bool res=FALSE; @@ -311,12 +310,6 @@ public Bool DocType(CDoc *doc=NULL,U8 *filename,I64 trailing_new_lines=1) DocDump(doc2,100000); DocDel(doc2); res=TRUE; - } else if (FilesFindMatch(filename,"*.BMP.Z")) { - DocBMP(doc,filename,,FALSE); - res=TRUE; - } else if (FilesFindMatch(filename,"*.BMP;*.bmp")) { - DocBMP(doc,filename,,TRUE); - res=TRUE; } else if (FilesFindMatch(filename,"*.GR*")) { DocGR(doc,filename); res=TRUE; @@ -326,7 +319,7 @@ public Bool DocType(CDoc *doc=NULL,U8 *filename,I64 trailing_new_lines=1) return res; } -#help_index "Graphics/Windows BMP Files;Graphics/GR Files;"\ +#help_index "Graphics/GR Files;"\ "File/Cmd Line (Typically);DolDoc/Cmd Line (Typically);"\ "StdOut;Cmd Line (Typically)" public Bool Type(U8 *filename,I64 trailing_new_lines=1) diff --git a/TempleOSCD/Adam/Gr/GrDC.HC b/TempleOSCD/Adam/Gr/GrDC.HC index 3e66d38..0238d6e 100644 --- a/TempleOSCD/Adam/Gr/GrDC.HC +++ b/TempleOSCD/Adam/Gr/GrDC.HC @@ -376,6 +376,10 @@ public CDC *DCLoad(U8 *src,I64 *_size=NULL,CTask *task=NULL) #help_index "Graphics/GR Files" #help_file "::/Doc/GRFiles" #help_index "Graphics/Device Contexts;Graphics/GR Files" + +#define GR_FILE_MAX (offset(CDC.end)-offset(CDC.start)+\ + COLORS_NUM*sizeof(CBGR48)+sizeof(CArcCtrl)+GR_WIDTH*GR_HEIGHT) + public I64 GRWrite(U8 *filename,CDC *dc,I64 dcsf_flags=DCSF_COMPRESSED) {//TempleOS GR File. I64 size; diff --git a/TempleOSCD/Adam/Gr/GrMV.HC b/TempleOSCD/Adam/Gr/GrMV.HC new file mode 100644 index 0000000..5ef3639 --- /dev/null +++ b/TempleOSCD/Adam/Gr/GrMV.HC @@ -0,0 +1,58 @@ +#help_index "Graphics/Device Contexts;Graphics/GR Files" + +#define MV_FILE_MAX 0x007FF000 + +public I64 GR2MV(U8 *print_fmt="VID%03d.MV", + U8 *files_find_mask,U8 *fu_flags=NULL) +{/*Merge GR lst to MV file. +"+d" will delete GR list files. +*/ + I64 fuf_flags=0,file_num=0,size; + CDirEntry *tmpde,*tmpde1; + U8 *base,*dst,*src,*st; + CDC *dc,*dc_base=DCNew(GR_WIDTH,GR_HEIGHT); + CDate cdt; + Bool old_silent; + ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+f+F"); + ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags); + tmpde=tmpde1=FilesFind(files_find_mask,fuf_flags&FUG_FILES_FIND); + if (progress1_max=LinkedLstCnt(tmpde1)) { + dst=base=MAlloc(MV_FILE_MAX); + while (tmpde) { + dc=GRRead(tmpde->full_name); + GrBlot(dc_base,dc->x0,dc->y0,dc); + if (dst+GR_FILE_MAX>base+MV_FILE_MAX) { + st=MStrPrint(print_fmt,file_num++); + FileWrite(st,base,dst-base); + Free(st); + dst=base; + + cdt=dc->cdt; + dc=DCCopy(dc_base); + dc->cdt=cdt; + } + src=DCSave(dc,&size); + DCDel(dc); + MemCpy(dst,src,size); + dst+=size; + Free(src); + if (fuf_flags&FUF_DEL) { + old_silent=Silent; + Del(tmpde->full_name); + Silent(old_silent); + } + progress1++; + tmpde=tmpde->next; + } + if (dst>base) { + st=MStrPrint(print_fmt,file_num++); + FileWrite(st,base,dst-base); + Free(st); + } + Free(base); + } + progress1=progress1_max=0; + DirTreeDel(tmpde1); + DCDel(dc_base); + return file_num; +} diff --git a/TempleOSCD/Adam/Gr/MakeGr.HC b/TempleOSCD/Adam/Gr/MakeGr.HC index f0008c9..4437052 100644 --- a/TempleOSCD/Adam/Gr/MakeGr.HC +++ b/TempleOSCD/Adam/Gr/MakeGr.HC @@ -14,6 +14,7 @@ Cd(__DIR__);; #include "GrBitMap" #include "GrPrimatives" #include "GrComposites" +#include "GrMV" #define SPE_ABORT (-1) #define SPE_EXIT 0 diff --git a/TempleOSCD/Adam/Gr/SpriteBitMap.HC b/TempleOSCD/Adam/Gr/SpriteBitMap.HC index 4e8f169..4185842 100644 --- a/TempleOSCD/Adam/Gr/SpriteBitMap.HC +++ b/TempleOSCD/Adam/Gr/SpriteBitMap.HC @@ -26,8 +26,7 @@ #define SPBM_ADD_OUTLINE 23 #define SPBM_ETCH 24 #define SPBM_UNDO 25 -#define SPBM_SAVE_BMP 26 -#define SPBM_SAVE_GRA 27 +#define SPBM_SAVE_GR 26 U0 GrInit4() { @@ -36,7 +35,7 @@ U0 GrInit4() "Rect\0Circle\0Text\0Text Box\0Text Diamond\0Flood Fill\0" "Flood Fill Not Color\0PolyLine\0PolyPoint\0Copy\0Delete\0Paste\0" "Paste Transparent\0Find and Replace\0Trim to Extents\0Add Outline\0" - "Etch\0Undo\0Save BMP\0Save GR\0"); + "Etch\0Undo\0Save GR\0"); } GrInit4; @@ -79,8 +78,7 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width) "$$MU-UL,\"Delete to Clip\",LE=SPBM_DELETE$$\n" "$$MU-UL,\"Paste Clip\",LE=SPBM_PASTE$$\n" "$$MU-UL,\"Paste Transparent Clip\",LE=SPBM_PASTE_TRANSPARENT$$\n" - "\n$$MU-UL,\"Save BMP File\",LE=SPBM_SAVE_BMP$$\n" - "$$MU-UL,\"Save GR File\",LE=SPBM_SAVE_GRA$$\n" + "\n$$MU-UL,\"Save GR File\",LE=SPBM_SAVE_GR$$\n" "\n$$MU-UL,\"Undo\",LE=SPBM_UNDO$$\n" "\n$$PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",LE=SPBM_MAIN_MENU$$$$LTBLUE$$\n" "$$MU-UL,\"Exit Sprite\",LE=SPBM_EXIT$$\n" @@ -293,12 +291,7 @@ bm_menu: GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img); } goto bm_menu; - case SPBM_SAVE_BMP: - *filename.name=0; - if (DocForm(&filename) && *filename.name) - BMPWrite(filename.name,img); - goto bm_menu; - case SPBM_SAVE_GRA: + case SPBM_SAVE_GR: *filename.name=0; if (DocForm(&filename) && *filename.name) GRWrite(filename.name,img,DCSF_COMPRESSED|DCSF_PALETTE_GET); diff --git a/TempleOSCD/Adam/MakeAdam.HC b/TempleOSCD/Adam/MakeAdam.HC index 8b5c2f7..2d5ca21 100644 --- a/TempleOSCD/Adam/MakeAdam.HC +++ b/TempleOSCD/Adam/MakeAdam.HC @@ -6,7 +6,7 @@ Cd(__DIR__);; #include "TaskRep" #include "AMathODE" #include "Gr/MakeGr" -#include "Snd/MakeSnd" +#include "ASnd" #include "ABlkDev/MakeABlkDev" #include "Menu" #include "Win" diff --git a/TempleOSCD/Adam/Opt/Utils/MakeUtils.HC b/TempleOSCD/Adam/Opt/Utils/MakeUtils.HC index 15b9e11..27d3a46 100644 --- a/TempleOSCD/Adam/Opt/Utils/MakeUtils.HC +++ b/TempleOSCD/Adam/Opt/Utils/MakeUtils.HC @@ -1,6 +1,5 @@ Cd(__DIR__);; #include "Diff" -#include "FileBMP" #include "Find" #include "HeapLog" #include "LineRep" diff --git a/TempleOSCD/Adam/WinMgr.HC b/TempleOSCD/Adam/WinMgr.HC index 47a9f49..5c9cc5f 100644 --- a/TempleOSCD/Adam/WinMgr.HC +++ b/TempleOSCD/Adam/WinMgr.HC @@ -35,7 +35,7 @@ public U0 Refresh(I64 cnt=1,Bool force=FALSE) public Bool ScrnCast(Bool val=ON,U8 *print_fmt="B:/Tmp/%X.GR") {//WinMgr saves GR files to a dir. - Bool old_val,old_silent=Silent; + Bool old_val; if (val) { if (!(old_val=LBtr(&winmgr.scrn_cast,0))) { Free(winmgr.scrn_cast_print_fmt); @@ -46,7 +46,6 @@ public Bool ScrnCast(Bool val=ON,U8 *print_fmt="B:/Tmp/%X.GR") } } else old_val=LBtr(&winmgr.scrn_cast,0); - Silent(old_silent); return old_val; } diff --git a/TempleOSCD/Apps/Psalmody/Help.DD b/TempleOSCD/Apps/Psalmody/Help.DD index 9e90edb..a79f735 100644 --- a/TempleOSCD/Apps/Psalmody/Help.DD +++ b/TempleOSCD/Apps/Psalmody/Help.DD @@ -11,14 +11,3 @@ $WW,1$$FG,5$$TX+CX,"Psalmody Help"$$FG$ * You can take the $LK,"Play",A="MN:Play"$() stmts out of a song file and place them in your programs. You can also add a song to a document with $FG,2$$FG$, but you should do it after pressing $FG,2$$FG$ because the clip-insert in $FG,2$$FG$ is screwy. See this $SO,"",A="4qG5EC4BeGG5qCeFD4sB5G4B5G4qG5EC4BeGG5qCeFD4sB5G4B5GqEeEFqE4BeG5FetC4A5GqFCEeEFqE4BeG5FetC4A5GqFC"$ after pressing $FG,2$$FG$, now. * You can call $LK,"JukeBox",A="FF:::/Apps/Psalmody/JukeBox.HC,JukeBox"$("~/Psalmody"); to play your songs. - -* To create a $FG,2$.SND$FG$ file which can be exported and played under Windows, set the $FG,2$Bool$FG$ $LK,"snd.record",A="MN:CSndGlbls"$ to $FG,2$TRUE$FG$, play music, and set it to $FG,2$FALSE$FG$. Then, call $LK,"SndFileCreate",A="MN:SndFileCreate"$(). You might wish to make a $FG,2$$FG$ to toggle this system level recording feat. See $LK,"Snd",A="MN:Snd"$(). Add this code to your $LK,"~/HomeKeyPlugIns.HC"$ file. - -$FG,5$U0 CtrlAltR(I64) -{ - snd.record=!snd.record; -} -CtrlAltCBSet('R',&CtrlAltR,"Cmd /Toggle snd.record");$FG$ - -* When calling $LK,"SndFileCreate",A="MN:SndFileCreate"$() you can set a waveform. The PC speaker is $LK,"WF_SQUARE",A="MN:WF_SQUARE"$. You can sel reverb and averaging, also. - diff --git a/TempleOSCD/Apps/Psalmody/JukePuppet.HC b/TempleOSCD/Apps/Psalmody/JukePuppet.HC index 7a5f35c..8f6ccb1 100644 --- a/TempleOSCD/Apps/Psalmody/JukePuppet.HC +++ b/TempleOSCD/Apps/Psalmody/JukePuppet.HC @@ -71,7 +71,7 @@ U0 JukeSongPuppet(CTask *juke_task,I64 passes,I64 song_num,U8 *name) } public U0 JukeSongsPuppet(U8 *dirname="~/Psalmody",I64 passes=2, - I64 start_song=0,I64 end_song=I64_MAX,F64 start_delay=0) + I64 start_song=0,I64 end_song=I64_MAX) {//Help make music video by puppeting JukeBox task. I64 i; CDirEntry *tmpde,*tmpde1; @@ -80,7 +80,6 @@ public U0 JukeSongsPuppet(U8 *dirname="~/Psalmody",I64 passes=2, tmpde1=FilesFind("*",FUF_RECURSE|FUF_JUST_TXT|FUF_JUST_FILES); for (tmpde=tmpde1,i=0;tmpde && inext; - Sleep(start_delay*1000); for (i=start_song;tmpde && iname); tmpde=tmpde->next; diff --git a/TempleOSCD/Compiler/Compiler.BIN b/TempleOSCD/Compiler/Compiler.BIN index 36f65e7..fdfb941 100644 Binary files a/TempleOSCD/Compiler/Compiler.BIN and b/TempleOSCD/Compiler/Compiler.BIN differ diff --git a/TempleOSCD/Compiler/CompilerB.HH b/TempleOSCD/Compiler/CompilerB.HH index 166cd12..989e1f4 100644 --- a/TempleOSCD/Compiler/CompilerB.HH +++ b/TempleOSCD/Compiler/CompilerB.HH @@ -72,6 +72,7 @@ public extern U0 Ui(U8 *buf,U8 **_rip,I64 seg_size=64, I64 *_jmp_dst=NULL,Bool just_ins=FALSE); public extern I64 Un(U8 *rip,I64 cnt=0x80,I64 seg_size=64); extern CUAsmGlbls uasm; + #help_index "Hash/System" public extern I64 HashEntrySize(CHashSrcSym *tmph); public extern I64 HashEntrySize2(CHashSrcSym *tmph); diff --git a/TempleOSCD/Demo/AcctExample/HomeKeyPlugIns.HC b/TempleOSCD/Demo/AcctExample/HomeKeyPlugIns.HC index 2286cca..ddc25d6 100644 --- a/TempleOSCD/Demo/AcctExample/HomeKeyPlugIns.HC +++ b/TempleOSCD/Demo/AcctExample/HomeKeyPlugIns.HC @@ -156,12 +156,16 @@ Bool MyPutKey(I64 ch,I64 sc) case 'f': //With sync if (sc&SCF_KEY_DESC) KeyDescSet("Cmd /FrameGrabber Sync"); + else if (fg_on) + FrameGrabberToggle(FALSE,FALSE,FALSE); else FrameGrabberToggle(TRUE,FALSE,FALSE); return TRUE; case 'F': //With sync and intro TOS theme if (sc&SCF_KEY_DESC) KeyDescSet("Cmd /FrameGrabber Intro"); + else if (fg_on) + FrameGrabberToggle(FALSE,FALSE,TRUE); else FrameGrabberToggle(TRUE,TRUE,FALSE); return TRUE; @@ -220,6 +224,20 @@ Bool MyPutKey(I64 ch,I64 sc) "$$AN,\"\",A=\"ANC%d\"$$",i; } return TRUE; + case 'p': + if (sc&SCF_KEY_DESC) + KeyDescSet("Cmd /JukeBox"); + else + PopUp("#include \"::/Apps/Psalmody/Load\";" + "JukeBox(\"::/Home/Sup1/Sup1Hymns\");"); + return TRUE; + case 'P': + if (sc&SCF_KEY_DESC) + KeyDescSet("Cmd /Psalmody"); + else + PopUp("#include \"::/Apps/Psalmody/Load\";" + "Psalmody(\"~/Sup1/Sup1Hymns\");"); + return TRUE; //Ins your own ALT-key plug-ins case '1': diff --git a/TempleOSCD/Demo/AcctExample/PersonalMenu.DD b/TempleOSCD/Demo/AcctExample/PersonalMenu.DD index 4a63ff3..4362e7c 100644 Binary files a/TempleOSCD/Demo/AcctExample/PersonalMenu.DD and b/TempleOSCD/Demo/AcctExample/PersonalMenu.DD differ diff --git a/TempleOSCD/Demo/AcctExample/PersonalNotes.DD b/TempleOSCD/Demo/AcctExample/PersonalNotes.DD index fc40ba3..ab89b5f 100644 --- a/TempleOSCD/Demo/AcctExample/PersonalNotes.DD +++ b/TempleOSCD/Demo/AcctExample/PersonalNotes.DD @@ -1,6 +1,6 @@ $WW,1$$FG,5$$TX+CX,"TODO"$$FG$ -* Make $LK,"GR2BMPLst",A="MN:GR2BMPLst"$ combine disjoint rects for same frame. +* Make MV files combine disjoint rects for same frame. * God said to reconsider switch start/end, perhaps preface portion? @@ -198,8 +198,6 @@ $FG,5$$TX+CX,"Bugs? Not really sure."$$FG$ * $LK,"StrPrintJoin",A="MN:StrPrintJoin"$(,st); With st="\n\\"; (Forgot what this is talking about.) -* $LK,"BMPRLE4To",A="MN:BMPRLE4To"$() has files_size too big by 108. Fixed? - $FG,5$$TX+CX,"TODO? Not really, just angst."$$FG$ * Should these be moved into $LK,"CHashClass",A="MN:CHashClass"$ from $LK,"CMemberLst",A="MN:CMemberLst"$ and $LK,"CHashGlblVar",A="MN:CHashGlblVar"$? @@ -279,8 +277,6 @@ $FG,5$$TX+CX,"Committee Needed"$$FG$ * Import Intel datasheets so we can use links in $LK,"Code",A="FI:::/Kernel/Mem/PageTables.HC"$ for documentation. I tried a PDF-to-text convertor and it wasn't acceptible. -* Why are BMP file $LK,"CBGR24",A="MN:CBGR24"$'s wrong? $LK,"::/Adam/Opt/Utils/FileBMP.HC"$. - * Switch stmt with sparse cases? Maybe, ban sparse switch stmts. * Compiler Optimization: Postpone LocalVar init until last possible moment in case of return. diff --git a/TempleOSCD/Demo/AcctExample/Registry.HC b/TempleOSCD/Demo/AcctExample/Registry.HC index a0166f5..d7c7314 100644 --- a/TempleOSCD/Demo/AcctExample/Registry.HC +++ b/TempleOSCD/Demo/AcctExample/Registry.HC @@ -48,7 +48,7 @@ $ID,-2$$TR,"Wenceslas"$ $ID,2$F64 best_score=43.9944; $ID,-2$$TR,"OSTestSuite"$ $ID,2$progress1_tf=0.000;progress2_tf=0.000; -progress3_tf=0.000;progress4_tf=224.153; +progress3_tf=0.000;progress4_tf=223.150; $ID,-2$$TR,"XCaliber"$ $ID,2$I64 best_score=90; I64 msg_flags=2; @@ -60,13 +60,13 @@ $ID,-2$$TR,"Titanium"$ $ID,2$I64 best_score=16469; $ID,-2$$TR,"TOSRegen"$ $ID,2$progress1_tf=0.000;progress2_tf=0.000; -progress3_tf=0.000;progress4_tf=279.256; +progress3_tf=0.000;progress4_tf=279.384; $ID,-2$$ID,-2$$TR,"Once"$ $ID,2$$TR,"Adam"$ $ID,2$$ID,-2$$TR,"User"$ $ID,2$$ID,-2$$ID,-2$$TR,"DemoCompany"$ $ID,2$$TR,"Game1"$ -$ID,2$F64 best_score=184.02909; +$ID,2$F64 best_score=187.05180; $TR,"SimpleVal"$ -$ID,2$1244; +$ID,2$1245; $ID,-2$$ID,-2$$ID,-2$ \ No newline at end of file diff --git a/TempleOSCD/Demo/AcctExample/TOS/TOSDistro.HC b/TempleOSCD/Demo/AcctExample/TOS/TOSDistro.HC index 8f6ae55..c180b5d 100644 --- a/TempleOSCD/Demo/AcctExample/TOS/TOSDistro.HC +++ b/TempleOSCD/Demo/AcctExample/TOS/TOSDistro.HC @@ -323,7 +323,8 @@ public U0 TOSPreRegen() CopyTree("D:/Home/Sup1/Sup1Bin","C:/Home/Sup1/Sup1Bin"); Copy("D:/Home/Sup1/Sup1CodeScraps/Comm/TOSSocket*", "C:/Home/Sup1/Sup1CodeScraps/Comm"); - Copy("D:/Home/Sup1/Sup1Bin/God*","C:/Linux"); + DelTree("C:/Linux"); + CopyTree("D:/Linux","C:/Linux"); } public U0 TOSRegen() diff --git a/TempleOSCD/Demo/AcctExample/TOS/TOSMisc.HC b/TempleOSCD/Demo/AcctExample/TOS/TOSMisc.HC index 70820f2..56804a2 100644 --- a/TempleOSCD/Demo/AcctExample/TOS/TOSMisc.HC +++ b/TempleOSCD/Demo/AcctExample/TOS/TOSMisc.HC @@ -12,11 +12,11 @@ I64 CopyVideo(Bool reverb) intensity=0.35; } Del("D:/Tmp/*.SND"); - DelTree("D:/Tmp/ScrnShots"); - DirMk("D:/Tmp/ScrnShots"); + Del("D:/Tmp/*.MV"); Silent(old_silent); - SndFileCreate("D:/Tmp/Audio",0.115,0.0,WF_SQUARE,delay,intensity); - GR2BMPLst("B:/Tmp","+d","D:/Tmp/ScrnShots/VID%05d.BMP.Z"); + RunFile("~/Sup1/Sup1Snd/SndFile",, + "D:/Tmp/AUD%03d.SND",0.115,0.0,1,delay,intensity,0.185); + GR2MV("D:/Tmp/VID%03d.MV","B:/Tmp","+d"); return res; } @@ -27,17 +27,15 @@ U0 DelScrnShots() DelTree("B:/Tmp"); DirMk("B:/Tmp"); Del("D:/Tmp/*.SND"); - DelTree("D:/Tmp/ScrnShots"); - DirMk("D:/Tmp/ScrnShots"); + Del("D:/Tmp/*.MV"); Del("C:/Tmp/*.SND"); - DelTree("C:/Tmp/ScrnShots"); - DirMk("C:/Tmp/ScrnShots"); + Del("C:/Tmp/*.MV"); Silent(old_silent); } public U0 FrameGrabberToggle(Bool sync_tone,Bool tos_theme, Bool reverb,Bool just_audio=FALSE) -{//The frame grabber saves BMP files to D:/Tmp/ScrnShots. +{//The frame grabber saves GR files to B:/Tmp. static F64 last_time=0; if (tS-last_time>3.0) { last_time=tS; @@ -73,7 +71,7 @@ public U0 JukeLines(I64 start_line,I64 end_line) {//Make movie of many lines of songs, starting at 0. if (!fg_on) FrameGrabberToggle(FALSE,FALSE,FALSE); - JukeSongsPuppet("~/Sup1/Sup1Hymns",,start_line*5,end_line*5,1.5); + JukeSongsPuppet("~/Sup1/Sup1Hymns",,start_line*5,end_line*5); if (fg_on) FrameGrabberToggle(FALSE,FALSE,TRUE); } @@ -137,33 +135,6 @@ public CDoc *DC2Doc(CDC *dc,I64 dx=0,I64 dy=0,I64 *_total_score=NULL) return doc; } -public U0 BMP2Doc(U8 *_in_name,U8 *_out_name=NULL) -{//Use OCR to make a text DolDoc from BMP file. - U8 *in_name,*out_name; - I64 dx,dy,score,best_score=I64_MAX; - CDC *dc; - CDoc *doc; - in_name=ExtDft(_in_name,"BMP"); - if (_out_name) - out_name=ExtDft(_out_name,"DD.Z"); - else - out_name=ExtChg(_in_name,"DD.Z"); - if (dc=BMPRead(in_name)) { - for (dy=-3;dy<=4;dy++) - for (dx=-3;dx<=4;dx++) { - doc=DC2Doc(dc,dx,dy,&score); - if (scorefilename.name,out_name); - DocWrite(doc); - } - DocDel(doc); - } - } - Free(in_name); - Free(out_name); -} - #define MEM_TEST_SIZE 1024*1024 U0 MemTest() { diff --git a/TempleOSCD/Doc/Charter.DD b/TempleOSCD/Doc/Charter.DD index aaa4db6..564833e 100644 --- a/TempleOSCD/Doc/Charter.DD +++ b/TempleOSCD/Doc/Charter.DD @@ -31,7 +31,7 @@ $ID,-5$ * Low line count is the highest good, so it is easy to learn the whole thing. Users should see the light at the end of the tunnel. One file system, for example, is better than many file systems. -* There is a limit of 100,000 lines of code for all time, not including applications and demos. $FG,4$Code comments count$FG$, however. Currently, there are $TX,"82,150",D="DD_TEMPLEOS_LOC"$ lines of code. $FG,4$3rd party libraries are banned$FG$ because they circumvent the intent of this limit. The vision is a Commodore 64 ROM -- a fixed core API that is the only dependency of applications. Dependency on components and libraries creates a hell that is no longer blissful. +* There is a limit of 100,000 lines of code for all time, not including applications and demos. $FG,4$Code comments count$FG$, however. Currently, there are $TX,"81,494",D="DD_TEMPLEOS_LOC"$ lines of code. $FG,4$3rd party libraries are banned$FG$ because they circumvent the intent of this limit. The vision is a Commodore 64 ROM -- a fixed core API that is the only dependency of applications. Dependency on components and libraries creates a hell that is no longer blissful. * The metric for resolving all TempleOS code governance issues is how fast the compiler compiles itself and the kernel with $LK,"BootHDIns",A="MN:BootHDIns"$(). The $LK,"HolyC",A="FI:::/Doc/HolyC.DD"$ language should be changed to optimize this metric, as I did when I changed type casting from prefix standard C to postfix $LK,"HolyC",A="FI:::/Doc/HolyC.DD"$, but we need a rule to prevent degenerating into a brainfuck language. diff --git a/TempleOSCD/Doc/Tips.DD b/TempleOSCD/Doc/Tips.DD index 737d2ef..6649ca3 100644 --- a/TempleOSCD/Doc/Tips.DD +++ b/TempleOSCD/Doc/Tips.DD @@ -73,7 +73,7 @@ $FG,2$Merge(\"C:/*\",\"D:/*\",\"+r+d\");$FG$ to check my changes. * Use $FG,2$$FG$ will capture the scrn as a sprite on the clip. You can save the cmd line doc as text with $FG,2$$FG$. -* You can save a sprite as a $FG,2$.BMP$FG$ file in $FG,2$$FG$ on the Sprite BitMap Menu. +* You can save a sprite as a $FG,2$.GR$FG$ file in $FG,2$$FG$ on the Sprite BitMap Menu. * You can eye-dropper colors in the $FG,2$$FG$ sprite editor by pressing $FG,2$'c'$FG$. Press $FG,2$'t'$FG$ for transparent. @@ -131,7 +131,7 @@ $FG,2$Merge(\"C:/*\",\"D:/*\",\"+r+d\");$FG$ to check my changes. * For advanced heap debugging, play with $LK,"_CFG_HEAP_DBG",A="MN:_CFG_HEAP_DBG"$. You're on your own. -* You can use $LK,"Type",A="MN:Type"$() to display $FG,2$.BMP$FG$ or $FG,2$.GR$FG$ files. +* You can use $LK,"Type",A="MN:Type"$() to display $FG,2$.GR$FG$ files. * Use $LK,"Man",A="MN:Man"$() to jump to short sym name src code. diff --git a/TempleOSCD/Kernel/Kernel.MAP b/TempleOSCD/Kernel/Kernel.MAP index b791d94..d8af406 100644 --- a/TempleOSCD/Kernel/Kernel.MAP +++ b/TempleOSCD/Kernel/Kernel.MAP @@ -2834,14 +2834,15 @@ $LK,"_CALL_IND",A="FL:::/Kernel/KUtils.HC.Z,332"$ $LK,"PURPLE",A="FL:::/Kernel/KernelA.HH,2925"$ $LK,"TASKf_BREAK_LOCKED",A="FL:::/Kernel/KernelA.HH,3245"$ $LK,"FILEMASK_SRC",A="FL:::/Kernel/KernelA.HH,2308"$ -4AJãàãàíàöàá#áQáUáUáZáDVc³ ³ · Æ Ò Þ ê ø    ! " & @4@ccko†�´ÃÏÝäõöú<#33F`y†���˜¦D‰–ããñÿ %88A„3Pú³ú³ -´´ ´'´'´J´V´e´r´´„´Š´™´Ÿ´¦´¦´ª´ª´ª´ª´·´º´Ê´0ÎÖã–ã–ý–—(—*—*—4—Ì699,929L9O9[9p9v9|9‚9¡9¦9®9®9¼9Â9Ç9ì9ò9ô9:::: :!:0:4:C:I:L:N:^:b:v:y:|:~:�:�:œ: Ä Íœ6œ6¾6È6Ë6Û6ó6ý677 7 7H7K7N7P7c7f7i7q7w7|7|7‚7Ž7�7™7™7™7™7Ÿ7¢7§7ª7²7Ä7 -ˆFdê¾ê¾¿¿¿"¿+¿3¿9¿<¿H¿H¿v¿ƒ¿�¿�¿“¿š¿¢¿¨¿µ¿µ¿Ë¿ hÚ¦Ú¦ã¦ñ¦§ §§+§;§K§Z§i§y§‰§ª§¬§»§ʧڧꧨ¨¨ @Zf«:«:¹:À:Æ:Í:á:è:ê:ï:ü: 4æï»—»—Õ—ã—û—˜˜˜˜44=øHøHI"I"I%I?I?IEI(-35=RT^HÜê9x9xYxfxkxwx—x�x£x°x¹xºxÆx(Z`ÜÜ8ÜJÜRÜXÜ`Ü$üÊˆÊˆÓˆÛˆáˆæˆ0´¼BÖBÖXÖcÖtÖvÖ~Ö8‰äcäcòcùcd d d"d"d+d1dP[kÜbÜbêbñbübc -cc c&c(c+c6c�E�Q�j�w�z���„�†�ž�±�¸�Æ�Æ�Æ�Í�Ù�ã�ñ�ú�‘‘‘‘*‘9‘H‘h‘q‘Û‘4×à;—;—O—]—u—€—‚—‚—Š—@@L‹‹“š§¶ÅÚîý%)`ˆœs!s!�!Ž!˜!˜!«!³!Æ!È!Û!Û!ß!é!î!î!ô!|w’Ò¥Ò¥ò¥¦ ¦¦¦¦,¦>¦N¦_¦o¦q¦q¦q¦w¦�¦­¦½¦¿¦¿¦ȦÔ¦XÓå³3³3¿3Á3Ð3æ3ò3ù344)4)4+4.444@8Dò‰ò‰ŠŠ$Š1Š1Š;Š|ýÓÓ5F]buyŠ�¦¶¾ÎÝà ¬AhxyxyŽyŸy£y²yÄyØyãyéyzzz#z-z“>œ>Ç>ò>?l?y?{?“?“?â?ï?ñ? @ @@9@@@E@O@|@ƒ@…@Š@�@! †Šì\ì\õ\]]"H—¥ÞÞùû ))-7#Œ¬ËVùVùwùzùƒùŸù²ù²ù½ùÂùÊùäùìùÿù úúú ú'ú4ú7ú@úCúFúKúrú$ lpþÊþÊË Ë&Ë%DLYèŽèŽ����.�;�A�D�P�&p¼Ô¾¾ÌÚðÿ%-8Rbqqxxxg'h#9ÈvÈvÞvàvïvwwwwww/wow|w†w–w w«w®w¼w($gl@y@yDyTy_yzy)œd‡+ + A J W d q ‰ � Ÿ ³ ³ » Ð Ý Ý ê ò !!!/!A!I!]!d!d!n!*|9,a,a6aCaTa^aealaua}a•aœa£a­aµa¼aÃaËaÑaÜaàaâaâaæa+Xd§d§ƒ§†§‹§Ž§—§¢§µ§¿§Ç§Ë§Î§Î§Ô§×§å§,D ,åPåPùP QQ%Q,Q3Q4QLùRžRž`žcžožyžžŒž ž žžžßžãžçžíž? …‰ÞÞâñõ@\˜«®ø®øÂøÐøÕøÛøæøïøïøÿø ùù'ù.ù1ù3ùVùA4Š“ööú5JJJNB4u~àKàKéKóK-L=LILYL\L_LC ”˜NNRuyDpu�BÚBÚ\ÚnÚŠÚŠÚ‘Ú“Ú“Ú¡Ú£Ú£Ú¯Ú¯Ú¸ÚÀÚÇÚÒÚíÚ -Û -Û -ÛÛE4•ž¢~¢~¬~®~À~Ç~ç~è~í~F,'.ëëëëë4ë9ë?ëGXl~�E�Q�j�w�z���„�†�ž�±�¸�Æ�Æ�Æ�Í�Ù�ã�ñ�ú�‘‘‘‘*‘9‘H‘h‘q‘Û‘4×à;—;—O—]—u—€—‚—‚—Š—@@L‹‹“š§¶ÅÚîý%)`ˆœs!s!�!Ž!˜!˜!«!³!Æ!È!Û!Û!ß!é!î!î!ô!|w’ʥʥê¥ú¥¦ +¦ ¦¦$¦6¦F¦W¦g¦i¦i¦i¦o¦ˆ¦¥¦µ¦·¦·¦À¦̦XÓå³3³3¿3Á3Ð3æ3ò3ù344)4)4+4.444@8Dò‰ò‰ŠŠ$Š1Š1Š;Š|ýËËüÿ ->UZmq‚•ž®¶ÆÕØ ¬Ahpypy†y—y›yªy¼yÐyÛyáyùyùy zz%z4z9z9zEzEzKzKzµzºzºzâzâzðzózöz{ +{{;{ ŒËê“>“>œ>Ç>ò>?l?y?{?“?“?â?ï?ñ? @ @@9@@@E@O@|@ƒ@…@Š@�@! †Šì\ì\õ\]]"H—¥ÞÞùû ))-7#Œ¬ËVùVùwùzùƒùŸù²ù²ù½ùÂùÊùäùìùÿù úúú ú'ú4ú7ú@úCúFúKúrú$ lpþÊþÊË Ë&Ë%DLYàŽàŽüŽþŽ��&�3�9�<�H�&p¼Ô¾¾ÌÚðÿ%-8Rbqqxxxg'h#9ÈvÈvÞvàvïvwwwwww/wow|w†w–w w«w®w¼w($gl@y@yDyTy_yzy)œd‡+ + A J W d q ‰ � Ÿ ³ ³ » Ð Ý Ý ê ò !!!/!A!I!]!d!d!n!*|9,a,a6aCaTa^aealaua}a•aœa£a­aµa¼aÃaËaÑaÜaàaâaâaæa+Xd§d§ƒ§†§‹§Ž§—§¢§µ§¿§Ç§Ë§Î§Î§Ô§×§å§,D ,åPåPùP QQ%Q,Q3Q4QLùJžJžXž[žgžqžwž„ž˜ž˜žºžºžמÛžßžåž? …‰ÞÞâñõ@\˜«®ø®øÂøÐøÕøÛøæøïøïøÿø ùù'ù.ù1ù3ùVùA4Š“ööú5JJJNB4u~àKàKéKóK-L=LILYL\L_LC ”˜NNRuyDpu�:Ú:ÚTÚfÚ‚Ú‚Ú‰Ú‹Ú‹Ú™Ú›Ú›Ú§Ú§Ú°Ú¸Ú¿ÚÊÚåÚÛÛÛÛE4•ž¢~¢~¬~®~À~Ç~ç~è~í~F,'.ëëëëë4ë9ë?ëGXl~H\i‚‘¤ÁÌÔïú-9BGdmz‰ž¸ÃËÖÖÖÛéôû ^ {ÓìÓìíìÿì í_4ˆ`L`LiLsL­L½LÉLÙLÜLßL`$ýËiËiëiøij ja$+0~Ú~Ú‡Ú˜ÚªÚæÚb¨CiÚ©Ú©ªªªª&ª2ª2ª:ªcªlªqªzª}ª‚ª‚ªšª¯ª²ªµª»ªªƪõªùª««««««"«2«c<$/š¨š¨¨¨°¨¸¨ȨÔ¨Þ¨ ©©©dü¶ñ[V[VoV~V�V—V¦VµVµVÛVðVûVW%W2W@WNW\WjWŠW€W–W¨W³WÅW×WÞWåWòWùWXXX)X5X_XuX†X†XŽX‘XŸXe@nz<¥<¥I¥Q¥T¥b¥f¥j¥m¥{¥‚¥‡¥f(aj‚j‚}‚ƒ‚’‚œ‚¡‚¡‚­‚´‚¹‚ÂÔ‚å‚ù‚û‚ƒFƒ]ƒvƒ�ƒ“ƒ·ƒ¹ƒÒƒ܃õƒÿƒ„"„-„;„B„P„P„Z„s„›„¦„½„„Ä„΄ê„ó„û„…g<±¼ÓpÓpépüpqq3q:qPqVq\q’qh,c4c4g4”4»4è4 5 5i<bmô¤ô¤¥ ¥ ¥¥¥"¥0¥4¥9¥jˆ3ö ö    ) @@ -2861,71 +2862,84 @@ cc c&c(c+c6c>WZhhq|�„”Ÿ¥¨«­±½rH<Jžõžõ®õ´õ¿õÈõËõØõáõáõåõèõðõs$@E..7EKPt4ÕÞnn|Š’�¶»ÂÈu¬LsŠ{Š{œ{«{±{Å{Ø{ï{||,|C|Z|q|Œ|�|—|�|¡|³|Ì|Ù|ß|ú|þ|} }}!}:}G}M}P}Z}v„c€@i@icigitiyi}i�i±i»i»iÑiÝiäi÷iüijj4j>j>jRjRjUjcjwP–¦«o«oÁoÔoæoÿo p pp2p=pCpGpOpx(cc$c.c9cAcFcy0ltFFTcntvv|z<KV@x@xIxSxcxex˜xŸxŸxŸx¢x{˜ò^^dbrï |4ŠÓNÑNÑfÑnÑ|чыёїѥѺѿÑÅÑÜÑáÑçÑþÑÒ Ò Ò%Ò+Ò9Ò=ÒYÒlÒÒ„Ò“Ò Ò°Ò¿ÒÌÒßÒåÒìÒîÒÓÓ"Ó0ÓBÓBÓUÓWÓjÓlÓÓ�Ó”Ó”Ó°ÓÇÓÍÓÓÓÞÓÔ}Höóöóÿóôô)ô+ô-ô<ô<ôKôMôMôRô~`ÝñÓhÓhêhøhii ii,i7iBiDiIiKiLiLiVi(³¹»ö»öÆöÚöëöíö€„#è#è+è6èFèUèaè…è…è�è’è’è¶èÅèæèþèééééé&é-é-é?éDéKé�DÚçnñnñ~ñ„ñ“ñŸñ¦ñµñÁñÁñÇñ‚8ÛbÛbëbîbóböbc -c cccƒtkñkñ{ñ•ñ•ñ—ñ—ñ—ñ«ñ­ñ­ñ­ñ¶ñÇñÐñáñìñïñññôñöñöñöñò„DMZ+T+T@TNTNTVTlTpTpTtT|T…¤6[�„�„ª„²„¶„¾„ʄф؄݄ò„…………… …7…:…C…I…L…N…X…]…t…w…y…€…„…’…†81;æÚæÚôÚ ÛÛÛ!Û%Û%Û+Û‡$0u+ + 3 C S e t } ‹ ™   « · Ì Ú â ÷ !!&!;!E!Z!d!y!ƒ!˜!¦!¦!´!À!Ì!à!""%"3"?"K"\"q"†"—"¡"³"Å"×"é"#*#?#d#{#„#“#®#Å#Î#Ù#à#ë#õ#þ#$ˆ,–�“^“^—^¨^¸^½^Ì^‰02:+’+’?’J’\’d’g’o’мKv“d“d¯dÐdâdédódÿdeee%e2eVeeelese„e†eŽe™e¤e³eºe½e¿eÅeËeãeìeìeðe f‹,ÑØ–ú–ú¤ú°úÇúËúÍúáúŒD VxWxW’W•W›W§W©W¸W¿WÅWîWõW"X)X-XEXQXnXwXwXwX„X½XÉXÕXâXõXYY'Y4YEY\YbY©Y»YèYïYZZ ZdFd^d^dgd{d�d‹d§d«d–@!-ËúËúÙúÞúáúóúùúüúþúû—(âè‹s‹s¡s½sÏsÕsðs˜ %)nónóxó‹ó�ó™H/=RàRàgàsàvàà‹à“à°à¿àÅàÈàÔàš  -¦ò¦òªò·ò¹ò›ä{°zzz'zJzTzfzizqztzzz}z‰z›z¨z®z»zÆzËzÑzãzãzòzõzÿz{{ {-{3{@{K{P{V{h{h{h{h{s{s{�{œ ÑõSLSLrLtL…LŠL˜L¹LÇLÕLàLøLÿLMMMM M!M'M-M0M6M8MAMPMVMVMVM]MnM�@%¢Ÿ¢Ÿ¶ŸÄŸÄŸÑŸöŸ     žT…–VVz}‹‹Ÿ¯ºÀËËËÏÝŸ`p„¾¾Ûáïï&-=AAAEQ Hø¢Ì¢ÌÉÌçÌõÌÍÍÍ Í!Í+Í+Í-Í;Í¡D"/’‰’‰ ‰¬‰±‰±‰Â‰Ç‰Ç‰Í‰¢X{�ƒIƒIœI¬IÄIÐIÜIÜIîIôIôIJ JJJJ£,Úáss)sLs7s\sbsˆs¤8{…ÆÆÆÆ&ÆDÆPÆRÆRÆÖÆ¥8>HHIHIVI\IcIyIyI€IšI I¦<xƒ¶¶-¶;¶B¶F¶I¶M¶T¶x¶ˆ¶§`«¿226M²ËÚéîôö¨@ ãùãùþùúú'ú'ú4ú4úDúFúFúnú©d2Çð7ð7û78868G8V8c8r8†8ž8¶8É8ß8ê89/9L9q9v9�9¤9Ä9Û9ë9í9#:z:K:I:™:ª:±:Ñ:æ:;;';';F;M;‰;—;÷;È;Æ;<<"<8<@<@<e<u<–<Ü<©<±<œ<=7=?=?=_=t=•=Ÿ=¶=¾=©=>>>>>(>C>Q>i>‚>›>¶>Î>ä>ü> -???(?A?U?j?ˆ?Œ?Š?Ú?è?ø?@@9@D@\@r@r@É@š@˜@è@ö@A!A9AOAQA›AlAjAºAºAÃAÌAáAáAòAùABB B B"B&Bª4 -â‚â‚ð‚õ‚ø‚þ‚ƒƒ ƒ«,sz°y°y´y¹yÃyÓyÓyþy¬T—¨¬d¬dºdÇdÔdòdõdüdeeee!e)e­Ô%VsGsG“G¡G¦G°G°G·GÅGÈGÏGÏGÖGäGçGëG÷G÷GH HH$H&H&H&H)H.H:H:HFH_HbHuHuHxH{H‹H®ÈÉ÷û#û#$$.$.$@$E$E$W$\$\$n$s$s$…$Š$Š$œ$¡$¡$¡$¡$¨$­$­$¿$Ä$Ä$Ö$Û$Û$ò$ %4%4%F%M%T%]%l%Ï%¯„a~fÜfÜjÜyÜy܈܈ܗܗܦܵܵÜÉÜÄÜØÜÓÜâÜâÜñÜñÜÝ\á°LtƒZ}Z}n}{}~}‚}�}›}¤}Ã}Ð}Ú}Þ}á}ó}±TÊÛæäæäôäûäå)å7åAåGåQåVådåjåmåså²¼žÉãã ã&ã4ã4ãQã[ãsãwã�ã“ã­ã­ãÀãÉãÔãÝãêãóãää ä(ä*ä0ä9ä?ädägää�ä ä¤ä¨ä³ä³ä·ä·ä·äàä³4RƒRƒ`ƒbƒgƒjƒmƒrƒxƒ´”"¨u¨uÂuáuíuvvv v#v/v@vMvSvVvYv\vavcvgvsv„v“v™vœvŸv¢v¢v¬v¯vÁvµP]mÎèÎè×èåèåèýèé"é;éWéféé›éœé¡é¶L–¥Š€Š€˜€¤€¯€À€Ô€Ø€æ€û€ ���-�C�·ˆSqþUþUVV%V%V1V9VAVLVUV]VbVdVhVwV‚VŠV’V“V“V�V¸Ü›Î 0=HQgz“§³ÃÖãö*6BBOYi•­ÆÊÌÑÖßñøø -  = ¹,z�®í®í²íéíîî -îº,fm‹‹‹‹#‹/‹3‹9‹»H´Â²�²�»�Ç�Ú�å�ý�ÿ�‚‚‚‚‚¼dÃØ"‚"‚+‚C‚N‚j‚l‚‚‚˜‚«‚Á‚Û‚ß‚½¬޵JJ7J9JSJbJ�J™JžJÍJÔJÖJÖJåJïJúJÿJKKK%K>KEKEKWKcKgKqK¾€0LcScSSŽS“S™S£S¨S¯S¾SÄSÄSÍSØSêSóSþSTTT T T T!T+T¿  .ó.ó8óKóPóÀŒ'F|¢|¢Œ¢�¢™¢´¢Â¢Ç¢Ê¢Ø¢Ý¢ü¢£.£2£R£T£\£†£Š£ª£´£»£Ñ£ì£¤$¤@¤G¤O¤Á´T}¶ ¶ Ô Û å ê ý   ( = B L V ` ^ n Œ ¦ œ ¶ À Ú þ   '-4;BIZ__×Âøµï[ž[žyžŠžŸž¥ž¬ž¬žºžÉžÐžÖžèžèžûž ŸŸ!Ÿ4Ÿ@ŸWŸYŸqŸsŸvŸxŸxŸ|Ÿ|ŸˆŸ�Ÿ�Ÿ“ŸžŸ¤Ÿ°Ÿ¸ŸÝŸóŸ  " ( + C Ã4&/SSS$S.SASISSSUSbSÄŒ4S6 6 ? a l } ‘ © ¾ Ó Ü á á ñ ú   # F V V V i n o ³ Å8ˆ’fîfîtî€î«î¸îºîÁîÉîËîÑîÆ€5[�[�{�‡�“�—�›�ª�¾�Æ�Ì�à�ï�û�‘ ‘‘‘"‘0‘4‘>‘B‘K‘Q‘d‘Ç$). H H®HµHÉHÏHÈ,‚‰¦Ë¦Ë¼ËÏËÚËàËãËëËɨ+xŒxŒ’Œ•Œ­Œ¸ŒÈŒÚŒÞŒìŒõŒ���)�4�B�L�T�X�X�X�[�]�a�a�f�t�‚���•�—�—�­�ÊLêùŽûŽûªû¶ûÐûÛûèûüûüüË  $VóVóZógóióÌX&8ãBìBóB CC4C”P”[”g”q”t”v”y”{”~”ƒ”ˆ”Œ”š”Ø<“ž€M€MŽMœM¡M§M·M·M½MÚMàMÙ8%2×2×<×D×X×m×u×x×z×~×Ú”}žÂÔÂÔÙÔÛÔåÔüÔüÔ ÕÕ Õ$Õ(Õ/Õ6Õ?ÕVÕVÕ[Õ]Õ]ÕaÕcÕcÕgÕnÕnÕsÕƒÕ•Õ—Õ§ÕÛLQ`Ê´Ê´Ó´Ó´â´ñ´µµµ-µ1µ1µ6µÜ85?Ò£Ò£â£þ£ -¤¤¤¤"¤*¤ÝÔ,]£ £ « ³ Á Ô ã í ù !2NVbjrr}” ²Æø 1NPbkk}}‹’¤¤²²·»Þœ$FF FF"F1FOFhFhFtF…F�FœFœF©F»FÀFçFîFÿF GGGG.GNGhGmGrGßxv�$$'$1$7$C$S$V$Z$c$s$v$$‚$”$º$Â$Ë$Ë$Ñ$ý$%%%àD&¶ê¶ê¾êÆêÎêÖêÞêæêîêöêþêëëádav*¥*¥:¥J¥U¥Z¥g¥p¥t¥z¥€¥ˆ¥�¥œ¥¸¥»¥Æ¥Æ¥Î¥â@nz¦é¦éÀéÎéßéåéçéüé/ê5ê5êAêã<ÓAÓAóABB.BTBzB�BˆB�B™Bä(.4’£’£›£©£¸£Ç£Ì£å0*”*”8”P”ƒ”‰”‹”‹”‘”æDŒ™›”›”ǔՔà”ä”è”ì”ð”ü” • ••ç€ÏëC C N V a l w € – ª ³ Ç î  +   ) 4 kLš©#•#•?•F•M•Y•b•|•‡•Œ•••«•º•ĕĕٕl86X6XLXYXkX…X“XœX¦Xm$/4®ó®ó·óÈóöón4§°SpSpgpyp‚pœp£p¹p¿pÒpo0dl»T»TÃTÙTäTóT UUpPZjc“c“u“|“…“““˜“›“¡“¤“©“´“º“Ä“qd¦»>>WZhhq|�„”Ÿ¥¨«­±½rH<Jžõžõ®õ´õ¿õÈõËõØõáõáõåõèõðõs$@E..7EKPt4ÕÞnn|Š’�¶»ÂÈu¬LsŠ{Š{œ{«{±{Å{Ø{ï{||,|C|Z|q|Œ|�|—|�|¡|³|Ì|Ù|ß|ú|þ|} }}!}:}G}M}P}Z}v„c€8i8i[i_iliqiuiˆi©i³i³iÉiÕiÜiïiôiøi j,j6j6jJjJjMj[jwP–¦«o«oÁoÔoæoÿo p pp2p=pCpGpOpx(cc$c.c9cAcFcy0ltFFTcntvv|z<KV@x@xIxSxcxex˜xŸxŸxŸx¢x{˜ò^^dbrï |4ŠÓNÑNÑfÑnÑ|чыёїѥѺѿÑÅÑÜÑáÑçÑþÑÒ Ò Ò%Ò+Ò9Ò=ÒYÒlÒÒ„Ò“Ò Ò°Ò¿ÒÌÒßÒåÒìÒîÒÓÓ"Ó0ÓBÓBÓUÓWÓjÓlÓÓ�Ó”Ó”Ó°ÓÇÓÍÓÓÓÞÓÔ}Höóöóÿóôô)ô+ô-ô<ô<ôKôMôMôRô~`ÝñÓhÓhêhøhii ii,i7iBiDiIiKiLiLiVi(³¹³ö³ö¾öÒöãöåö€„èè#è.è>èMèYè}è}è…èŠèŠè®è½èÞèöèþèéé é éé%é%é7é<éCé�DÚçnñnñ~ñ„ñ“ñŸñ¦ñµñÁñÁñÇñ‚8ÛbÛbëbîbóböbc +c cccƒtcñcñsñ�ñ�ñ�ñ�ñ�ñ£ñ¥ñ¥ñ¥ñ®ñ¿ñÈñÙñäñçñéñìñîñîñîñüñ„DMZ+T+T@TNTNTVTlTpTpTtT|T…¤6[ˆ„ˆ„¢„ª„®„¶„„É„ЄÕ„ê„û„ÿ„ÿ„ ………/…2…;…A…D…F…P…U…l…o…q…x…|…Š…†81;æÚæÚôÚ ÛÛÛ!Û%Û%Û+Û‡$0u# # + ; K ] l u ƒ ‘ ˜ £ ¯ Ä Ò Ú ï ü !!3!=!R!\!q!{!�!ž!ž!¬!¸!Ä!Ø!ÿ!""+"7"C"T"i"~"�"™"«"½"Ï"á"#"#7#\#s#|#‹#¦#½#Æ#Ñ#Ø#ã#í#ö#$ˆ,–�“^“^—^¨^¸^½^Ì^‰02:+’+’?’J’\’d’g’o’мKv“d“d¯dÐdâdédódÿdeee%e2eVeeelese„e†eŽe™e¤e³eºe½e¿eÅeËeãeìeìeðe f‹,ÑØ–ú–ú¤ú°úÇúËúÍúáúŒD VpWpWŠW�W“WŸW¡W°W·W½WæWíWX!X%X=XIXfXoXoXoX|XµXÁXÍXÚXíXûX Y Y,Y=YTYZY¡Y³YàYçYZ ZZ4Z4Z@ZBZBZNZPZPZ`ZcZcZoZ{Z”Z Z©Z´ZÊZØZØZØZéZ[ [[[[`[�P,<¨�¨�È�Û�ç�ó� ŽŽŽ Ž%Ž'Ž@ŽŽ4#0H0H9HNHNH[HpHpHuH� ÌÐvúvú„ú�ú“ú�¼ +5XƒXƒvƒzƒ�ƒˆƒ•ƒ£ƒ¬ƒ¯ƒµƒ»ƒƒɃ˃ÕƒÚƒäƒòƒøƒ„„„„!„&„<„H„K„N„N„N„N„Q„Y„a„h„o„�„‘0HPvÿvÿ„ÿ’ÿšÿ½ÿÖÿþÿ’Ü�´`j`j†jŽjšj¯j¯jÅjÍjÝjìjìjñjkkk%k9k@kJkJk_k_kukƒk‰k‘kœkºkÄkÇkÊkÏkÝkókýkll ll/l9ldFd^d^dgd{d�d‹d§d«d–@!-ÃúÃúÑúÖúÙúëúñúôúöúüú—(âè‹s‹s¡s½sÏsÕsðs˜ %)nónóxó‹ó�ó™H/=JàJà_àkànàwàƒà‹à¨à·à½àÀàÌàš  +¦ò¦òªò·ò¹ò›ä{°zzz'zJzTzfzizqztzzz}z‰z›z¨z®z»zÆzËzÑzãzãzòzõzÿz{{ {-{3{@{K{P{V{h{h{h{h{s{s{�{œ ÑõSLSLrLtL…LŠL˜L¹LÇLÕLàLøLÿLMMMM M!M'M-M0M6M8MAMPMVMVMVM]MnM�@%šŸšŸ®Ÿ¼Ÿ¼ŸÉŸîŸùŸýŸ    žT…–VVz}‹‹Ÿ¯ºÀËËËÏÝŸ`p„¾¾Ûáïï&-=AAAEQ HøšÌšÌÁÌßÌíÌøÌüÌÍÍÍ#Í#Í%Í3Í¡D"/’‰’‰ ‰¬‰±‰±‰Â‰Ç‰Ç‰Í‰¢X{�ƒIƒIœI¬IÄIÐIÜIÜIîIôIôIJ JJJJ£,Úáss)sLs7s\sbsˆs¤8{… +Æ +ÆÆÆÆ<ÆHÆJÆJÆÎÆ¥8>HHIHIVI\IcIyIyI€IšI I¦<xƒ +¶ +¶%¶3¶:¶>¶A¶E¶L¶p¶€¶§`«¿226M²ËÚéîôö¨@ ÛùÛùöùúú ú ú,ú,ú<ú>ú>úfú©d2Çè7è7ó7 88.8?8N8[8j8~8–8®8Á8×8â8 9'9D9i9n9‡9œ9¼9Ó9ã9å9:r:C:A:‘:¢:©:É:Þ:ø:ø: ; ;>;E;�;�;ï;À;¾;<<<0<8<8<]<m<Ž<Ô<¡<©<”<ý</=7=7=W=l=�=—=®=¶=¡= +> +> +>>> >;>I>a>z>“>®>Æ>Ü>ô>? ? ? ?9?M?b?€?„?‚?Ò?à?ð?þ?@1@<@T@j@j@Á@’@�@à@î@þ@A1AGAIA“AdAbA²A²A»AÄAÙAÙAêAñABBBBBBª4 +â‚â‚ð‚õ‚ø‚þ‚ƒƒ ƒ«,sz°y°y´y¹yÃyÓyÓyþy¬T—¨¬d¬dºdÇdÔdòdõdüdeeee!e)e­Ô%VsGsG“G¡G¦G°G°G·GÅGÈGÏGÏGÖGäGçGëG÷G÷GH HH$H&H&H&H)H.H:H:HFH_HbHuHuHxH{H‹H®ÈÉ÷û#û#$$.$.$@$E$E$W$\$\$n$s$s$…$Š$Š$œ$¡$¡$¡$¡$¨$­$­$¿$Ä$Ä$Ö$Û$Û$ò$ %4%4%F%M%T%]%l%Ï%¯„a~fÜfÜjÜyÜy܈܈ܗܗܦܵܵÜÉÜÄÜØÜÓÜâÜâÜñÜñÜÝ\á°LtƒZ}Z}n}{}~}‚}�}›}¤}Ã}Ð}Ú}Þ}á}ó}±TÊÛæäæäôäûäå)å7åAåGåQåVådåjåmåså²¼žÉãã ã&ã4ã4ãQã[ãsãwã�ã“ã­ã­ãÀãÉãÔãÝãêãóãää ä(ä*ä0ä9ä?ädägää�ä ä¤ä¨ä³ä³ä·ä·ä·äàä³4RƒRƒ`ƒbƒgƒjƒmƒrƒxƒ´”"¨u¨uÂuáuíuvvv v#v/v@vMvSvVvYv\vavcvgvsv„v“v™vœvŸv¢v¢v¬v¯vÁvµP]mÎèÎè×èåèåèýèé"é;éWéféé›éœé¡é¶L–¥Š€Š€˜€¤€¯€À€Ô€Ø€æ€û€ ���-�C�·ˆSqþUþUVV%V%V1V9VAVLVUV]VbVdVhVwV‚VŠV’V“V“V�V¸Ü›Îûû(5@I_r‹Ÿ«»ÎÛî ".::GQaw�¥¾ÂÄÉÎ×éðð  5 ¹,z�®í®í²íéíîî +îº,fm‹‹‹‹#‹/‹3‹9‹»H´Â²�²�»�Ç�Ú�å�ý�ÿ�‚‚‚‚‚¼dÃØ"‚"‚+‚C‚N‚j‚l‚‚‚˜‚«‚Á‚Û‚ß‚½¬޵JJ7J9JSJbJ�J™JžJÍJÔJÖJÖJåJïJúJÿJKKK%K>KEKEKWKcKgKqK¾€0LcScSSŽS“S™S£S¨S¯S¾SÄSÄSÍSØSêSóSþSTTT T T T!T+T¿  .ó.ó8óKóPóÀŒ'F|¢|¢Œ¢�¢™¢´¢Â¢Ç¢Ê¢Ø¢Ý¢ü¢£.£2£R£T£\£†£Š£ª£´£»£Ñ£ì£¤$¤@¤G¤O¤Á´T}¶ ¶ Ô Û å ê ý   ( = B L V ` ^ n Œ ¦ œ ¶ À Ú þ   '-4;BIZ__×Âøµï[ž[žyžŠžŸž¥ž¬ž¬žºžÉžÐžÖžèžèžûž ŸŸ!Ÿ4Ÿ@ŸWŸYŸqŸsŸvŸxŸxŸ|Ÿ|ŸˆŸ�Ÿ�Ÿ“ŸžŸ¤Ÿ°Ÿ¸ŸÝŸóŸ  " ( + C Ã4&/SSS$S.SASISSSUSbSÄŒ4S6 6 ? a l } ‘ © ¾ Ó Ü á á ñ ú   # F V V V i n o ³ Å8ˆ’fîfîtî€î«î¸îºîÁîÉîËîÑîÆ€5[�[�{�‡�“�—�›�ª�¾�Æ�Ì�à�ï�û�‘ ‘‘‘"‘0‘4‘>‘B‘K‘Q‘d‘Ç$). H H®HµHÉHÏHÈ,‚‰¦Ë¦Ë¼ËÏËÚËàËãËëËɨ+pŒpŒŠŒ�Œ¥Œ°ŒÀŒÒŒÖŒäŒíŒ���!�,�:�D�L�P�P�P�S�U�Y�Y�^�l�z�ˆ�������¥�ÊLêùŽûŽûªû¶ûÐûÛûèûüûüüË  $VóVóZógóióÌX&8ãBìBóB CC4C”P”[”g”q”t”v”y”{”~”ƒ”ˆ”Œ”š”Ø<“ž€M€MŽMœM¡M§M·M·M½MÚMàMÙ8%*×*×4×<×P×e×m×p×r×v×Ú”}žºÔºÔÑÔÓÔÝÔôÔôÔÕÕÕÕ Õ'Õ.Õ7ÕNÕNÕSÕUÕUÕYÕ[Õ[Õ_ÕfÕfÕkÕ{Õ�Õ�ÕŸÕÛLQ`´´Ë´Ë´Ú´é´ú´þ´µ%µ)µ)µ.µÜ85?ʣʣڣö£¤¤ +¤¤¤"¤ÝÔ,]› › £ « ¹ Ì Û å ñ ü  +*FNZbjjuwŒ˜ª¾ð)FHZccuuƒŠœœªª¯³Þœ$FF FF"F1FOFhFhFtF…F�FœFœF©F»FÀFçFîFÿF GGGG.GNGhGmGrGßxv� $ $ $)$/$;$K$N$R$[$k$n$w$z$Œ$²$º$Ã$Ã$É$õ$ú$% %àD&¶ê¶ê¾êÆêÎêÖêÞêæêîêöêþêëëádav"¥"¥2¥B¥M¥R¥_¥h¥l¥r¥x¥€¥ˆ¥”¥°¥³¥¾¥¾¥Æ¥â@nz¦é¦éÀéÎéßéåéçéüé/ê5ê5êAêã<ÓAÓAóABB.BTBzB�BˆB�B™Bä(.4УУ“£¡£°£¿£Ä£å0*”*”8”P”ƒ”‰”‹”‹”‘”æDŒ™›”›”ǔՔà”ä”è”ì”ð”ü” • ••ç€Ïë; ; F N Y d o x Ž ¢ « ¿ æ ü   -& -B -N -Y -q -| -ƒ -Ž -“ -§ -è8gq;; ;;$;1;3;@;@;C;éLÁÐÓKÓKíKLLL!L0L>L>LALLLêˆús�s�‰���ª�¼�¼�Î�Ù�ï�ï�ÿ������$�(�0�4�<�B�H�H�K�Y�ë|Ò¿Ò¿ä¿ó¿ö¿À:ÀJÀsÀƒÀ�ÀÀÀÏÀÜÀìÀòÀÁÁÁÁÁÁ,Á2Á5Á™Áì8 òžòžŸ ŸŸ9ŸOŸRŸ]Ÿí?è�è�ñ�ý� ��+�<�M�^�s�z��� �²�º�Û�ï�ò�ú� -‘‘B‘U‘g‘œ‘ž‘¥‘¶‘‘ɑڑè‘û‘’9’îH=KHŽHŽbŽuŽŽŽ£Ž©Ž¯Ž¯Ž·Ž¹ŽåŽïL \KjKjSj^jpjvj~jˆj«j«j½jÊj×jßjíj(k6knksksk…k’kŸk¤k³kèkïkll l ll*l7lL>LALLLêˆús�s�‰���ª�¼�¼�Î�Ù�ï�ï�ÿ������$�(�0�4�<�B�H�H�K�Y�ë|ʿʿܿë¿î¿À2ÀBÀkÀ{ÀˆÀ¸ÀÇÀÔÀäÀêÀúÀúÀ ÁÁÁÁ$Á*Á-Á‘Áì8 êžêžøžŸŸ1ŸGŸJŸUŸí?à�à�é�õ���#�4�E�V�k�r�…�˜�ª�²�Ó�ç�ê�ò�‘‘:‘M‘_‘”‘–‘�‘®‘º‘Á‘Ò‘à‘ó‘ÿ‘1’îH=K@Ž@ŽZŽmކޛޡާާޝޱŽÝŽïL \KjKjSj^jpjvj~jˆj«j«j½jÊj×jßjíj(k6knksksk…k’kŸk¤k³kèkïkll l ll*l7l°Q°f°n°q°‰°™°ž°ž°¦°¦°É°É°É°Í°Ï°Ï°Ó°Õ°Õ°Ù°Û°Û°ß°ß°ß°â°ä°ä°ç°ì°ò°õ°ù°û°±±±0±5±;±>±C±V±q±s±‰±‰±‰±Ž±Ž±�±�±•±˜±¾±¾±¾±Ö±Ü±ó±²²&²8²]²b²b²z²˜²�²�²µ²Ó²Õ²Õ²í² ³ ³ ³#³?³?³]³i³n³n³†³�³¢³¢³º³Ö³Û³Û³ß³÷³´´´´ ´7´U´Y´Y´w´|´|´”´«´²´·´·´Ï´æ´í´û´ µ/µ6µ8µ8µFµNµwµyµyµ‘µ²µÑµÖµÖµîµ¶%¶¶=¶\¶}¶€¶…¶…¶�¶´¶¾¶Ã¶Ô¶Ô¶Ú¶å¶ú¶ÿ¶ ···O·]·c·z·‚·‹·‹·—·›·›·¤·³·¼·¼·Å·Ï·ë· ¸&¸5¸;¸P¸X¸d¸n¸n¸†¸ˆ¸“¸«¸­¸Í¸Í¸Ò¸Ò¸¹¹ ¹ ¹+¹/¹/¹8¹G¹P¹P¹Y¹_¹{¹†¹ž¹ ¹«¹Ã¹Å¹á¹á¹á¹ñ¹ººº,ºCºHºHº`ºwº�º†ºœºœº³º³º¿ºÃºÉºÒºáºêºêºóºþº»»4»?»Z»\»\»e»}»ˆ»ž»«»³»Ô»Ö»Þ»ø»û»¼ ¼*¼4¼4¼O¼Y¼d¼€¼“¼ª¼²¼¼¼¼¼Å¼É¼à¼½#½#½#½7½@½D½[½“½“½•½•½±½»½Ã½Ã½Ì½Ð½ç½ ¾0¾6¾M¾U¾b¾g¾g¾p¾t¾‹¾Ã¾Ô¾Ý¾â¾â¾í¾ñ¾ ¿ ¿*¿/¿E¿]¿]¿‡¿‘¿‘¿®¿²¿Å¿Í¿Ô¿ß¿ä¿ë¿ë¿ð¿#À7ÀUÀlÀvÀ€À€À�ÀºÀÊÀÜÀèÀìÀÁÁ$Á(Á(Á(Á(Á,Á1Á1Á<Á@ÁXÁoÁyÁ~Á”Á¬Á¬ÁÖÁàÁ   ÂÂÂ1ÂHÂRÂWÂmÂm……·ÂÁÂÞÂåÂðÂõÂà Ã@ÃRÃZÃ\ÃuÃàððÃÝÃßÃ Ä Ä'Ä2Ä<ÄFÄMÄjÄsÄsĠĸĻÄÖÄÖÄÖÄÛÄàÄÅ'ÅEÅ\ÅaÅkÅuŢŶŹÅÐÅÐÅÐÅÐÅÚÅðÅÆÆÆÆ.ÆEÆOÆ_Æ_Æ{Æ�ƒƤƮƴÆËÆÓÆÜÆáÆáÆáÆýÆÇÇ&Ç8Ç=Ç=ÇUÇlÇvdždžǢǶǹÇËÇÕÇÛÇòÇúÇÈÈÈÈ$È8È;ÈMÈ_ÈdÈdÈdÈ|È“È�È­È­ÈÒÈãÈíÈóÈ -ÉÉÉ É É ÉEÉVÉhÉmÉmɂɂɂɞɞɸɿÉüÊ0EMšØšØ£Ø¶Ø¼ØÈØÑØÞØãØ|„Ÿжж§¶©¶·¶·¶Ŷض·#·1·A·d·L·~·ž·³·¸·¸·¸·Ê·Í·Ù·8Ž˜ÛÛ)Û7ÛHÛLÛLÛQÛQÛWÛ¨ºàóöóö ÷ ÷÷-÷5÷<÷@÷H÷X÷f÷u÷{÷ƒ÷�÷•÷•÷œ÷ ÷ ÷¢÷ñø4GP²’²’Æ’Ü’ç’ì’ú’““!“ˆTrcc|†–žÌáò+÷q�’�§´¾ÌÒÞåó70-5»»¿'ÙQˆ˜¤Æ‹g‹g£g²gÀgÐgÖgÖgágìgïgôgþg hhh h&h,h/h8h9h9hEhGhSh X7‰ÏÏ4Ï:ÏAÏQÏXÏ`ÏfÏmσϑϕϚϠϮϱ϶ϹϹÏÉÏÚÏÜÏîÏðÏýÏÐ Ð ÐÐÐÐ*Ð;Ð>Ð@ÐLÐNÐnÐsÐzЃЉÐ�ЖЙЙЩкмÐçÐ Ñ ÑÑÑ Ñ Ñ4Ñ8Ñ8ÑNÑ -@¨´+_+_A_c_k_p_ƒ_�_–_™_¡_ 0súsú|ú�úŠú�ú�ú•ú ,;B¢©¢©±©½©Ë©Ô©Ù©ß© ä6.Í.ÍLÍOÍRÍfÍnÍu͉͎͌ͱͱʹÍÄÍÆÍÆÍÉÍËÍËÍÎÍåÍúÍÎ Î)Î1Î1Î1Î3Î3Î8ÎWÎ]ÎlÎ|Î�Π΢δÎÄÎÉÎÉÎÕÎÕÎâÎåÎåÎÏ8ürÞrÞ�ÞŠÞ™Þ·Þ»ÞÁÞÃÞÃÞÉÞô…¾Ô¥Ô¥æ¥é¥ó¥¦¦ +ÉÉÉ É É ÉEÉVÉhÉmÉmɂɂɂɞɞɸɿÉüÊ0EM’ؒ؛خشØÀØÉØÖØÛØ|„Ÿ‚¶‚¶Ÿ¶¡¶¯¶¯¶½¶жø¶·)·9·\·D·v·–·«·°·°·°··Å·Ñ·8Ž˜ÛÛ!Û/Û@ÛDÛDÛIÛIÛOÛ¨ºàëöëö÷÷÷%÷-÷4÷8÷@÷P÷^÷m÷s÷{÷‡÷�÷�÷”÷˜÷˜÷š÷éø4GP²’²’Æ’Ü’ç’ì’ú’““!“ˆTrcc|†–žÌáò+÷q�’�§´¾ÌÒÞåó70-5»»¿'ÙQˆ˜¤Æ‹g‹g£g²gÀgÐgÖgÖgágìgïgôgþg hhh h&h,h/h8h9h9hEhGhSh X7‰ÏÏ4Ï:ÏAÏQÏXÏ`ÏfÏmσϑϕϚϠϮϱ϶ϹϹÏÉÏÚÏÜÏîÏðÏýÏÐ Ð ÐÐÐÐ*Ð;Ð>Ð@ÐLÐNÐnÐsÐzЃЉÐ�ЖЙЙЩкмÐçÐ Ñ ÑÑÑ Ñ Ñ4Ñ8Ñ8ÑNÑ +@¨´+_+_A_c_k_p_ƒ_�_–_™_¡_ 0kúkútúyú‚úˆúˆú�ú ,;Bš©š©©©µ©é̩ѩש ä6.Í.ÍLÍOÍRÍfÍnÍu͉͎͌ͱͱʹÍÄÍÆÍÆÍÉÍËÍËÍÎÍåÍúÍÎ Î)Î1Î1Î1Î3Î3Î8ÎWÎ]ÎlÎ|Î�Π΢δÎÄÎÉÎÉÎÕÎÕÎâÎåÎåÎÏ8üjÞjÞyÞ‚Þ‘Þ¯Þ³Þ¹Þ»Þ»ÞÁÞô…¾Ô¥Ô¥æ¥é¥ó¥¦¦ ¦ -¦¦¦¦ ¦&¦,¦3¦9¦@¦F¦M¦S¦Z¦`¦g¦m¦t¦z¦‡¦�¦”¦�¦¥¦¥¦®¦¯¦À¦Ó¦Õ¦å¦ì¦÷¦§ §§#§.§.§8§LWf¨x¨x±xÁxÁxßxåxõxûxyyyyy:yhÝó“Ž“Ž¨Ž·Ž¼ŽÌŽÔŽÔŽâŽìŽûŽ���*�5�;�F�I�Q�D<I.Û.ÛBÛ^ÛlÛ|Û~Û€Û‹Û�Û�Û—Û°2Z›ï›ï¦ïªïÎïÙïèïôïð'ð/ðGðWðwðwð›ð�ð�ðÁðÃðÃðÏðÏð×ð×ðãð÷ðÿðÿðñññ*ñ7ñCñgñP„”ú}ú} ~~~!~3~3~3~5~G~N~~›~œ~¢~0�•[o[oqo„o–oœoŸo§o<al 19=INRX\ÉÜ-@S^rƒ¥Çâý3Ni„@Tct’Ù’Ù Ù²Ù¼ÙÆÙáÙçÙéÙôÙÚÚ6Ú<Ú<Ú<Ú<ÚBÚX£µYvYvyv†v‹v—v·v½vÊv×vÞvçvëv÷v,’™ŽÌŽÌ¢Ì´Ì¹ÌêÌ'Íä6ƒ˜ƒ˜�˜ ˜£˜©˜½˜Ä˜Ç˜â˜ì˜ñ˜ø˜ý˜ý˜™™™3™?™S™\™d™u™u™u™~™…™“™•™ ™¦™Å™Õ™Ý™ï™ø™ šš#š&š&š&š&š2šuš  Hàeàefff&f1fEfXfcfof€f…f‘f–fšf£f¼fÈfÈfãfõfgg+g1gUg]g]gigmgqg‰g—gÂg�gÑgÜgóg÷ghhhh h?hDhDhPhVh\h^hnh Ko[á[áoáá“á á¤á­á´áºá¼áÏá×á!âüááá1â@âRâYâhâzâ�â�â¡âÁâËâ£ãLâÎâÎñÎùÎùÎÏÏ$Ï,Ï2Ï7Ï=Ï?Ï?ÏEÏ <{†Â…Â…Ð…é…ô…û…%††3†€† ”Õör€r€œ€­€¿€É€Ù€á€å€é€í€õ€ý€��'�,�<�E�Z�`�d�v�! GKR{R{a{~{„{"ä6è耀€%€C€C€E€L€L€]€d€q€„€�€™€œ€¡€±€Ì€Ì€â€ä€ä€ú€ü€ü€���.�4�7�7�:�?�G�X�_�e�v�y�–�–�›�›�›�¶�#lªª—ª—¾—Ú—ê—ê—þ—˜ ˜˜˜.˜0˜D˜M˜Q˜`˜s˜y˜€˜�˜’˜�˜Ò˜Þ˜ê˜ò˜ü˜ -™™.™;™L™_™e™¬™¾™Ì™â™ñ™ü™š š š,šPš\šgšnštš{š„š‡š®š$4Yb2Ù2Ù;ÙCÙOÙ`ÙkÙsنًÙ% ‹¯===$=$=3=?=F=L=L=V=_=_=e=i=l=v=�=�=�=™=™=¤=©=¬=¯=²=µ=¼=¼=¼=¼=¼=Ê=& öúòò"ò/ò1ò'¤�ô(|(|>|J|R|c|g|{|�|›|­|²|¸|½|Ô|Ý|õ|}}} },}<}N}N}R}X}`}j}j}n}r}�}‘}•}º}º}É}Ë}Ñ}Ù}ë}~ -~~~~*~*~8~A~A~P~~~‚~…~‰~�~›~±~Æ~Õ~ä~ï~ñ~÷~ -$$+DIQYbirá(,k‘k‘t‘�‘•‘•‘š‘)„†ãДДØ”ð”ý”•• ••••3•T•e••Œ•••š•Ÿ•¤••­•Ò•וß•ý•ý•–––"–'–0–5–:–J–x–­–²–¼–É–Ó–á–ï–þ–þ–%—*—/—4—U—S—c—o—†—�—–—¢—®—ЗЗ×—Þ—ã—ê—ó—ô—ý—˜·˜*(éïósós t t+t1t9t+Âʮʮخà®å®ë®¯6¯>¯F¯Q¯V¯l¯y¯‚¯‡¯¶¯½¯ůÓ¯Ú¯°° ° °/°P°X°k°{°‹°›°ª°º°ʰÚ°ô°ù°±±±±#±D±O±^±n±~±ޱ¨±¨±¨±´±º±,(ÄÊS>S>\>c>ƒ>Š>�>-°Ï÷ËË,Ë9ËFËRËYËbËuË�Ë•Ë�˺ËÀËÀËÏËÖËÛËùËüËÌÌ-Ì0Ì0Ì0Ì<Ì]ÌbÌeÌkÌkÌñ̠̋̎Ì.4ž§Ó^Ó^×^è^ø^ ___'_/p !éyéyýy -zzz!z(zDzzzƒzŒz˜z0†ÄÚÆÚÆþÆÇÇÇ,Ç3Ç3Ç;ÇMÇVÇvÇ{ǔǛǛǰǼǼÇãÇæÇÈ$È0ÈFÈ\È^ÈjȀȖȵÈÔÈàÈöÈ ÉÉÉ3ÉIÉIÉQÉ[ÉgÉ}ɓɟɵÉËÉÕÉÝÉäÉúÉÊÛÊ18u~~Œ›¥¶¾ÀÀÆ280:"©"©+©S©v©‚©�©™©ž©3,µ¼£_£_¬_µ_È_Î_Ó_40 ƒ ƒ.ƒ8ƒLƒRƒTƒZƒ5,8?ÖÖêü !'6,ÀeÀeÉeÔeÖeÖeÛe7\m€ZZ|€Œ�©²ÑÝæìðþ8€``$`+`>`J`q`{`…`�`•`�`©`»`Í`ç`ó`ü` -aaaa a(a9¬ F›ä›ä£ä§ä³äÃäÎäÝäéäòäå0å<åDåbåmåŒåŒå³åµåµåµåÎåÐåÐåÐåèåèåúåææææ/æ6æ6æHæNæXæ:X½Ó_Ó_ß_è_ñ_÷_````#`+`9`D`L`e`w`„`�`�`’`—`¥`¬`±`±`·`¾`Ã`Ï`×`à`à`è`÷`û`aaa$a$a-a4a@aKagagagaoava}a„a‹a’a™a a§a®a´a½aÃaÖaçabbbb;|Kföõöõö#ö3ö?öEöNöUö\öaömöqö{ö{ö‚ö…ö‹ö‹ö•ö£öªöªöªö¸ö<,££»Æì=0ËÓJœJœ^œ�œ¤œªœ·œÊœÖœ>àÈüss{›ª´½ÎÞñþ/8EQ]]jtš­Ìßßÿ A-RWimuuƒŽœ£®¼¼ÁÍ?LRaœ¤œ¤©¤±¤´¤Â¤Å¤Ì¤Ð¤Ó¤×¤å¤ì¤ñ¤@8GQT¤T¤a¤i¤l¤z¤~¤Œ¤�¤•¤A0ÖÖßäó÷ùþBPáñóøóøýøù#ù+ùßùC(MS++3AS\^D0ÔÜڜڜîœ-�4�:�R�U�a�Eœ'J‹c‹c¥cÆcØcßcécõcýcdd d/d8d?dCdCdIdOdgdpdvdd„d„d„dˆd’dF°Owðcðcdd'dBdPdWdddgdkdud‚d¢d¢dÀdÂdÂdàdâdâdòdòdee&e0e4eMeOete}e…eŒe¿eG<#"¨"¨0¨8¨@¨P¨\¨f¨•¨—¨�¨HH?M99 969M9t9¡9È9Ï9Ö9á9ñ9:: :IZšÁšÁ®ÁµÁÅÁÌÁÌÁâÁîÁÂ4ÂSÂ_ÂsÂwÂ}‹Â�•£££ÂÂÂáÂõ ÃÃÃ%Ã)Ã/ÃAÃAÃAÃAÃDÃIÃNÃTÃhÃlÃrÃ}Ã�ÇÒÒÒ×Ã�Ã±ÃµÃ»ÃÆÃÊÃÐÃÙÃÙÃÙÃÄJ¬Ð÷ú¹ú¹º!º*º*º6ºEºRºVº`ºvºvº†º’º—º—º°º»ºúȺÚºÚºÚºâºðºþº» »»»*»*»<»K� ?àFàF GGG'G'G>GOGfGkG~G‹G�G”G¥GÏG×GÛGàGèGúG H HFHLHVôVô_ôtô}ô‰ô‹ô�ôœôœô«ô­ô­ô²ôM˜6˜¸R¸RÙRÜRßRüR S'S2SASKSaSiSoS|SŒS S¥S´SÇSçSñSçSTTTT T!T!T1T1T?TPTUT�T¨T¨T°T³TÙTáTçTôTUUU,U?UbUnU�U¡U¯U¡U¼UÁUÏUÁUÜUáUáUñUñUVVVFVHVmVmVuVxV†V‹VžV©V¸V¸VÁV;WN0 «í«í¹íÃíÉíÒíÙíÝíãíO(�•J€J€V€\€b€{€†€PÀw£ f f5f8fTfffmfwfƒf’f–fšf¢f¬f»fÄfÝfÝfäfêfñfþf ggg g"g(g.gFgOgOgVgqgtg†gQ<ƒŽÐ/Ð/â/î/00)0:0<0h0R@ +KéKéYéaé}é}é‚é‚é�é�é›é›é¤éS¼E¼¼ؼà¼ê¼ö¼½½<½_½n½™½�½¥½¯½×½ú½¾¾#¾N¾^¾c¾k¾–¾š¾¬¾±¾¾¾ȾÖ¾Ö¾à¾ê¾T@nz3I3I;I\I`IsI|I€I‚IU b(+(+3+7+?+`+m+~+‰+’+¨+»+Ô+è+ô+ ,,/,7,X,m,x,‚,§,¬,¶,È,á,ð,ý,- ----E-I-N-N-_-_-r-„-—-­-¯-¯-Â-Ê-Ê-Ê-Ü-Ü-å-÷-þ-þ-..B.V4ºÃ³=³=½=½=í=>?>M>Q>W@.: û ûûû!û3û9û<û>ûDûXèÎ¸Š¸ŠÒŠêŠöŠ‹‹‹ ‹(‹+‹<‹<‹<‹C‹P‹S‹X‹U‹²‹É‹Ì‹΋å‹è‹ê‹ò‹ŒŒ ŒŒ(Œ8ŒFŒOŒVŒ[Œ[Œ[ŒaŒuŒYD ¼¼&¼N¼q¼~¼‹¼–¼²¼º¼¼Z ‰�$3[8îøžž ž&ž/ž5ž;žDžGžMž\hRhss%s'sÎEÎgÎjÎjÎmÎxÎΆÎ` ë“@“@¡@¦@®@¶@Ã@Õ@ß@ä@ö@ A!A7AMA_AfAfA|A‰A‰AŸA®A®AµA¼AÃAÈAÐAa@ÚÖÚÖéÖñÖ××× ×$×*×,×,×2×bØ&X" " 8 G R d { { Œ ¤ ± Ä РÛ ë  ¡¡,¡9¡9¡9¡J¡v¡}¡†¡Œ¡“¡™¡ž¡¤¡¨¡¯¡º¡À¡ê¡c Uyfìfìoìì�ì±ìÃìÅìæìøìøì íí%í=íDíDíEíEíSí^íjílíxíƒí“í›í®ídüf¡è[è[\ \\$\0\E\J\S\Z\h\v\Œ\Œ\�\”\ž\ž\¨\«\Á\Ù\Õ\ç\ì\ -]#],]/]2]7][]]]y]s]¥]¥]¹]Í]Ô]Ú]Ý]â]ò]ù]ü]Ï^e”¢ÃÐ^Ð^è^ê^ø^__._7_P_U_k_g_w_—_—_®_°_°_Ç_É_É_Ù_Ù_à_à_è_A`f Vzcëcëkëvë†ë•ë¡ëÅëÅëÚëâëçëçëôë -ììì&ì8ìeìqì„ìŒì‘ì‘ì�ì�ì¯ì¶ì¶ìÈìÍìÔìgDNH`H`\`^`n`|`†`ª`Î`Ö`è`ö`aaa-a5a:aSasasa”a–a–a·a¹a¹aÉaÉaÑaÔaÙaïa÷aüab8bDbgbgbˆbŠbŠb«b°b°bÀbÀbÍbÐbÕbîbúbcc&c*c6cDcMcacuc|cƒc†cîchðå((6(9(<(F(T(_(w((‰(¯(¼(Ç(Ù(î(ÿ( -)7)<)B)l)v)|))Œ)—)©)¾)Ò)Ú)** *.*3*G*_*v*�*¨*¾*Ð*Ð*ü*++'+i<5@úƒúƒ„!„(„-„8„M„P„U„a„j0 ¸G¸G¼GÐGÐGäGèGìGk\Qd"“"“2“4“?“D“W“`“e“j“z“‡“‡“�“˜“lŒc‚H.H.S.[.f.q.|.….›.¯.¸.Ì.ó. /#/+/A/I/g/s/~/–/¡/¨/³/¸/Ë/mx…Ÿcýcýý„ý‡ý”ýšý�ý¥ý®ý½ýÅýÅýÐýÐýØýÚýÚýáýäýðýn0 š“š“¨“²“ɓϓѓדoLZiP�P�h�j�t���«�­�Â�Í�Ó�è�px5RR.RKRRR^RmRsRwRŒRšR¢R¨R«RµRq¨7]¸�¸�Ü�ç�ï�þ�‚‚‚‚8‚8‚F‚M‚S‚Z‚b‚p‚v‚x‚ˆ‚ˆ‚�‚•‚œ‚¤‚²‚¸‚º‚º‚Ê‚ ƒr.o£Z£Z½ZËZäZïZ[[%[:[J[Q[b[m[|[‡[£[£[§[²[¾[À[À[À[Æ[Æ[É[Ó[Ó[î[û[û[\\#\)\2\<\L\`\ˆ\™\¤\¤\¶\¶\¶\Ì\Ü\ó\ü\]]]]]]1]s,07Ò‰Ò‰Û‰å‰æ‰ë‰t¬ -1ãíãíîíòíî!î0î<îHîgîî�î¯î¯îÐîÒîÒîóîõîõîïï ï ïï)ï1ï1ïCïJïJï\ïiïuïyï™ïup ÊÞÊÞÛÞçÞõÞß ßßß+ß1ß1ß>ßJßg߃߃߃߉߉ߙߛߛßÃßv˜9[³C³CÃCÍCÒC×C×CæCëCD DDDDD'D2D4DCDEDQD[DiDnD}D„D†D†D†DŒDw$‚‡îîî îUîaîx<7B{š{š�š�š«š³šÃšÊšÌšÔšy,HHH(H,H,H0HzDu‚;;?Oegx„‰�¢¢¤{, -ðGðGôGH H HH|h@–HHHHSH^HnHvH—H¦H·HÀHÔHìHüHI I'IHI]IhIrI—IœI¦I³IÅIÞIíIíIJ#J-JJJUJ]JxJƒJ˜J¡J»JÊJÖJßJäJKKK-K)KCKNKVKaKaKaKlKlK}K}K�K¢KµK¾K¾KÑKáKéKéKéK÷KL LLL)L-L4L}Lp3]3]<]A]H]H]g]Š]‘] ]¯]´]¶]¸]¸]~ˆ£Á²­²­É­Ì­έÜ­ë­ë­®6®A®P®`®l®n®{®’®�®Ÿ®¥®§®§®§®¬®µ®¹®¼®Æ®øQxp–p°pÊpÎpàpépòpùpq q#q2qJq]qfqoq}q•q¨q±qÅqÉqÏqØqÞqéqëqîqöq r r#r.r4r([(x(•(²(Ï(ì( )&)C)`)})š)´)Î)è)****)*‘,ƒ< -Ú“Ú“î“ý“ ”””””%”„(¾ò¾òÈòÒòüòó…$jj-jIj†, R¦T¦T¾TÀTÌTÌTØTåTòTúTÿTUU UU)U9UDUIUIUPUPU[U[UzUˆU“U•U›U�UŸU¡U¡U¬U®U¶U¼U¾U¾UÊUÔU×U×U×U×UâUâUêUîUúU‡P¨¸Û1Û1ß1î1ó1ÿ1 22 2,23282I2`2x2z2ˆX�¢ú¬ú¬­­­­E­h­s­‘­¢­¤­¤­¬­‰,Š‘îËîËÌÌÌJÌṖ̊x³Í&ð&ð5ðBðQðWð^ðvð…ðŒð±ð·ð½ðÄð×ðëðõðùðññ#ñ#ñ1ñ‹8¶ÀsKsK�KœK¡K·KºKÏKŒ(¿Å<§<§D§N§d§�8‘›%%)%1%9%Z%p%y%%ŽP:JÀwÀwØwäwìwówüwxxxx&x,x/x;x�ð8p¤©¤©¾©Î©Õ©Ý©ä©ªªª!ª*ª3ª5ª>ªGªIªIªRªaªcªcªlªuªzªzªƒªŒª‘ª‘ªšª£ª¨ª¨ª¨ª±ªºª¿ª¿ªËªÔªÙªðªôªôª««««"«”«�XÚì:Ý:ÝBÝNÝYÝhÝtÝ}݅ݔݰÝáÝáÝóÝúÝúÝ Þ ÞÞ‘ÈØ 8 8(8.888;8;8D8O8Y8c8o8q8w8~8�8„8Œ8˜8ž8£8©8¬8®8¹8¿8Å8Î8Î8Ö8ß8å8î8î8î8î8ô8ü8ÿ89’,™ ZÛZÛcÛoÛwÛ|Û�Û“8ak(3;==C”,Ûâò‡ò‡û‡ˆˆ ˆ•4ÐÙ³r³rÇrÙrèrùr sss–$(-b£b£p£x£Š£�£—<@K*¤*¤@¤J¤N¤S¤_¤d¤h¤l¤v¤˜ óó -ó*ó,ó™t2ê²ê²ú²³³ ³H³k³z³‡³›³’³¼³гÖ³سÚ³à³â³ï³ò³ú³šÜø+K K S W b p y � £ ­ ¹ Ä Ò á   6 : S k z ~ ‰ •   ¯ ¾ Þ ì û ' 4 8 E W W e l ~ ~ Œ Œ � ¡ ›haw:µ:µ\µbµkµkµtµƒµ�µ¿µʵÒµÔµæµæµæµ÷µ¶¶¶œ@y…ˆ”ˆ”Œ”�”œ”¥”«”¯”³”É”ΔД�<ðûC C X G g � ž€ ¼Ú·Ú·ø· ¸¸$¸6¸A¸L¸b¸n¸„¸š¸¢¸¢¸ñ¸ö¸ö¸¹¹0¹P¹W¹y¹Ÿ€›^á^ágájá�á�á˜á¬áÊáÌáäá÷áââ*â*âAâUâsâuâ�â â â£âüâ 8—¡d]d]z]ƒ]�]˜]¡]¤]®]¡47@œ:œ:°:Ì:Î:Ù:Û:Û:ã:¢hqÇ”«”«²«Â«É«Ñ«Ø«ô«ø«¬¬9¬9¬9¬B¬D¬D¬M¬O¬O¬X¬Z¬Z¬c¬e¬e¬n¬p¬p¬y¬{¬{¬„¬†¬†¬�¬‘¬‘¬š¬š¬�¬¢¬¢¬¢¬¥¬¨¬±¬Ë¬Û¬ò¬­­ -­ ­­­ ­ ­(­(­-­-­6­C­H­H­Q­e­h­m­m­v­v­„­ˆ­c®£ ¢¦´]´]½]Ê]Ï]¤`UiÓPÓPóPþPQQQ"Q/Q5Q5QAQ¥0[cƒTƒTŒTšT T±T³T³T¸T¦(‹‘ ] ] ]+]4]7]?]§8LV’„’„¢„¥„§„¬„µ„¸„½„Å„¨ €„ÆÆÊÙÝ©DT_T_h_z_�_…_ˆ_“_›_¯_²_º_ª€£ã£ãÁãÐãçãùãäää ä"ä0ä<ä?äBäNäSä\äaähä�ä�ä—ä«h²Èöö/9Mc‡¡¡·Úôô¬X=O®ë®ë¸ëºëÏë×ëøëÿë ì ì#ì,ì0ì4ì­\r…ˆ†ˆ†ž†¥†´†»†ĆĆÞ†é†ñ†‡‡‡ ‡ ‡=‡®� )5555]5…5­5»5þ5A6„6†6”6¢6°6°6Ê6ä6ö67747F7V7k7„7‹7’7®7Ê7Ö7¯PAQä:ä:;; ;);/;4;R;T;b;h;k;y;°lXo66WZhht{€ƒ‰Œ”™™ž¡£§·±ˆ;Ys’s’|’†’†’–’£’¬’µ’¾’Ç’Û’Û’æ’ì’î’ý’“““&“F“F“H“X“^“c“² @èsèsðsüs$t8t¯I¯N¯d¯q¯z¯¯®¯µ¯½¯˯Ò¯ø¯ø¯°°'°H°P°c°s°ƒ°“°¢°²°°Ò°ì°ñ°ù°ù°þ° ±±<±G±V±f±v±†± ± ± ±¬±²±,(ÄÊS>S>\>c>ƒ>Š>�>-°Ï÷ +Ë +Ë$Ë1Ë>ËJËQËZËmˇË�˕˲˸˸ËÇËÎËÓËñËôËýËÌ%Ì(Ì(Ì(Ì4ÌUÌZÌ]ÌcÌcÌfÌ{̘̃̆Ì.4ž§Ó^Ó^×^è^ø^ ___'_/p !éyéyýy +zzz!z(zDzzzƒzŒz˜z0†ÄÒÆÒÆöÆ ÇÇÇ$Ç+Ç+Ç3ÇEÇNÇnÇsnjǓǓǨǴǴÇÛÇÞÇýÇÈ(È>ÈTÈVÈbÈxÈŽÈ­ÈÌÈØÈîÈÉ ÉÉ+ÉAÉAÉIÉSÉ_ÉuɋɗɭÉÃÉÍÉÕÉÜÉòÉûÉÓÊ18u~~Œ›¥¶¾ÀÀÆ280:©©#©K©n©z©‡©‘©–©3,µ¼£_£_¬_µ_È_Î_Ó_40 ƒƒ&ƒ0ƒDƒJƒLƒRƒ5,8?ÖÖêü !'6,¸e¸eÁeÌeÎeÎeÓe7\m€ZZ|€Œ�©²ÑÝæìðþ8€``$`+`>`J`q`{`…`�`•`�`©`»`Í`ç`ó`ü` +aaaa a(a9¬ F“ä“ä›äŸä«ä»äÆäÕäáäêäÿä(å4å<åZåeå„å„å«å­å­å­åÆåÈåÈåÈåàåàåòåúåæææ'æ.æ.æ@æFæPæ:X½Ó_Ó_ß_è_ñ_÷_````#`+`9`D`L`e`w`„`�`�`’`—`¥`¬`±`±`·`¾`Ã`Ï`×`à`à`è`÷`û`aaa$a$a-a4a@aKagagagaoava}a„a‹a’a™a a§a®a´a½aÃaÖaçabbbb;|Kföõöõö#ö3ö?öEöNöUö\öaömöqö{ö{ö‚ö…ö‹ö‹ö•ö£öªöªöªö¸ö<,››³¾ä=0ËÓBœBœVœ•œœœ¢œ¯œœΜ>àÈükks“¢¬µÆÖéö '0=IUUbl’¥Ä××÷9%JOaemm{†”›¦´´¹Å?LRaœ¤œ¤©¤±¤´¤Â¤Å¤Ì¤Ð¤Ó¤×¤å¤ì¤ñ¤@8GQT¤T¤a¤i¤l¤z¤~¤Œ¤�¤•¤A0ÖÖßäó÷ùþBPáñëøëøõøùù#ù×ùC(MS++3AS\^D0ÔÜҜҜæœ%�,�2�J�M�Y�Eœ'J‹c‹c¥cÆcØcßcécõcýcdd d/d8d?dCdCdIdOdgdpdvdd„d„d„dˆd’dF°Owècècdd d:dHdOd\d_dcdmdzdšdšd¸dºdºdØdÚdÚdêdêdeee(e,eEeGeleue}e„e·eG<#¨¨(¨0¨8¨H¨T¨^¨�¨�¨•¨HH?M99 969M9t9¡9È9Ï9Ö9á9ñ9:: :IZ’Á’Á¦Á­Á½ÁÄÁÄÁÚÁæÁ Â,ÂKÂWÂkÂoÂuƒ‡Â�›››ºÂÙÂíÂà ÃÃÃ!Ã'Ã9Ã9Ã9Ã9Ã<ÃAÃFÃLÃ`ÃdÃjÃuÃyÃÊÊÊÃ�ÕéíóþÃÂÃÈÃÑÃÑÃÑÃÄJ¬Ð÷ò¹ò¹ºº"º"º.º=ºJºNºXºnºnº~ºŠº�º�º¨º³º»ºÀºÒºÒºÒºÚºèºöº»»»»"»"»4»K� ?ØFØFGGG G G6GGG^GcGvGƒGˆGŒG�GÇGÏGÓGØGàGòGHH>HLHVôVô_ôtô}ô‰ô‹ô�ôœôœô«ô­ô­ô²ôM˜6˜°R°RÑRÔR×RôRS S*S9SCSYSaSgStS„S˜S�S¬S¿SßSéSßSúSüSTüSTTT)T)T7THTMTyT T T¨T«TÑTÙTßTìTüTUU$U7UZUfUyU™U§U™U´U¹UÇU¹UÔUÙUÙUéUéUüU VV>V@VeVeVmVpV~VƒV–V¡V°V°V¹V3WN0 £í£í±í»íÁíÊíÑíÕíÛíO(�•J€J€V€\€b€{€†€PÀw£ f f5f8fTfffmfwfƒf’f–fšf¢f¬f»fÄfÝfÝfäfêfñfþf ggg g"g(g.gFgOgOgVgqgtg†gQ<ƒŽÈ/È/Ú/æ/ü/0!02040`0R@ +CéCéQéYéuéuézézé‡é‡é“é“éœéS¼Eº¼º¼мؼâ¼î¼ü¼ ½4½W½f½‘½•½�½§½Ͻò½¾¾¾F¾V¾[¾c¾޾’¾¤¾©¾¶¾À¾ξξؾâ¾T@nz3I3I;I\I`IsI|I€I‚IU b + +++/+7+X+e+v+�+Š+ +³+Ì+à+ì+,,',/,P,e,p,z,Ÿ,¤,®,À,Ù,è,õ, +--%-=-A-F-F-W-W-j-|-�-¥-§-§-º-Â-Â-Â-Ô-Ô-Ý-ï-ö-ö-..:.V4ºÃ³=³=½=½=í=>?>M>Q>W@.:ûûûûû+û1û4û6û<ûXèÎ°Š°ŠÊŠâŠîŠþŠ‹‹‹ ‹#‹4‹4‹4‹;‹H‹K‹P‹M‹ª‹Á‹Ä‹Æ‹Ý‹à‹â‹ê‹ú‹ú‹ŒŒ Œ0Œ>ŒGŒNŒSŒSŒSŒYŒmŒYD  +¼ +¼¼F¼i¼v¼ƒ¼޼ª¼²¼º¼Z ‰�$3[8îø +ž +žžž'ž-ž3ž<ž?žEž\hRhørørs s4sTsZsTsqsssysss�s’s’s¢s¢sªsÙs]0ƒRƒRŒRžR¬R°R´R´R¹R^t/““ž­¼Êå + L ] € “ ¤ ­ º Ñ ì      " _Œ&:Í:ÍDÍFÍ^ÍlÍ͈Ͷ͹ÍÂÍðÍóÍ÷ÍüÍÎÎ1Î4Î6Î=Î_ÎbÎbÎeÎpÎwÎ~Î` ë“@“@¡@¦@®@¶@Ã@Õ@ß@ä@ö@ A!A7AMA_AfAfA|A‰A‰AŸA®A®AµA¼AÃAÈAÐAa@ÒÖÒÖáÖéÖýÖ××××"×$×$×*×bØ&X  0 ? J \ s s „ œ © ¼ È Ó ã ¡¡$¡1¡1¡1¡B¡n¡u¡~¡„¡‹¡‘¡–¡œ¡ ¡§¡²¡¸¡â¡c Uyfìfìoìì�ì±ìÃìÅìæìøìøì íí%í=íDíDíEíEíSí^íjílíxíƒí“í›í®ídüf¡à[à[ÿ[\\\(\=\B\K\R\`\n\„\„\‡\Œ\–\–\ \£\¹\Ñ\Í\ß\ä\]]$]']*]/]S]U]q]k]�]�]±]Å]Ì]Ò]Õ]Ú]ê]ñ]ô]Ç^e”¢ÃÈ^È^à^â^ð^ü^_&_/_H_M_c___o_�_�_¦_¨_¨_¿_Á_Á_Ñ_Ñ_Ø_Ø_à_9`f Vz[ë[ëcënë~ë�ë™ë½ë½ëÒëÚëßëßëìëìììì0ì]ìiì|ì„ì‰ì‰ì•ì•ì§ì®ì®ìÀìÅìÌìgDN@`@`T`V`f`t`~`¢`Æ`Î`à`î`ù` +aa%a-a2aKakakaŒaŽaŽa¯a±a±aÁaÁaÉaÌaÑaçaïaôa b0b(L(W(o(w(�(§(´(¿(Ñ(æ(÷()/)4):)d)n)t)w)„)�)¡)¶)Ê)Ò)ø)ý)*&*+*?*W*n*…* *¶*È*È*ô* ++ + +i<5@úƒúƒ„!„(„-„8„M„P„U„a„j0 ¸G¸G¼GÐGÐGäGèGìGk\Qd"“"“2“4“?“D“W“`“e“j“z“‡“‡“�“˜“lŒc‚@.@.K.S.^.i.t.}.“.§.°.Ä.ë.//#/9/A/_/k/v/Ž/™/ /«/°/Ã/mx…Ÿ[ý[ýwý|ýýŒý’ý•ý�ý¦ýµý½ý½ýÈýÈýÐýÒýÒýÙýÜýèýn0 š“š“¨“²“ɓϓѓדoLZiH�H�`�b�l�•�£�¥�º�Å�Ë�à�px5RR&RCRJRVReRkRoR„R’RšR R£R­Rq¨7]°�°�Ô�ß�ç�ö�û�‚‚‚0‚0‚>‚E‚K‚R‚Z‚h‚n‚p‚€‚€‚‡‚�‚”‚œ‚ª‚°‚²‚²‚‚ƒr.o£Z£Z½ZËZäZïZ[[%[:[J[Q[b[m[|[‡[£[£[§[²[¾[À[À[À[Æ[Æ[É[Ó[Ó[î[û[û[\\#\)\2\<\L\`\ˆ\™\¤\¤\¶\¶\¶\Ì\Ü\ó\ü\]]]]]]1]s,07Ò‰Ò‰Û‰å‰æ‰ë‰t¬ +1ÛíÛíæíêíîî(î4î@î_îwî‡î§î§îÈîÊîÊîëîíîíîùîùîïï ï!ï)ï)ï;ïBïBïTïaïmïqï‘ïup ÂÞÂÞÓÞßÞíÞùÞßßß#ß)ß)ß6ßBß_ß{ß{ß{ß�ß�ߑߓߓ߻ßv˜9[³C³CÃCÍCÒC×C×CæCëCD DDDDD'D2D4DCDEDQD[DiDnD}D„D†D†D†DŒDw$‚‡îîî îUîaîx<7B{š{š�š�š«š³šÃšÊšÌšÔšy,HHH(H,H,H0HzDu‚;;?Oegx„‰�¢¢¤{, +ðGðGôGH H HH|h@–@H@HKHVHfHnH�HžH¯H¸HÌHäHôHII I@IUI`IjI�I”IžI«I½IÖIåIåI JJ%JBJMJUJpJ{J�J™J³JÂJÎJ×JÜJùJK K%K!K;KFKNKYKYKYKdKdKuKuKˆKšK­K¶K¶KÉKÙKáKáKáKïKúKL L L!L%L,L}Lp3]3]<]A]H]H]g]Š]‘] ]¯]´]¶]¸]¸]~ˆ£Áª­ª­Á­Ä­Æ­Ô­ã­ã­ ®.®9®H®X®d®f®s®Š®•®—®�®Ÿ®Ÿ®Ÿ®¤®­®±®´®¾®øQppŽp¨pÂpÆpØpápêpñpúpqq*qBqUq^qgquq�q q©q½qÁqÇqÐqÖqáqãqæqîqrrr&r,r4r8rJrPrVr]rcrur{r�r–r˜rôr€l²±²±Ʊϱà±²+²:²G²R²o²‚²›²›²±²±²¾²вÚ²â²�HWe`[`[t[‰[“[§[°[µ[¹[¿[Æ[É[Ú[‚àø,Ó%Ó%æ%í% & &)&)&G&G&e&z&†&°&¶&»&â&ÿ&'9'V's'�'­'Ê'ç'(!(>([(x(•(²(Ï(ì( )&)C)`)})š)´)Î)è)****)*‘,ƒ< +Ú“Ú“î“ý“ ”””””%”„(¾ò¾òÈòÒòüòó…$jj-jIj†, R¦T¦T¾TÀTÌTÌTØTåTòTúTÿTUU UU)U9UDUIUIUPUPU[U[UzUˆU“U•U›U�UŸU¡U¡U¬U®U¶U¼U¾U¾UÊUÔU×U×U×U×UâUâUêUîUúU‡P¨¸Û1Û1ß1î1ó1ÿ1 22 2,23282I2`2x2z2ˆX�¢ò¬ò¬­­­­=­`­k­‰­š­œ­œ­¤­‰,Š‘îËîËÌÌÌJÌṖ̊x³Í&ð&ð5ðBðQðWð^ðvð…ðŒð±ð·ð½ðÄð×ðëðõðùðññ#ñ#ñ1ñ‹8¶ÀsKsK�KœK¡K·KºKÏKŒ(¿Å<§<§D§N§d§�8‘›%%!%)%1%R%h%q%w%ŽP:JÀwÀwØwäwìwówüwxxxx&x,x/x;x�ð8p¤©¤©¾©Î©Õ©Ý©ä©ªªª!ª*ª3ª5ª>ªGªIªIªRªaªcªcªlªuªzªzªƒªŒª‘ª‘ªšª£ª¨ª¨ª¨ª±ªºª¿ª¿ªËªÔªÙªðªôªôª««««"«”«�XÚì2Ý2Ý:ÝFÝQÝ`ÝlÝuÝ}݌ݨÝÙÝÙÝëÝòÝòÝÞÞ Þ‘ÈØ 8 8(8.888;8;8D8O8Y8c8o8q8w8~8�8„8Œ8˜8ž8£8©8¬8®8¹8¿8Å8Î8Î8Ö8ß8å8î8î8î8î8ô8ü8ÿ89’,™ RÛRÛ[ÛgÛoÛtÛyÛ“8ak(3;==C”,Ûâò‡ò‡û‡ˆˆ ˆ•4ÐÙ³r³rÇrÙrèrùr sss–$(-Z£Z£h£p£‚£ˆ£—<@K"¤"¤8¤B¤F¤K¤W¤\¤`¤d¤n¤˜ óó +ó*ó,ó™t2â²â²ò²þ²³³@³c³r³³“³г´³ȳγгÒ³سÚ³ç³ê³ò³šÜø+C C K O Z h q ‡ › ¥ ± ¼ Ê Ù ù  . 2 K c r v � � ˜ § ¶ Ö ä ó  , 0 = O O ] d v v „ „ … ™ ›haw2µ2µTµZµcµcµlµ{µˆµ·µµʵ̵ÞµÞµÞµïµüµüµ +¶œ@y…€”€”„”…”””�”£”§”«”Á”ƔȔ�<ðûC C X G g � ž€ ¼Ò·Ò·ð·¸ ¸¸.¸9¸D¸Z¸f¸|¸’¸š¸š¸é¸î¸î¸¹¹(¹H¹O¹q¹Ÿ€›^á^ágájá�á�á˜á¬áÊáÌáäá÷áââ*â*âAâUâsâuâ�â â â£âüâ 8—¡d]d]z]ƒ]�]˜]¡]¤]®]¡47@œ:œ:°:Ì:Î:Ù:Û:Û:ã:¢hqÇ”«”«²«Â«É«Ñ«Ø«ô«ø«¬¬9¬9¬9¬B¬D¬D¬M¬O¬O¬X¬Z¬Z¬c¬e¬e¬n¬p¬p¬y¬{¬{¬„¬†¬†¬�¬‘¬‘¬š¬š¬�¬¢¬¢¬¢¬¥¬¨¬±¬Ë¬Û¬ò¬­­ +­ ­­­ ­ ­(­(­-­-­6­C­H­H­Q­e­h­m­m­v­v­„­ˆ­c®£ ¢¦´]´]½]Ê]Ï]¤`UiÓPÓPóPþPQQQ"Q/Q5Q5QAQ¥0[cƒTƒTŒTšT T±T³T³T¸T¦(‹‘ ] ] ]+]4]7]?]§8LV’„’„¢„¥„§„¬„µ„¸„½„Å„¨ €„ÆÆÊÙÝ©DT_T_h_z_�_…_ˆ_“_›_¯_²_º_ª€›ã›ã¹ãÈãßãñãä ääää(ä4ä7ä:äFäKäTäYä`äyäyä�ä«h²Èöö/9Mc‡¡¡·Úôô¬X=O®ë®ë¸ëºëÏë×ëøëÿë ì ì#ì,ì0ì4ì­\r…€†€†–†�†¬†³†¼†¼†Ö†á†é†ý†‡ ‡‡‡5‡®� )5555]5…5­5»5þ5A6„6†6”6¢6°6°6Ê6ä6ö67747F7V7k7„7‹7’7®7Ê7Ö7¯PAQä:ä:;; ;);/;4;R;T;b;h;k;y;°lXo66WZhht{€ƒ‰Œ”™™ž¡£§·±ˆ;Ys’s’|’†’†’–’£’¬’µ’¾’Ç’Û’Û’æ’ì’î’ý’“““&“F“F“H“X“^“c“² @àsàsèsôst0t4tCtOt]tlt±t±tÝtútuuu@u@ufufukupupuu¤u¿uÍuïuv"v+vAvEvGvGvSvSvUvUvevqvqvuvzvƒv•vœvªv¹vñvúv w wwmy³4  ƒ -ƒƒ-ƒ2ƒ@ƒCƒIƒQƒ´T¼ÍjÜjÜ€ÜŒÜŽÜ—Ü¦Ü·Ü½Ü½ÜØÜàÜèܵ¨'ê¡ê¡ü¡¢ ¢¢&¢2¢;¢F¢Q¢\¢a¢o¢}¢‹¢ª¢µ¢¼¢Тì¢ø¢£ £ ££)£0£>£M£O£X£b£¶<)4ªƒªƒÁƒÄƒÉƒÌƒßƒåƒèƒêƒôƒ·8¡«‚ۂی۠ۢ۰۲ÛÃÛÖÛÛÛ¸´^Ç»»Æçîý -&:J`m€¡°½ÆÆß#V[u‰¥°ÐÙáêü.CVp…Ÿ«½ÂÔæþ--`kv�žª¶¶»ËÙò#(HOtt—¦ÐÒÒ×òù''8?TTeehp¹h +ƒƒ-ƒ2ƒ@ƒCƒIƒQƒ´T¼ÍbÜbÜx܄܆Ü�ܞܯܵܵÜÐÜØÜàܵ¨'â¡â¡ô¡ÿ¡¢¢¢*¢3¢>¢I¢T¢Y¢g¢u¢ƒ¢¢¢­¢´¢È¢ä¢ð¢ø¢£££!£(£6£E£G£P£Z£¶<)4ªƒªƒÁƒÄƒÉƒÌƒßƒåƒèƒêƒôƒ·8¡«zÛzÛ„Û˜ÛšÛ¨ÛªÛ»ÛÎÛÓÛ¸´^dz³¾ßæõ2BXex™¨µ¾¾×úNSm��¨ÈÑÙâô&;Nh}—£µºÌÞö%%Xcnˆ–¢®®³ÃÑê @Gll�žÈÊÊÏêñüü +  07LL]]`h¹h  ŽüŽüœü·üÃüÏüÛüäüíüöüÿüýýý#ý,ý5ý>ýGýPýPýhýº0½Å“q“q±qÍqäqðqöqüqr»X�Ÿ<6<6J6S6_6e6h6m6s6v6{6{6ˆ6Œ6�6�6•6¼L-3Z3ZBZPZPZZZdZ�ZŒZ•Z›ZœZ¢Z½`*>Û7Û7û7 88$8+8+8A8A8O8W8e8m8m8˜8Ã8î8û899¾8AKb„b„r„u„w„|„„‚„‡„�„¿8~ˆÞÞóü - ÀD�Ž€€€ €€€€$€*€0€6€<€B€D€ÁhÈ(B(B3BKB\BkBuB~B�B§B¿BÏBâBêB C C6C@CeCjCtC…C—C®C®CÒCðCúCúCD,D4D4DSDcD�DÁD”DœD‡DçDEEE"E7EUE_ErEzEeEÅEÅEÅEûEûE F F F1F9FLFdFwFFF�F–F¡F¯F¶FÁFÏFÏFÔFàFÂ4{„Œ¥Œ¥œ¥ž¥¦¥º¥Á¥Æ¥Î¥Ã<²½L^L^p^t^�^¤^®^¸^»^Ë^Ä8§±Ô]Ô]ø]ü]^,^6^9^I^ÅLú üü*ü6üPüYüfüzü€üŒüÆ`L`z¤z¤š¤¦¤±¤¶¤ĤϤÞ¤ä¤õ¤ù¤ý¤¥¥ ¥¥¥$¥Ç Ÿ£ò~ò~ö~È #GnýnýƒýŠý”ý¢ý¢ýªýÃýæýèýþþ=þcþ‚þŒþ–þ¤þ¼þÔþÝþÝþöþÿÿ'ÿ)ÿ0ÿ7ÿpÿɼY„+ü+üGüJüSü\üfüxü{ü~üƒü–ü™ü¬ü¬üÀüÂüÂüÖüÖüÙüÜüêüîüý -ýýýý ý5ý8ý:ý:ýOýOýOýaýÊ`¹Í[–[–w–z––…–Ž–“–Ÿ–§–³–·–¿–˖͖͖ЖܖË ’–D]D]M]Z]_]ÌX€’íí.í6íAí]í]ífífíkí|í…í�í�íœí©íÍ<ÎÙ6ñ6ñ:ñCñJñSñZñcñcñjñlñÎ\"¼_¼_Ì_Ñ_Û_ã_ì_ï_ö_ù_```Ïd\q˜…˜…°…¹…Ô…ã…ø…þ…†)†7†[†k†q†z†z†††ÐdÐMÐMåMïMôMûMN -NN#N%N5NAN^N^NgNpNvN€NÑ<±¼ˆ{ˆ{œ{Ÿ{¨{¸{½{Ñ{â{Ò|÷z�z�°�¤�À�Æ�Õ�Ú�ë�ï�ó�ý�‚‚‚ ‚"‚4‚Ó,†Í@‡@‡f‡i‡r‡{‡�‡™‡¤‡¦‡º‡LJЇÔ‡Ô‡݇ï‡ù‡þ‡ˆ ˆDˆLˆcˆjˆoˆ{ˆ£ˆªˆÈÈȈшåˆðˆ‰1‰R‰R‰k‰r‰w‰‚‰¬‰‰å‰å‰ý‰ý‰ý‰ÿ‰ÿ‰ÿ‰ŠŠ2ŠGŠGеŠÔ° 1›‘›‘¤‘¿‘¿‘őőˑˑˑˑˑˑˑˑББܑâ‘â‘è‘í‘ö‘ö‘ ’ ’ ’ ’ ’ ’’’’’’’)’Õ`\p“D“D—D®D¾DÑDäDëDEE%E6EGEXEyEšE±E¼EÇEFÖ„qŽH{H{^{e{s{�{¢{¨{¶{»{Â{Î{Î{Ø{Ý{ä{ï{ý{||||#|×,:‚:‚>‚C‚]‚b‚d‚Ø@›§ƒ1ƒ1‘1˜1Ÿ1©1°1²1Ä1É1Ö1Ù,„‹ + ÀD�Ž€€€ €€€€$€*€0€6€<€B€D€ÁhÈ B B+BCBTBcBmBvB‡BŸB·BÇBÚBâBCC.C8C]CbClC}C�C¦C¦CÊCèCòCòCD$D,D,DKD[DyD¹DŒD”DDßDøDEEE/EMEWEjErE]E½E½E½EóEóEFFF)F1FDF\FoFwFwF…FŽF™F§F®F¹FÇFÇFÌFØFÂ4{„Œ¥Œ¥œ¥ž¥¦¥º¥Á¥Æ¥Î¥Ã<²½L^L^p^t^�^¤^®^¸^»^Ë^Ä8§±Ô]Ô]ø]ü]^,^6^9^I^ÅLú üü*ü6üPüYüfüzü€üŒüÆ`L`r¤r¤’¤ž¤©¤®¤¼¤ǤÖ¤ܤí¤ñ¤õ¤û¤þ¤¥¥¥¥Ç Ÿ£ò~ò~ö~È #GnýnýƒýŠý”ý¢ý¢ýªýÃýæýèýþþ=þcþ‚þŒþ–þ¤þ¼þÔþÝþÝþöþÿÿ'ÿ)ÿ0ÿ7ÿpÿɼY„#ü#ü?üBüKüTü^üpüsüvü{üŽü‘ü¤ü¤ü¸üºüºüÎüÎüÑüÔüâüæüüüý ýýýý-ý0ý2ý2ýGýGýGýYýÊ`¹Í[–[–w–z––…–Ž–“–Ÿ–§–³–·–¿–˖͖͖ЖܖË ’–D]D]M]Z]_]ÌX€’ í í&í.í9íUíUí^í^ícítí}íˆíˆí”í¡íÍ<ÎÙ6ñ6ñ:ñCñJñSñZñcñcñjñlñÎ\"¼_¼_Ì_Ñ_Û_ã_ì_ï_ö_ù_```Ïd\q�…�…¨…±…Ì…Û…ð…ö…þ…!†/†S†c†i†r†r†~†ÐdÈMÈMÝMçMìMóMùMNNNN-N9NVNVN_NhNnNxNÑ<±¼ˆ{ˆ{œ{Ÿ{¨{¸{½{Ñ{â{Ò|÷z�z�°�¤�À�Æ�Õ�Ú�ë�ï�ó�ý�‚‚‚ ‚"‚4‚Ó,†Í8‡8‡^‡a‡j‡s‡‡‡‘‡œ‡ž‡²‡¿‡ȇ̇̇Õ‡ç‡ñ‡ö‡ +ˆˆ<ˆDˆ[ˆbˆgˆsˆ›ˆ¢ˆ»ˆ»ˆÀˆɈ݈舉)‰J‰J‰c‰j‰o‰z‰¤‰º‰݉݉õ‰õ‰õ‰÷‰÷‰÷‰ŠŠ*Š?Š?Š­ŠÔ° 1›‘›‘¤‘¿‘¿‘őőˑˑˑˑˑˑˑˑББܑâ‘â‘è‘í‘ö‘ö‘ ’ ’ ’ ’ ’ ’’’’’’’)’Õ`\p“D“D—D®D¾DÑDäDëDEE%E6EGEXEyEšE±E¼EÇEFÖ„qŽ@{@{V{]{k{…{š{ {®{³{º{Æ{Æ{Ð{Õ{Ü{ç{õ{ù{ü{ÿ{||×,:‚:‚>‚C‚]‚b‚d‚Ø@›§ƒ1ƒ1‘1˜1Ÿ1©1°1²1Ä1É1Ö1Ù,„‹ † -††† †&†&†+†Ú4›¤[Œ[ŒdŒrŒ†ŒŽŒ”Œ–Œ–Œ›ŒÛ /3ÐHÐHÞHòHøHÜH .ÊßÊßßßëßîß÷ßà à(à7à=à@àLàÝ$FêFêJêNêPêÞDÍÚº‡º‡È‡Ô‡Ù‡Ù‡æ‡ë‡ë‡ñ‡ßx]wãmãmùmnnnn%nWnWnZn\n\nanancncncnenenennnqntn�nàhC™ÛšÛšõš÷š›› ›<›W›W›W›W›W›c›o›v›„›ˆ›“›£›­›²›²›»›Ë›Ð›Ð›á›æ›é›õ›œœœœœ5œ7œ7œTœTœZœfœrœyœ}œ�œ�œœœ­œ¾œÀœÀœÖœØœØœîœîœôœ� ���'�*�6�G�Y�[�[�[�`�¤�áxš´«�«�Ã�Ò�Ø�Û�ö�žžžžž'ž)ž)ž)ž4ž6ž6ž6žAžAžAžFžXžâ¨r˜žVžV¸VÐVåVìV÷VýVýVWWWWW!W.W4W7W9W–C–J–\–_–d–k–}–€–‚–‰–›–ž– –§–¹–¼–¾–Å–×–Ú–Ü–â–â–â–â–ç–ç–î–õ–ü–——¥—8r|rÔrÔ|Ô„Ô•ÔªÔ²ÔµÔ·Ô»Ô PÝíb�b�v��˜�©�Î�Ñ�ë�õ�žžž ž -H¾Ìj‡j‡x‡„‡‰‡‰‡–‡¨‡­‡­‡³‡ H\jÄ;Ä;Þ;ï;ÿ;<<<<<"< H© ò ò,ò2ò9òOòfòjòrò„ò¢ò¢ò¢ò¢ò©ò³ò¹òÁòÍòÒòÒòÙòßòëòðò÷òþòó óó$ó6ó;ó>óFóUógówó~óšó¹óÑóêóîó ô%ôYôYô`ôdômôsôxôxôxôxôxôxôxôŒô“ô—ôšôªô°ô¸ô¾ôÀôÀôÇôËôÔôÖôÖôÖôÙôÛôÛôâôæôéôïôïôòôõô õõõ#õ7õ>õEõZõ^õõõ„õ„õ„õ‹õ�õ˜õ õ õ õ«õ³õ¶õaö x»Õ`&`&|&&„&�&—&´&¿&Æ&Í&õ&õ&ý&#'.'3'3';'g'r'w'w'{'Š',£ªnïnïxï‚ï­ï­ïÂïœ`ƒ……-…4…?…E…H…H…O…U…i…n…q…v…………ƒ…�…œ…¤…¹…Ä…Ú…Þ…à…õ…ù…ù…ù…†ŒkŠ$<$<B<E<]<]<_<p<}<‚<ˆ<¥<¨<³<·<·<¼<×<Ú<å<é<é<ò<õ<=d)ì§ì§¨¨6¨A¨D¨J¨R¨f¨v¨ƒ¨…¨“¨ ¨°¨Ä¨Æ¨Æ¨Ö¨�Xxh“h“r“x““…“ž“Óדדé“ð“”!”:”L”P”\”^”i”t”””ƒ” UYîÛîÛÜÜÜ@v‚š«š«£«Ë«î«û«¬¬6¬>¬C¬Ìh—¾ö¾öÙöãöñö÷ö÷÷÷÷÷÷÷$÷+÷5÷A÷J÷^÷v÷“÷ƒ÷¨÷¨÷¶÷Þ÷à÷í÷ô÷ øø ø!ø;øVøbørø¨øì¥Ü›Œ›ŒµŒ½ŒÅŒÔŒåŒçŒþŒ� � �/�5�;�B�K�i�e�x�ˆ�Ÿ�°�³�¸�¾�Þ�ô�ŽŽŽŽŽ'Ž2Ž8Ž;ŽAŽPŽaŽfŽrŽ}Ž�Ž *.–ó–óšó§ó©óL&5àMàMêMñMüMNNNNN,N.N5N:N>N,z�nËn˂˔˚ˠ˦Ë0Ÿ§ªÕªÕ³Õ¹ÕÂÕËÕÔÕÞÕãÕ<¨³êÕêÕùÕþÕÖ0Ö4Ö4Ö9Ö9Ö?Ö8NXêØêØúØÙÙ"Ù%Ù'Ù/Ù\ø B»B»P»U»]»d»i»‘»´»Á»λÙ»ö»þ»¼¼¼¼,“šÖîÖîäîþî ïï#ï)ï ¼ò£X£XÏXÕXîXY YY%Y)Y7YVYVYuYY‡YŽY–Y Y¨Y¼YÍYÞYóYúYZ ZZZZ2Z 4 ›ú›ú¤ú©ú²ú»úÁúÁúÆú!< ÞØÞØòØÙÙÙ&ÙBÙRÙUÙeÙ"4Î×Ä7Ä7Ø7Ú7ã7ã7ð7ø7ý78#,W^‹H‹H™H›H­HµHºHÀH$ QU+ë+ëEëWëaë%¸�¹h0h0p0x0ƒ0¢0«0Á0Õ0ß0ë0ö0ö01&1K1X1`1v1�1‰1‰1˜1¹1Þ1ë1ó1 22&2&242;2M2M2[2[2\2o2&^š33;K]luƒ‘�®ÃØïþ-@Nczƒ’­Ëâö2GY^jv„™«ÄÍØßêôý'(QWþÿþÿ ,0(0X`ÞÞçñ÷ýÿÿ)@ /=KUfw�‹•›* QU ü üü'ü+ˆ sMsM“M�M M¨M¸M¸MÌMÖMìMöMøMNN-N;NFNWNeNoNoNoNN,PÙéæúæúûû#û=ûNû[ûoûvû|û‹û-$mr€y€y„y”y™y©y.H¾ÌÌ^Ì^â^ç^_ ___"_%_(_2_/D&KcKcTcbcbcdcjcucuc„c…cŠc0(¤ª!&021D.;6õ6õDõRõRõZõyõ“õ“õ—õ�õ2d;PKûKûdûhûtûtû€û€û�û�ûœû«ûºûÌûáûëûúûúûü3ÔTÔÔ$Ô(Ô+Ô<ÔOÔYÔ_ÔcÔfÔhÔnÔrÔuÔ{Ô~Ô‘Ô©Ô±Ô´ÔÅÔÙÔàÔêÔîÔÕÕÕÕÕ#Õ6ÕPÕXÕ[ÕlÕ„Õ‹Õ‹ÕšÕ¨ÕÂÕÏÕîÕîÕÿÕÖ$Ö)Ö)Ö:ÖNÖUÖZÖZÖkÖÖ–Ö›Ö›Ö¡Ö²ÖÆÖåÖêÖêÖðÖ××4×9×9×J×^×k×p×p×�ועקק׸×Ì×Ù×Û×Û×Û×Û×Û×ì×ØØØØ&Ø:ØCØCØIØIØRØRØÛØ44ÅÎâÊâÊðÊõÊËËË Ë5l 7ƒNƒN¡N¤N¬NÀNÀNÕNßNöNOO!O&O7OEOPOaOoOyOyO‡O6ˆ7U‹O‹O±OµO¸OÈOáOáOôOýOPP"P'P1P:PDPGPJPOPgPuP†P P®P¾P¾PÐP7l:Q““ž­¼×éõ -L^ƒŒ¡¨¨½¾Â8T3Dò×òרØ&Ø2Ø2ØPØ]ØnØvØv؂؎Ø�ؘØ9XÉÛ™w™w¹wÆwËw×w÷wýw -xxx%x)x5x:X¶Èùvùvw&w+w7wWw]wjwww~w‡w‹w—w;$ Ä Ä Ú ¡3¡A¡< X\¾è¾èÂèËèÍè=  ~ò~òˆò›ò ò> áå‹—‹—Ÿ—±—¹—?(*0ܨܨé¨þ¨#©7©@0qy&Ë&Ë@ËCËCËLË]Ë`ËhËAHª¸Û•Û•ö•––$–$–C–H–J–J–T–BX qJÏJÏUÏnÏuψϕϸϸÏÅÏçÏÐÐDÐTÐeÐyЀЅЅХнÐ÷ÐþÐÑ!Ñ2ÑDÑUрѕѡѨѽѽѽÑÂÑÂÑäÑÏÑüÑÒÒ3Ò^ÒoÒšÒ¬ÒÏÒÖÒÛÒÛÒêÒùÒÓ Ó ÓÓ0ÓVÓ^ÓvӅӜӼӼӼÓÔÓàÓíÓöÓþÓmÔC`AUûû  ! ! ) 8 D _ h o t … – ¨ ¬ ± ³ DX½Ïz¹z¹œ¹ ¹¦¹©¹´¹´¹ŹÒ¹ܹß¹â¹è¹ö¹E0ª²cöcöyö…ö°ö²ö²öºöFDŠÎŠÎ“ΛΛΨκÎÂÎÇÎÓÎÙÎÛÎÛÎàÎGLD¡D¡T¡b¡r¡x¡£¡Ç¡Ø¡#¢'¢/¢HØ9‚†‚†œ†£†§†«†¶†džÕ†é†õ†ø†‡ ‡#‡(‡1‡4‡>‡F‡I‡L‡`‡w‡‡–‡�‡¦‡©‡«‡»‡¾‡À‡LJׇÛ‡â‡å‡ ˆˆ$ˆI<ðû˜˜1˜3˜A˜^˜b˜r˜˜JH -¶ô¶ôÊôÌôÓôáô õõ%õ*õ*õ.õ6õK@:FuQuQ…Q’Q™Q®QµQ¼QÅQLHÖä�'�'ª'·'Ç'Ü'ã'ì' ( ((MP¾W¾WÒWôWôWX XXX!X%X-X.X6XNpbz……"….…G…R…`…n…”…©…®…µ…º…º…¼…O ÍÑ4_4_=_O_Ph„š{0{0ƒ0¡0²0Â0É0í0þ011)1A1C1C1V1g11�1�1ƒ1Q0$,««³ÍÕíù R@ ‚ւ֋ְֺֿ֓֜ÖËÖÑÖÓÖÓÖØÖS4ÆÏrr9rUrlrxr~r„r�r¬rT,ÇÎTT T)T=TOTTTU<NY : ::1:B:R:c:r:Œ:¤:¦:¨:V`ss{Š–ª»ÆÏ×Ùëý \ No newline at end of file +`l`l‚l†lŽlŸlŸlµl¾lÎlÎlÚlélîl +m mmm'm2m9m=mAmOmcmjmtmzm}m‹m‘m¡m¸mºm½m½m¿mÙmåmëmômn!n%n1n8n?nEnHnVnlnlnlnqn}n•n™n¤n§nªn°n³nÁn×n×n×nßnënooooo-o-o4oJoú4R[|;|;’;”;ž;«;´;¹;Ã;ûtIbhhhhvhh„h�h¡h¦h½hËhËhçhiiii"i+i1i1i7iü,›¢.ï.ï7ïAïgïgïlïý˜Z|,GVcr|•£µÄÓåêø+:L_hv}}‹”þX66JT[jƒƒ”£¯ÄÆÉËËËÓÿô1ø4ø4555(525>5>5B5J5N5g5¡5³5Ç5ë5ô5ý5ý5666%6;6O6V6ˆ6»6Ì6Ü6ò67 7?7r7ƒ7“7“7š7¬7¬7º7º7»7Í7Í7Û7ß7ã7P­½‡‡/‡?‡E‡J‡J‡T‡X‡]‡]‡e‡D¦³J�J�V�m�x�~�„�Š� �§�¬�²�Hœª{%{%“%–%«%´%Ë%â%ð%& +&!&3&:&F&,ð÷;t;tUthtstyt‰t8<Fb’b’v’†’˜’¡’¤’¬’<›¦š†š†®†¼†Ç†Ò†Ú†â†ê†í†õ†<ju2«2«F«M«W«`«u«�«‡«�«(kú”ú”•F•j•m•x•…•–•§•¯•½•¿••ŕŕҕä•ç•ì•ö•ü• ––––"–)–;–>–C–J–\–_–d–k–}–€–‚–‰–›–ž– –§–¹–¼–¾–Å–×–Ú–Ü–â–â–â–â–ç–ç–î–õ–ü–——ž—8r|jÔjÔtÔ|Ô�Ô¢ÔªÔ­Ô¯Ô³Ô PÝíZ�Z�n�w���¡�Æ�É�ã�í�ú�ú�ü�ž +H¾Ìj‡j‡x‡„‡‰‡‰‡–‡¨‡­‡­‡³‡ H\jÄ;Ä;Þ;ï;ÿ;<<<<<"< H©òò$ò*ò1òGò^òbòjò|òšòšòšòšò¡ò«ò±ò¹òÅòÊòÊòÑò×òãòèòïòöòýòó +óó.ó3ó6ó>óMó_óoóvó’ó±óÉóâóæóôôQôQôXô\ôeôkôpôpôpôpôpôpôpô„ô‹ô�ô’ô¢ô¨ô°ô¶ô¸ô¸ô¿ôÃôÌôÎôÎôÎôÑôÓôÓôÚôÞôáôçôçôêôíôõõõõ/õ6õ=õRõVõwõwõ|õ|õ|õƒõ‡õ�õ˜õ˜õ˜õ£õ«õ®õYö x»ÕX&X&t&w&|&‡&�&¬&·&¾&Å&í&í&õ&'&'+'+'3'_'j'o'o's'‚',£ªnïnïxï‚ï­ï­ïÂïœ`ƒ……-…4…?…E…H…H…O…U…i…n…q…v…………ƒ…�…œ…¤…¹…Ä…Ú…Þ…à…õ…ù…ù…ù…†ŒkŠ$<$<B<E<]<]<_<p<}<‚<ˆ<¥<¨<³<·<·<¼<×<Ú<å<é<é<ò<õ<=d)ì§ì§¨¨6¨A¨D¨J¨R¨f¨v¨ƒ¨…¨“¨ ¨°¨Ä¨Æ¨Æ¨Ö¨�Xx`“`“j“p“w“}“–“»“ϓϓá“è“””2”D”H”T”V”a”l”w”w”{” UYîÛîÛÜÜÜ@v‚’«’«›«ëæ«ó«¬ ¬.¬6¬;¬Ìh—¾ö¾öÙöãöñö÷ö÷÷÷÷÷÷÷$÷+÷5÷A÷J÷^÷v÷“÷ƒ÷¨÷¨÷¶÷Þ÷à÷í÷ô÷ øø ø!ø;øVøbørø¨øì¥Ü›Œ›ŒµŒ½ŒÅŒÔŒåŒçŒþŒ� � �/�5�;�B�K�i�e�x�ˆ�Ÿ�°�³�¸�¾�Þ�ô�ŽŽŽŽŽ'Ž2Ž8Ž;ŽAŽPŽaŽfŽrŽ}Ž�Ž *.–ó–óšó§ó©óL&5àMàMêMñMüMNNNNN,N.N5N:N>N,z�nËn˂˔˚ˠ˦Ë0Ÿ§¢Õ¢Õ«Õ±ÕºÕÃÕÌÕÖÕÛÕ<¨³âÕâÕñÕöÕÖ(Ö,Ö,Ö1Ö1Ö7Ö8NXâØâØòØúØÙÙÙ Ù'Ù\ø :»:»H»M»U»\»a»‰»¬»¹»Æ»Ñ»î»ö»ý»ý»¼¼,“šÖîÖîäîþî ïï#ï)ï ¼ò£X£XÏXÕXîXY YY%Y)Y7YVYVYuYY‡YŽY–Y Y¨Y¼YÍYÞYóYúYZ ZZZZ2Z 4 “ú“úœú¡úªú³ú¹ú¹ú¾ú!< ÞØÞØòØÙÙÙ&ÙBÙRÙUÙeÙ"4Î×Ä7Ä7Ø7Ú7ã7ã7ð7ø7ý78#,W^‹H‹H™H›H­HµHºHÀH$ QU#ë#ë=ëOëYë%¸�¹`0`0h0p0{0š0£0¹0Í0×0ã0î0î0ý01C1P1X1n1y1�1�1�1±1Ö1ã1ë12 222,232E2E2S2S2T2g2&^š++3CUdm{‰•¦»Ðçö%8F[r{Š¥ÃÚîû *?QVbn|‘£¼ÅÐ×âìõù'(QWþÿþÿ ,0(0X`ÞÞçñ÷ýÿÿ)@ '5CM^oyƒ�“* QUüüü ü+ˆ sMsM“M�M M¨M¸M¸MÌMÖMìMöMøMNN-N;NFNWNeNoNoNoNN,PÙéæúæúûû#û=ûNû[ûoûvû|û‹û-$mr€y€y„y”y™y©y.H¾ÌÌ^Ì^â^ç^_ ___"_%_(_2_/D&KcKcTcbcbcdcjcucuc„c…cŠc0(¤ª!&021D.;6õ6õDõRõRõZõyõ“õ“õ—õ�õ2d;PCûCû\û`ûlûlûxûxû…û…û”û£û²ûÄûÙûãûòûòûüû3ÔTÔÔ$Ô(Ô+Ô<ÔOÔYÔ_ÔcÔfÔhÔnÔrÔuÔ{Ô~Ô‘Ô©Ô±Ô´ÔÅÔÙÔàÔêÔîÔÕÕÕÕÕ#Õ6ÕPÕXÕ[ÕlÕ„Õ‹Õ‹ÕšÕ¨ÕÂÕÏÕîÕîÕÿÕÖ$Ö)Ö)Ö:ÖNÖUÖZÖZÖkÖÖ–Ö›Ö›Ö¡Ö²ÖÆÖåÖêÖêÖðÖ××4×9×9×J×^×k×p×p×�ועקק׸×Ì×Ù×Û×Û×Û×Û×Û×ì×ØØØØ&Ø:ØCØCØIØIØRØRØÛØ44ÅÎÚÊÚÊèÊíÊøÊûÊÿÊË5l 7ƒNƒN¡N¤N¬NÀNÀNÕNßNöNOO!O&O7OEOPOaOoOyOyO‡O6ˆ7U‹O‹O±OµO¸OÈOáOáOôOýOPP"P'P1P:PDPGPJPOPgPuP†P P®P¾P¾PÐP7l:Q‹‹–¥´Ïáíû%DV{„™  µ¶º8T3Dê×ê×ûרØ*Ø*ØHØUØfØnØnØz؆؈Ø�Ø9XÉÛ™w™w¹wÆwËw×w÷wýw +xxx%x)x5x:X¶Èùvùvw&w+w7wWw]wjwww~w‡w‹w—w;$ Ä Ä Ú ¡3¡A¡< X\¾è¾èÂèËèÍè=  ~ò~òˆò›ò ò> áå‹—‹—Ÿ—±—¹—?(*0ܨܨé¨þ¨#©7©@0qy&Ë&Ë@ËCËCËLË]Ë`ËhËAHª¸Û•Û•ö•––$–$–C–H–J–J–T–BX qBÏBÏMÏfÏmÏ€Ï�ϰϰϽÏßÏÐÐ<ÐLÐ]ÐqÐxÐ}Ð}Ð�еÐïÐöÐÑÑ*Ñ<ÑMÑxÑ�љѠѵѵѵѺѺÑÜÑÇÑôÑÒÒ+ÒVÒgÒ’Ò¤ÒÇÒÎÒÓÒÓÒâÒñÒÓÓÓÓ(ÓNÓVÓnÓ}Ó”Ó´Ó´Ó´ÓÌÓØÓåÓîÓöÓeÔC`AUûû  ! ! ) 8 D _ h o t … – ¨ ¬ ± ³ DX½Ïr¹r¹”¹˜¹ž¹¡¹¬¹¬¹½¹ʹÔ¹×¹Ú¹à¹î¹E0ª²[ö[öqö}ö¨öªöªö²öFD‚΂΋ΓΓΠβκοÎËÎÑÎÓÎÓÎØÎGLD¡D¡T¡b¡r¡x¡£¡Ç¡Ø¡#¢'¢/¢HØ9‚†‚†œ†£†§†«†¶†džÕ†é†õ†ø†‡ ‡#‡(‡1‡4‡>‡F‡I‡L‡`‡w‡‡–‡�‡¦‡©‡«‡»‡¾‡À‡LJׇÛ‡â‡å‡ ˆˆ$ˆI<ðû˜˜1˜3˜A˜^˜b˜r˜˜JH -¶ô¶ôÊôÌôÓôáô õõ%õ*õ*õ.õ6õK@:FuQuQ…Q’Q™Q®QµQ¼QÅQLHÖäˆ'ˆ'¢'¯'¿'Ô'Û'ä'(((MP¾W¾WÒWôWôWX XXX!X%X-X.X6XNpbz……"….…G…R…`…n…”…©…®…µ…º…º…¼…O ÍÑ4_4_=_O_Ph„š{0{0ƒ0¡0²0Â0É0í0þ011)1A1C1C1V1g11�1�1ƒ1Q0$,««³ÍÕíù R@ zÖzÖƒÖ‹Ö”Ö¨Ö²Ö·ÖÃÖÉÖËÖËÖÐÖS4ÆÏrr9rUrlrxr~r„r�r¬rT,ÇÎTT T)T=TOTTTU<NY : ::1:B:R:c:r:Œ:¤:¦:¨:V`kks‚Ž¢³¾ÇÏÑãõüü \ No newline at end of file diff --git a/TempleOSCD/Kernel/KernelA.HH b/TempleOSCD/Kernel/KernelA.HH index de17020..5799a57 100644 --- a/TempleOSCD/Kernel/KernelA.HH +++ b/TempleOSCD/Kernel/KernelA.HH @@ -2308,7 +2308,7 @@ public class CATARep #define FILEMASK_SRC "*.HC*;*.HH*;*.IN*;*.PRJ*" #define FILEMASK_DD FILEMASK_SRC ";*.DD*" #define FILEMASK_TXT FILEMASK_DD ";*.TXT*" -#define FILEMASK_GR "*.GR*;*.BMP*" +#define FILEMASK_GR "*.GR*" #help_index "File/Low Level" #define BLK_SIZE_BITS 9 diff --git a/TempleOSCD/Kernel/KernelC.HH b/TempleOSCD/Kernel/KernelC.HH index ce08272..97eb0c9 100644 --- a/TempleOSCD/Kernel/KernelC.HH +++ b/TempleOSCD/Kernel/KernelC.HH @@ -749,10 +749,10 @@ public extern U16 mon_start_days2[12]; #help_index "Time/HPET" #help_file "::/Doc/TimeHPET" public extern I64 HPET(); - #help_index "Time/Jiffies" #help_file "::/Doc/TimeJiffy" public extern I64 SysTimerRead();//18.33333*65536Hz (SYS_TIMER_FREQ) + #help_index "Time/Seconds" public extern Bool Blink(F64 Hz=2.5); public extern F64 tS(); //From SysTimerFreq. diff --git a/TempleOSCD/Linux/TOSZ b/TempleOSCD/Linux/TOSZ new file mode 100644 index 0000000..8b56dee Binary files /dev/null and b/TempleOSCD/Linux/TOSZ differ diff --git a/TempleOSCD/Linux/TOSZ.CPP b/TempleOSCD/Linux/TOSZ.CPP index 45de8db..4d9b512 100644 --- a/TempleOSCD/Linux/TOSZ.CPP +++ b/TempleOSCD/Linux/TOSZ.CPP @@ -1,17 +1,76 @@ #include #include #include +#include #pragma pack(1) -#define TRUE 1 -#define FALSE 0 +#define TRUE 1 +#define FALSE 0 +#define BYTE_MAX 0xFF +#define CHAR_MIN (-0x80) +#define CHAR_MAX 0x7F +#define SHORT_MIN (-0x8000) +#define SHORT_MAX 0x7FFF +#define INT_MIN (-0x80000000) +#define INT_MAX 0x7FFFFFFF +#define DWORD_MIN 0 +#define DWORD_MAX 0xFFFFFFFF +#define CDATE_FREQ 49710 // Hz typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; typedef unsigned char BOOL; +class CDate +{public: + DWORD time; + int date; +}; + +WORD EndianWORD(WORD d) +{ + return ((d&255)<<8)|((d>>8)&255); +} + +DWORD EndianDWORD(DWORD d) +{ + return ((d&255)<<24)|(((d>>8)&255)<<16)| + (((d>>16)&255)<<8)|((d>>24)&255); +} + +DWORD StrOcc(char *src, char ch) +{//Count occurrences of a char. + DWORD i=0; + if (!src) return 0; + while (*src) + if (*src++==ch) + i++; + return i; +} + +void *CAlloc(DWORD size) +{ + BYTE *res=(BYTE *)malloc(size); + memset(res,0,size); + return res; +} + +void Free(void *ptr) +{ + if (ptr) free(ptr); +} + +int FSize(FILE *f) +{ + int res,original=ftell(f); + fseek(f,0,SEEK_END); + res=ftell(f); + fseek(f,original,SEEK_SET); + return res; +} + #define ARC_MAX_BITS 12 #define CT_NONE 1 @@ -67,7 +126,7 @@ int Bts(int bit_num, BYTE *bit_field) return (res) ? 1:0; } -DWORD BFieldExtU32(BYTE *src,DWORD pos,DWORD bits) +DWORD BFieldExtDWORD(BYTE *src,DWORD pos,DWORD bits) { DWORD i,res=0; for (i=0;istk_ptr==c->stk_base && dst_ptrsaved_basecode==0xFFFFFFFFl) { - lastcode=BFieldExtU32(c->src_buf,c->src_pos, + lastcode=BFieldExtDWORD(c->src_buf,c->src_pos, c->next_bits_in_use); c->src_pos=c->src_pos+c->next_bits_in_use; *dst_ptr++=lastcode; @@ -131,7 +190,7 @@ void ArcExpandBuf(CArcCtrl *c) } else lastcode=c->saved_basecode; while (dst_ptrsrc_pos+c->next_bits_in_use<=c->src_size) { - basecode=BFieldExtU32(c->src_buf,c->src_pos, + basecode=BFieldExtDWORD(c->src_buf,c->src_pos, c->next_bits_in_use); c->src_pos=c->src_pos+c->next_bits_in_use; if (c->cur_entry==&c->compress[basecode]) { @@ -167,8 +226,7 @@ void ArcExpandBuf(CArcCtrl *c) CArcCtrl *ArcCtrlNew(DWORD expand,DWORD compression_type) { CArcCtrl *c; - c=(CArcCtrl *)malloc(sizeof(CArcCtrl)); - memset(c,0,sizeof(CArcCtrl)); + c=(CArcCtrl *)CAlloc(sizeof(CArcCtrl)); if (expand) { c->stk_base=(BYTE *)malloc(1<stk_ptr=c->stk_base; @@ -190,8 +248,8 @@ CArcCtrl *ArcCtrlNew(DWORD expand,DWORD compression_type) void ArcCtrlDel(CArcCtrl *c) { - free(c->stk_base); - free(c); + Free(c->stk_base); + Free(c); } BYTE *ExpandBuf(CArcCompress *arc) @@ -225,15 +283,6 @@ BYTE *ExpandBuf(CArcCompress *arc) return res; } -long FSize(FILE *f) -{ - long res,original=ftell(f); - fseek(f,0,SEEK_END); - res=ftell(f); - fseek(f,original,SEEK_SET); - return res; -} - BOOL Cvt(char *in_name,char *out_name,BOOL cvt_ascii) { DWORD out_size,i,j,in_size; @@ -265,70 +314,680 @@ BOOL Cvt(char *in_name,char *out_name,BOOL cvt_ascii) fclose(io_file); okay=TRUE; } - free(out_buf); + Free(out_buf); } } - free(arc); + Free(arc); } return okay; } -void FillGaps(char *in_name) +#define ONA_REST CHAR_MIN + +double Ona2Freq(char ona) +{//Ona to freq. Ona=60 is 440.0Hz. + if (ona==ONA_REST) + return 0; +// else +// return 440.0/32*pow(2.0,ona/12.0); +} + +class CSndData +{public: + double time; + char ona; +}; + +class CSndWaveCtrl +{public: + int sample_rate; + double phase,last_y,next_y; +}; + +CSndWaveCtrl *SndWaveCtrlNew(int sample_rate=8000) { - char buf[512]; - FILE *fp; - int i=0,i1; - sprintf(buf,"ls %s",in_name); - fp = popen(buf, "r"); - if (fp) { - while (fgets(buf,sizeof(buf), fp)) { - printf("%s\n",buf); + CSndWaveCtrl *swc=(CSndWaveCtrl *)CAlloc(sizeof(CSndWaveCtrl)); + swc->sample_rate=sample_rate; + return swc; +} + +void SndWaveAddBuf(CSndWaveCtrl *swc,BYTE *buf,int num_samples, + double _freq,double _amp=1.0) +{ + int i,j,k; + double a,f,amp,phase; + if (!swc) return; + if (!_freq||!_amp) + swc->last_y=swc->phase=0; + else { + phase=swc->phase; + i=0; + if (INT_MAXsample_rate*_freq; + while (phase<0) + phase+=2; + while (phase>=2) + phase-=2; + while (i=1.0) + j=-amp; + else + j=amp; + k=j>>16; + *((short *)buf+i++)+=k; + phase+=f; + while (phase>=2) + phase-=2; } - pclose(fp); + swc->phase=phase; } } +#define SNDFILE_SAMPLE_RATE 8000 +//Header for a ".SND" file +class CFileSND +{public: + DWORD signature; //0x646e732e + DWORD offset; //24 + DWORD data_size; + DWORD coding; //3=16bit uncompressed + DWORD sample_rate; //Hz + DWORD channels; //1=mono + short body[1]; +}; + +#define SND_FILE_MAX 0x007FF000 + +int SndFileCreate(char *print_fmt,double normalized_vol=1.0, + double reverb_delay=0,double reverb_intensity=0,double time_shift=0) +{ + int i,i1,k,cnt,cnt2,level,file_num; + double dt; + CFileSND *s; + CSndWaveCtrl *swc=SndWaveCtrlNew(SNDFILE_SAMPLE_RATE); + CSndData *d,*d1; + char st[512]; + FILE *out_file; + +// dt=snd.record_head.last->time-snd.record_head.next->time; + if (!dt) return 0; + cnt=dt*SNDFILE_SAMPLE_RATE; + cnt++; //Terminator + + s=(CFileSND *)CAlloc(sizeof(CFileSND)-sizeof(short)+cnt*sizeof(short)); + s->signature=0x646e732e; + s->offset=EndianDWORD(sizeof(CFileSND)-sizeof(short)); + s->coding=EndianDWORD(3); + s->sample_rate=EndianDWORD(SNDFILE_SAMPLE_RATE); + s->channels=EndianDWORD(1); + + if (time_shift) { +// d=snd.record_head.next; + d->time-=time_shift; +// while (d->next!=&snd.record_head) { + while (TRUE) { +// d1=d->next; + dt=d1->time-d->time; + if (dt<0) { +// QueRem(d1); +// Free(d1); + } else + break; + } + } + +// d=snd.record_head.next; + k=0; + i=d->time*SNDFILE_SAMPLE_RATE; +// while (d->next!=&snd.record_head) { +// d1=d->next; + i1=d1->time*SNDFILE_SAMPLE_RATE; + if (i1-i) { + SndWaveAddBuf(swc,(BYTE *)&s->body[k],i1-i, + Ona2Freq(d->ona),normalized_vol); + k+=i1-i; + i=i1; + } +// QueRem(d); +// Free(d); + d=d1; +// } + + //Reverb + if (reverb_intensity) { + if (dt=reverb_delay*SNDFILE_SAMPLE_RATE) + for (i=dt;ibody[i]+=reverb_intensity*s->body[i-(DWORD)dt]; + } + + //Get rid of D.C. component + for (k=0;k<3;k++) { + level=0; + for (i=0;ibody[i]; + level/=cnt-1; + for (i=0;ibody[i]-level<=SHORT_MIN) + s->body[i]=SHORT_MIN; + else if (s->body[i]-level>=SHORT_MIN) + s->body[i]=SHORT_MAX; + else + s->body[i]=s->body[i]-level; + } + } + + for (i=0;ibody[i]=EndianWORD(s->body[i]); + + s->body[cnt-1]=0; + +// d=snd.record_head.next; +// while (d!=&snd.record_head) { +// d1=d->next; +// QueRem(d); +// Free(d); + d=d1; +// } + + cnt2=cnt; + file_num=0; + while (cnt2>0) { + i=cnt2; + if (i>SND_FILE_MAX) + i=SND_FILE_MAX; + s->data_size=EndianDWORD(i*sizeof(short)); + memcpy(s->body,&s->body[file_num*SND_FILE_MAX],i*sizeof(short)); + sprintf(st,print_fmt,file_num++); + if (out_file=fopen(st,"wb")) { + fwrite(s,1,sizeof(CFileSND)-sizeof(short)+i*sizeof(short),out_file); + fclose(out_file); + } + cnt2-=i; + } + Free(s); + Free(swc); + return cnt; +} + +#define GR_WIDTH 640 +#define GR_HEIGHT 480 +#define COLORS_NUM 16 + +class CBGR24 +{public: + BYTE b,g,r,pad; +}; + +class CBGR48 +{public: + WORD b,g,r,pad; +} gr_palette_std[COLORS_NUM]={ +{0x0000,0x0000,0x0000,0},{0xAAAA,0x0000,0x0000,0}, +{0x0000,0xAAAA,0x0000,0},{0xAAAA,0xAAAA,0x0000,0}, +{0x0000,0x0000,0xAAAA,0},{0xAAAA,0x0000,0xAAAA,0}, +{0x0000,0x5555,0xAAAA,0},{0xAAAA,0xAAAA,0xAAAA,0}, +{0x5555,0x5555,0x5555,0},{0xFFFF,0x5555,0x5555,0}, +{0x5555,0xFFFF,0x5555,0},{0xFFFF,0xFFFF,0x5555,0}, +{0x5555,0x5555,0xFFFF,0},{0xFFFF,0x5555,0xFFFF,0}, +{0x5555,0xFFFF,0xFFFF,0},{0xFFFF,0xFFFF,0xFFFF,0}}; + +#define DCF_COMPRESSED 1 +#define DCF_PALETTE 2 + +class CDC +{public: + CDate cdt; + int x0,y0, + width,width_internal, + height, + flags; + CBGR48 palette[COLORS_NUM]; + BYTE *body; +}; + +CDC *DCNew(DWORD width,DWORD height) +{ + CDC *res=(CDC *)CAlloc(sizeof(CDC)); + res->width=width; + res->width_internal=(width+7)&~7; + res->height=height; + res->body=(BYTE *)CAlloc(res->width_internal*res->height); + return res; +} + +void DCDel(CDC *dc) +{//Free dc, image body, rot mat and depth buf. + if (!dc) return; + Free(dc->body); + Free(dc); +} + +CDC *DCLoad(BYTE *src,DWORD *_size) +{//Loads device context from mem. + BYTE *ptr=src; + CArcCompress *arc; + DWORD body_size; + CDC *res=(CDC *)CAlloc(sizeof(CDC)); + memcpy(res,ptr,sizeof(CDC)-sizeof(BYTE *)-COLORS_NUM*sizeof(CBGR48)); + ptr+=sizeof(CDC)-sizeof(BYTE *)-COLORS_NUM*sizeof(CBGR48); + if (res->flags&DCF_PALETTE) { + memcpy(&res->palette,ptr,COLORS_NUM*sizeof(CBGR48)); + ptr+=COLORS_NUM*sizeof(CBGR48); + } else + memcpy(&res->palette,gr_palette_std,sizeof(gr_palette_std)); + + body_size=res->width_internal*res->height; + if (res->flags&DCF_COMPRESSED) { + res->flags&=~DCF_COMPRESSED; + arc=(CArcCompress *)ptr; + res->body=ExpandBuf(arc); + ptr+=arc->compressed_size; + } else { + res->body=(BYTE *)malloc(body_size); + memcpy(res->body,ptr,body_size); + ptr+=body_size; + } + *_size=ptr-src; + return res; +} + +BOOL GrBlot(CDC *dc,int x,int y,CDC *img) +{ + int j,k,k1,w1,h1,w2,h2; + if (x<0) + w1=-x; + else + w1=0; + if (y<0) + h1=-y; + else + h1=0; + w2=img->width; + h2=img->height; + if (x+w2>dc->width) + w2=dc->width-x; + if (y+h2>dc->height) + h2=dc->height-y; + if (w1width && h1

height) { + k = h1 *img ->width_internal+w1; + k1=(h1+y)*dc->width_internal+x+w1; + for (j=h1;jbody+k1,img->body+k,w2-w1); + k +=img->width_internal; + k1+=dc->width_internal; + } + return TRUE; + } else + return FALSE; +} + +#define BMP_COLORS_NUM 16 + +class CFileBMP +{public: + WORD type; + DWORD file_size; + DWORD reserved; + DWORD data_offset; + + DWORD header_size; + DWORD width; + DWORD height; + WORD planes; + WORD bit_cnt; + DWORD compression; + DWORD image_size; + DWORD x_pixs_per_meter; + DWORD y_pixs_per_meter; + DWORD colors_used; + DWORD important_colors; + + CBGR24 palette[BMP_COLORS_NUM]; +}; + +CFileBMP *BMPRLE4To(CDC *dc) +{//To Windows RLE4 bit BMP. + BYTE *src,*ptr,*start; + int i,x,y,w=dc->width,cnt,pattern; + CBGR48 palette[COLORS_NUM]; + CFileBMP *bmp =(CFileBMP *)CAlloc(sizeof(CFileBMP)+ + 2*(dc->width+1)*dc->height); + bmp->type ='B'+('M'<<8); + bmp->planes =1; + bmp->data_offset=sizeof(CFileBMP); + bmp->header_size=sizeof(CFileBMP)-BMP_COLORS_NUM*sizeof(CBGR24)-14; + bmp->width =dc->width; + bmp->height =dc->height; + bmp->bit_cnt =4; + bmp->compression=2; //RLE4 + memcpy(&palette,&gr_palette_std,sizeof(gr_palette_std)); + for (i=0;ipalette[i].b=palette[i].b>>8; + bmp->palette[i].g=palette[i].g>>8; + bmp->palette[i].r=palette[i].r>>8; + bmp->palette[i].pad=0; + } + start=ptr=(BYTE *)bmp+bmp->data_offset; + for (y=dc->height-1;y>=0;y--) { + src=y*dc->width_internal+dc->body; + x=0; + while (ximage_size=ptr-start; + bmp->file_size=sizeof(CFileBMP)+bmp->image_size; + return bmp; +} + +void BMPWrite(char *filename,CDC *dc) +{//Window's BMP Files. + CFileBMP *bmp=BMPRLE4To(dc); + FILE *out_file; + if (out_file=fopen(filename,"wb")) { + fwrite(bmp,1,bmp->file_size,out_file); + fclose(out_file); + } + Free(bmp); +} + +int MV2BMPLst(char *mv_print_fmt,char *dir_print_fmt,char *bmp_print_fmt, + char *mp4_print_fmt,char *out_name,double fps=30000.0/1001) +{//Cvt GR list MV file to BMP lst + DWORD bmp_num,size; + BOOL cont=TRUE; + int num=0,remaining,mv_percent_cnt,bmp_percent_cnt,dir_percent_cnt, + mp4_percent_cnt; + CDC *dc,*base; + BYTE *src,*src_base; + char st[512],st_dir[512],st_bmp[512],st_mp4[512]; + CDate cdt; + FILE *mv_file,*lst_file=fopen("TOSZTEMP_VID_LIST.TXT","wt"); + cdt.time=0; + cdt.date=INT_MIN; + + if (mv_print_fmt) + mv_percent_cnt=StrOcc(mv_print_fmt,'%'); + else + mv_percent_cnt=0; + if (bmp_print_fmt) + bmp_percent_cnt=StrOcc(bmp_print_fmt,'%'); + else + bmp_percent_cnt=0; + if (dir_print_fmt) + dir_percent_cnt=StrOcc(dir_print_fmt,'%'); + else + dir_percent_cnt=0; + if (mp4_print_fmt) + mp4_percent_cnt=StrOcc(mp4_print_fmt,'%'); + else + mp4_percent_cnt=0; + do { + if (mv_percent_cnt) + sprintf(st,mv_print_fmt,num); + else + strcpy(st,mv_print_fmt); + if (mv_file=fopen(st,"rb")) { + if (dir_percent_cnt) + sprintf(st_dir,dir_print_fmt,num); + else + strcpy(st_dir,dir_print_fmt); + sprintf(st,"mkdir %s",st_dir); + system(st); + bmp_num=0; + + remaining=FSize(mv_file); + src=src_base=(BYTE *)malloc(remaining+1); + fread(src_base,1,remaining,mv_file); + src_base[remaining]=0; + base=DCNew(GR_WIDTH,GR_HEIGHT); + while (cont && remaining>0) { + dc=DCLoad(src,&size); + if (!size) { + cont=FALSE; + break; + } + GrBlot(base,dc->x0,dc->y0,dc); + if (cdt.time==0 && cdt.date==INT_MIN) { + cdt.time=dc->cdt.time; + cdt.date=dc->cdt.date; + } + while (cdt.datecdt.date|| + ((cdt.date==dc->cdt.date) && (cdt.time<=dc->cdt.time))) { + if (bmp_percent_cnt) + sprintf(st_bmp,bmp_print_fmt,bmp_num); + else + strcpy(st_bmp,bmp_print_fmt); + sprintf(st,"%s/%s",st_dir,st_bmp); + BMPWrite(st,base); + if (cdt.time>=DWORD_MAX-(DWORD)(CDATE_FREQ/fps)+1) + cdt.date++; + cdt.time+=(DWORD)(CDATE_FREQ/fps); + if (!bmp_percent_cnt) { + cont=FALSE; + break; + } + bmp_num++; + } + DCDel(dc); + src+=size; + remaining-=size; + } + DCDel(base); + Free(src_base); + fclose(mv_file); + } else + break; + if (mp4_print_fmt) { + if (mp4_percent_cnt) + sprintf(st_mp4,mp4_print_fmt,num); + else + strcpy(st_mp4,mp4_print_fmt); + sprintf(st,"ffmpeg -framerate %0.16f -i %s/%s " + "-c:v libx264 -vf \"scale=2*trunc(iw/2):-2,setsar=1\" " + "-profile:v main -pix_fmt yuv420p %s", + fps,st_dir,bmp_print_fmt,st_mp4); + system(st); + fprintf(lst_file,"file '%s'\r\n",st_mp4); + } + num++; + if (!mv_percent_cnt) + break; + } while (cont); + + if (lst_file) { + fclose(lst_file); + if (num && out_name) { + sprintf(st,"ffmpeg -f concat -i TOSZTEMP_VID_LIST.TXT -c copy %s", + out_name); + system(st); + } + } + system("rm -R TOSZTEMP*"); + return num; +} + +int SND2MP4Lst(char *snd_print_fmt,char *mp4_print_fmt,char *out_name, + int rate=24000) +{//Cvt SND lst to BMP lst + int num=0,snd_percent_cnt,mp4_percent_cnt,mkdir_percent_cnt; + char st[512],st_snd[512],st_mp4[512]; + FILE *snd_file,*lst_file=fopen("TOSZTEMP_AUD_LIST.TXT","wt"); + + if (snd_print_fmt) + snd_percent_cnt=StrOcc(snd_print_fmt,'%'); + else + snd_percent_cnt=0; + if (mp4_print_fmt) + mp4_percent_cnt=StrOcc(mp4_print_fmt,'%'); + else + mp4_percent_cnt=0; + + while (TRUE) { + if (snd_percent_cnt) + sprintf(st_snd,snd_print_fmt,num); + else + strcpy(st_snd,snd_print_fmt); + if (snd_file=fopen(st_snd,"rb")) { + fclose(snd_file); + if (mp4_percent_cnt) + sprintf(st_mp4,mp4_print_fmt,num); + else + strcpy(st_mp4,mp4_print_fmt); + sprintf(st,"ffmpeg -i %s -ar %d %s",st_snd,rate,st_mp4); + system(st); + fprintf(lst_file,"file '%s'\r\n",st_mp4); + } else + break; + num++; + if (!snd_percent_cnt) + break; + } + + if (lst_file) { + fclose(lst_file); + if (num && out_name) { + sprintf(st,"ffmpeg -f concat -i TOSZTEMP_AUD_LIST.TXT -c copy %s", + out_name); + system(st); + } + } + system("rm -R TOSZTEMP*"); + return num; +} + int main(int argc, char* argv[]) { - char *in_name,*out_name,buf[256]; - BOOL cvt_ascii,fill_gaps,del_in=FALSE; + char *in_name,*out_name,st[256], + *mv_print_fmt,*snd_print_fmt; + BOOL cvt_ascii,del_in=FALSE; int i=1,l; - if (argc>i && !strcmp(argv[i],"-ascii")) { - cvt_ascii=TRUE; + if (argc>i && !strcmp(argv[i],"-bmp")) { i++; - } else - cvt_ascii=FALSE; - if (argc>i && !strcmp(argv[i],"-gaps")) { - fill_gaps=TRUE; - i++; - } else - fill_gaps=FALSE; - if (argc>i) { - in_name=argv[i++]; - if (argc>i) + if (argc>i) + mv_print_fmt=argv[i++]; + else + mv_print_fmt=(char *)"VID%03d.MV"; + if (argc>i) out_name=argv[i++]; - else { - strcpy(buf,in_name); - l=strlen(buf); - if (l>2 && buf[l-1]=='Z' && buf[l-2]=='.') { - buf[l-2]=0; - del_in=TRUE; - } - out_name=buf; - } - if (fill_gaps) - FillGaps(in_name); - else if (Cvt(in_name,out_name,cvt_ascii)) { - if (del_in) { - sprintf(buf,"rm %s",in_name); - system(buf); - } + else + out_name=(char *)"VIDEO.MP4"; + MV2BMPLst(mv_print_fmt,(char *)"TOSZTEMP%03d",(char *)"TOSZTEMP%06d.BMP", + (char *)"TOSZTEMPVID%03d.MP4",out_name); + } else if (argc>i && !strcmp(argv[i],"-snd")) { + i++; + if (argc>i) + snd_print_fmt=argv[i++]; + else + snd_print_fmt=(char *)"AUD%03d.SND"; + if (argc>i) + out_name=argv[i++]; + else + out_name=(char *)"AUDIO.MP4"; + SND2MP4Lst(snd_print_fmt,(char *)"TOSZTEMPAUD%03d.MP4",out_name); + } else if (argc>i && !strcmp(argv[i],"-mp4")) { + i++; + if (argc>i) + mv_print_fmt=argv[i++]; + else + mv_print_fmt=(char *)"VID%03d.MV"; + if (argc>i) + snd_print_fmt=argv[i++]; + else + snd_print_fmt=(char *)"AUD%03d.SND"; + MV2BMPLst(mv_print_fmt,(char *)"TOSZTEMP%03d", + (char *)"TOSZTEMP%06d.BMP",(char *)"TOSZTEMPVID%03d.MP4", + (char *)"TOSZVIDEO.MP4"); + SND2MP4Lst(snd_print_fmt,(char *)"TOSZTEMPAUD%03d.MP4", + (char *)"TOSZAUDIO.MP4"); + if (argc>i) + out_name=argv[i++]; + else + out_name=(char *)"MOVIE.MP4"; + sprintf(st,"ffmpeg -i TOSZVIDEO.MP4 -i TOSZAUDIO.MP4 %s",out_name); + system(st); + system("rm TOSZVIDEO.MP4"); + system("rm TOSZAUDIO.MP4"); + } else { + if (argc>i && !strcmp(argv[i],"-ascii")) { + cvt_ascii=TRUE; + i++; } else - printf("Fail: %s %s\r\n",in_name,out_name); - } else - puts("TOSZ [-ascii] [-gaps] in_name [out_name]\r\n\r\n" - "TOSZ expands a single TempleOS file. The -ascii flag will convert " - "nonstandard TempleOS ASCII characters to regular ASCII. The -gap flag " - "will fill-in missing BMP files in the sequence VID%05d.BMP.\r\n"); + cvt_ascii=FALSE; + if (argc>i) { + in_name=argv[i++]; + if (argc>i) + out_name=argv[i++]; + else { + strcpy(st,in_name); + l=strlen(st); + if (l>2 && st[l-1]=='Z' && st[l-2]=='.') { + st[l-2]=0; + del_in=TRUE; + } + out_name=st; + } + if (argc>i) + out_name=argv[i++]; + else { + strcpy(st,in_name); + l=strlen(st); + if (l>2 && st[l-1]=='Z' && st[l-2]=='.') { + st[l-2]=0; + del_in=TRUE; + } + out_name=st; + } + if (Cvt(in_name,out_name,cvt_ascii)) { + if (del_in) { + sprintf(st,"rm %s",in_name); + system(st); + } + } else + printf("Fail: %s %s\r\n",in_name,out_name); + } else { + puts("TOSZ [-ascii] in_name [out_name]\r\n\r\n" + "TOSZ expands a single TempleOS file. " + "The -ascii flag will convert " + "nonstandard TempleOS ASCII " + "characters to regular ASCII.\r\n\r\n"); + puts("TOSZ -bmp VID%03d.MV VIDEO.MP4\r\n" + "TOSZ will expand MV files to a sequence of BMP files and, " + "will call ffmpeg to convert BMP files to an MP4 file.\r\n\r\n"); + puts("TOSZ -snd AUD%03d.SND AUDIO.MP4\r\n\r\n" + "TOSZ will call ffmpeg to convert SND files " + "to an MP4 file.\r\n"); + puts("TOSZ -mp4 VID%03d.MV AUD%03d.SND MOVIE.MP4\r\n\r\n" + "TOSZ will call ffmpeg to convert MV files and SND files " + "to a combined MP4 file.\r\n"); + } + } return EXIT_SUCCESS; } diff --git a/TempleOSCD/Linux/make_tosz b/TempleOSCD/Linux/make_tosz new file mode 100644 index 0000000..118782a --- /dev/null +++ b/TempleOSCD/Linux/make_tosz @@ -0,0 +1,9 @@ +#!/bin/bash + +#Make TOSZ + +echo Make TOSZ +cc TOSZ.CPP -o TOSZ +chmod 777 TOSZ + + diff --git a/TempleOSCD/Misc/Tour/TourB.IN b/TempleOSCD/Misc/Tour/TourB.IN index f737d0b..039d26a 100644 --- a/TempleOSCD/Misc/Tour/TourB.IN +++ b/TempleOSCD/Misc/Tour/TourB.IN @@ -17,5 +17,4 @@ InPrint(250,"Dir;\n"); Sleep(1500); TourPut( -"$$GREEN$$Type()$$FG$$ can also be used on $$GREEN$$.BMP$$FG$$ or $$GREEN$$.GR$$FG$$ " -"files!",TRUE); +"$$GREEN$$Type()$$FG$$ can also be used on $$GREEN$$.GR$$FG$$ files!",TRUE);