From 53bb5a4bae8d6b444244829b6343a4c98a62958f Mon Sep 17 00:00:00 2001 From: Doni Pracner Date: Sun, 10 Feb 2013 23:31:25 +0100 Subject: [PATCH 1/1] ubacena verzija 12 i kodovi --- .gitignore | 18 + changes.txt | 49 + grbPMF.eps | 769 ++++++++ grbPMF.jpg | Bin 0 -> 6156 bytes grbUNS.eps | 760 +++++++ grbUNS.jpg | Bin 0 -> 5070 bytes kodovi/BAFER.MOD | 56 + kodovi/MaxNiza.MOD | 125 ++ kodovi/MaxNiza4.MOD | 62 + kodovi/QUEUEINFO.DEF | 9 + kodovi/QUEUEINFO.MOD | 2 + kodovi/REDOPSL1.DEF | 21 + kodovi/REDOPSL1.MOD | 79 + kodovi/br10.txt | 10 + kodovi/br100.txt | 100 + kodovi/br20.txt | 20 + kodovi/br30.txt | 30 + kodovi/br30b.txt | 30 + kodovi/izlaz.txt | 4 + kodovi/nizslog.MOD | 122 ++ kodovi/polinomi/POLINOML.DEF | 35 + kodovi/polinomi/POLINOML.MOD | 289 +++ kodovi/polinomi/PROCITAJME.TXT | 20 + kodovi/polinomi/PolSuma.MOD | 43 + kodovi/polinomi/m2.mod | 49 + kodovi/polinomi/mnozenje.MOD | 72 + kodovi/polinomi/polinom.MOD | 58 + kodovi/polinomi/polinom2.mod | 56 + kodovi/polinomi/polinoml-debug.mod | 305 +++ kodovi/studenti.txt | 6 + skripta-spa1.tex | 2950 ++++++++++++++++++++++++++++ todo.txt | 203 ++ 32 files changed, 6352 insertions(+) create mode 100644 .gitignore create mode 100644 changes.txt create mode 100644 grbPMF.eps create mode 100644 grbPMF.jpg create mode 100644 grbUNS.eps create mode 100644 grbUNS.jpg create mode 100755 kodovi/BAFER.MOD create mode 100644 kodovi/MaxNiza.MOD create mode 100644 kodovi/MaxNiza4.MOD create mode 100755 kodovi/QUEUEINFO.DEF create mode 100755 kodovi/QUEUEINFO.MOD create mode 100755 kodovi/REDOPSL1.DEF create mode 100755 kodovi/REDOPSL1.MOD create mode 100644 kodovi/br10.txt create mode 100644 kodovi/br100.txt create mode 100644 kodovi/br20.txt create mode 100644 kodovi/br30.txt create mode 100644 kodovi/br30b.txt create mode 100644 kodovi/izlaz.txt create mode 100644 kodovi/nizslog.MOD create mode 100644 kodovi/polinomi/POLINOML.DEF create mode 100644 kodovi/polinomi/POLINOML.MOD create mode 100644 kodovi/polinomi/PROCITAJME.TXT create mode 100644 kodovi/polinomi/PolSuma.MOD create mode 100644 kodovi/polinomi/m2.mod create mode 100644 kodovi/polinomi/mnozenje.MOD create mode 100644 kodovi/polinomi/polinom.MOD create mode 100644 kodovi/polinomi/polinom2.mod create mode 100644 kodovi/polinomi/polinoml-debug.mod create mode 100644 kodovi/studenti.txt create mode 100644 skripta-spa1.tex create mode 100644 todo.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a1a539f --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +*.aux +*.dvi +*.log +*.out +*.pdf +*~ +*.toc +*.xref +*.nav +*.vrb +*.snm +auto* +*.zip +*.class +_region* +*.blg +*.bbl +*.exe \ No newline at end of file diff --git a/changes.txt b/changes.txt new file mode 100644 index 0000000..0f5bceb --- /dev/null +++ b/changes.txt @@ -0,0 +1,49 @@ +Skripta spa1. + +12b +------------- +-primer za polinom je koristio staro pozivanje UbaciMonom +-pravljena i single column varijanta + +12a +-------------- +-par bugova u polinomL su ispravljani, pa je to ubaceno +--PolinomNaN (Igor Sarcevic, student) +--Deli, Unos dodat DISPOSE zbog memorije (Radacha) +--Anuliraj brise ako je bilo nesto +-promene u parametrima za PolinomL, uvek da poslednji +bude rezultat +-dodata procedura SaberiNa u PolinomL, radi naglasavanja +(i izbegavanja) situacija u kojima se gubi memorija +-adekvatno promenjen primer sa sabiranjem k polinoma +-Stack preimenovan u StekTip, Queue u RedOpslTip +-jedan Writeln->WriteLn u demonstraciji listi +-u glavi 6 (sim-rek) prepravljeni zastareli +LONGCARD u CARDINAL, da nema cast-ovanja (Radacha) +-takodje su izbaceni i OK fazoni iz InOut, +koji su bili petlje da ucitava dok nije OK, +sto cak ni ne radi kako treba u XDS-u +-izbaceno Write(ch) posle Read(ch) u dva primera +u glavi 5, posto su nepotrebni u XDS (Radacha) + +11c, 2011-02-09 +--------------- +-iskljuceno je oznacavanje preloma redova zbog nezbunjivanja +-popravljen veci broj cudnih preloma teksta rucnim modifikacijama +-izbacen prelom kolone na kraju posto stane na 18 strana +(postoji bug sa prelomima kolona!) + +11c1, 2011-03-08 +------------------ +-dodata nedostajuca opcija u meniju u program u sekciji 3.2 +-promenjeno da se prelomi redova u okviru listinga prikazuju +dodatnim simbolima + +11B +--- +-ispravljani neki sitni prelomi redova, stamparske greske i formatiranja + +11A +--- +Prva latexovana verzija starijeg teksta. +-dodat appendix sa uputstvom za XDS diff --git a/grbPMF.eps b/grbPMF.eps new file mode 100644 index 0000000..5471d02 --- /dev/null +++ b/grbPMF.eps @@ -0,0 +1,769 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%BoundingBox: 0 0 120 120 +% +% created by bmeps 1.1.0 (SCCS=1.73) +% +/pstr + 360 string +def +/inputf + currentfile + /ASCII85Decode filter + /RunLengthDecode filter +def +gsave +0 120 translate +120 120 scale +120 120 8 [120 0 0 -120 0 0] +{ inputf pstr readstring pop } +false +3 +colorimage +df'mZrr)lrr;Zcps8Musrr)lrrr;fn"8r/tr;-BtrVulqs8Musrr.BDqsjR]meHSD +rr2Wks8)Qdp@e.Os8Du_kO/BKs6f4FrVHQmqZ$'PpAb*ks8;ohnGi+Ks8W#sq"4U\ +oDegds8Mlps8;o`kk>&Ss8MoqkN)+3rVucis75XRo^htQo_e^fs82]nq>('apAb*i +s6AnCrr2renGN:bs7d6%s6oFNrr<#am.()Ts7,^Or;6Kf/ar`>qXa:Fs8Vumq=Xdf +rV?6^s8DrsrVliqs8W&ts8DutrVuors8W&trr2qWrX]&.rVulqs8Musrr)lrrr;fn +#5nK"r;Q]nq>LTurr)lrrVulrI/!C&s8V`Xm,IX.lfmWoqtg*frr;EQnc/Rfp@J4\ +qZ$Tos8Dfos8;ofn+QVPs8W#ss8;oVh=:OCs8;Zls8;o`kkA_"E^iAm,Tn_ke)C?* +s6]+Eq"=[erVrIZVep9pi8Eo"rr;Zas8N#tlg+ +="#@Un*L)GnGhb8q-$j7&Iolb!"nJYp&G!jmHaQCp]'jTrqlNk!!!B,!"Al+s5rJ7 +l07m8pAYa;*s)HR;GgegQ_hjIf(o.Arr2renG<%Zs8N#tjQ5[g%HZ^MrVQWprU]XN +qYL!drr2rsm-suYs8N#trr2qTrXAi+rVulqs8Musrr2rqrY#/.s8)`pqYpNkrr;io +rqucpr;?Nts8Musrr2os#6"2enG2nSrr.BBq#0^Np#=rps8DutrVuors7Gm\H$=j9 +:0.Dos6f:GrVQU8)D(ph',hWar:T^^rr)kZOIcX['CbJh'GDVl!Y>kP*"<;p'bhkkrr;ESqVhtD +mf*4cs8N&dmdT?"kPP8^p@e:\rr)kKrpKais8N#trr2rqrY>A1s8)`pqYpNjrr;fn +s7uZoqYpKlr;I$&rr)lrrVuZfqYpMDlg!ruiTL7?s8Mrrs8Dufn,0Go]GMD/%1="* +/2nUj-0=4Ss8N&urVr7NX8r>@&eHHJ1edQ4s7#OX,U,8O";r7#18h(`oC;kYrVu6M +rVZWo<`Nc4!"]VL+2u1Jrr)llp]!fU=T8:!md9ra%j)/d)Tg(Qo'u_[!"S'UEirr;iorqu]nIfKEGs8Musrr)lWip-RBs6f7J +oC;kAip]`;>mLTL)AaeH+YW'Ao`+mi[BmS;7Sa!_s6T+IS=HrH3`Z4\)&3rAp%A@S +o)Aam**69^!!!b%S$;hgs4#Wcr;HZ[m/I%c',DB7"ToTCckiVaY'e01`&-i@PoC;h[rVtd2lMUMYs8N&rqu?]q +s8Musrr2rnrXA`(s8)`pqYpNkrr2hKrYte7s8)`pqYpNjrr;fns7cNmq>UEirr;io +rqu]nIfKEGs8MusmdBlLrr;NXr\H;p!!!T0rVuN]s$fFY!!!QH(+B1\s-]7OqYL6, +^W5^-o_SC`IXmi&E/e%*GmFg+IXdparVn,h6&h#,#RVeY?$#?!s7,g_qu-OlUEirr;`ls7cNmq>UEjrr;iorqucps8Musrr)lrrVulrs,2c' +!!!LYIZOsF+'DZ]rqufYjS8iW'a+RSmHji*f][g7MtZlErr2rhp&Fpfs!9'`^r513 +"!@aR-FphBItO?8cKPK=+uD8VlL+]Cp]#.,rr2s")"$no\\$9%&gmYZ'E%_,rVQWo +rVuEWs&E$1"9TAb,W>Z"s8;`nrqufgo)B"#+TMK[QBSQPqu>X4oh\Co$4%XV"W)lG +Pl1FYqtpElrVuiqs8DrsrVulqs8;iqqYgHjrVu`nrqqZQ*rQ$:r;Q`mrr;ios7uZo +q>UEirr;fns8)6Tm.Br@rr7H5lg=`Os8Dlq]"#Wh%ikWM&.T3or;HZanGbO2;#L:l +p@nRs%jV2Y(R12_aNE09!"A>drVQToqY^BgqYpNq)u9I4!!=>R&hO(d+2c.YjQQUP +&1Iqr-f="]oD&@]rr2ru'D_Y-TVAms!ZD7G)TBVIqt^9\mf3:brrZ$u&d&1JJ:E^S +oDeabs68_HVkh-;#q,cR*<,j8p@eMc<,M^;)ZTjRNfU"(n,N=brr<$-Uo1Hps8V6H +mIBlCr;Z`ls7uKiq#:UEjlKdU4s8DrsIb``8s8N&gnFeC`1CXd2r;6L5*%h3k&k,8nr;HZgpAaUMs7uKj +@:FE`"W@@@&fM]@!!!N,rr;.'M!!!`6 +"WR@;s5N5=1H%f^3__Ik90GL=#7)=M!#'KrM>-]Crr)lY:ZV-R#8[UL(:U`lrr)lT +hXpgErrN0?"p-#\@>+.:s"#Zm!!!lE$RZ&[*pW%jr;HZanG`Om'*JLP!!!?'s8Von +s7ZO7..Zs/o_/:b!#5J6'DVD'qu-Np!##\K+T23VKV.f]PXrr)ldn,NCbs8)Nj!!!uA +!$U[ks#2`9.k4.g;/HjU/2T1Yq>('\o)A[i&cr.M%M0ZMo)=rCTM\Zkkj7d9s8VNX +oDJOdqrn%VrpB^Zrr;ulQMq3kPMEc_>O<4/MB;2>m@Okiqs^(ao@a%ZQF95XJ6S$5i^?s8;cor;6MaR]d84 +,6.]Trr)lV?Z=Q!#kn<)u9@1nalbe$R-K/ +0j\:1q>C9irr3B<)uosH%MB_/JVrd_pAFsjrr<#tgACpLnc&Rfli-XQrdOnHrVulq +s8Musrr2rsrr;uss8N#trr)lqr;Z*Jn.H9O'b_]e:1=2#s7c-blg"E($i +!!jK6s8Duko`+sjs)e/7s6Ak;s8N&sr;Z3PoDSUek2l:8rVu!?oXVKOB4l3g +>@RjB$k!IU`l?=#qYueDUBq/G!!!lp1/n2Ks52Z4!!"#Q'Jbi8YP%Vhf\5os!#5J6 +(&.P(p%\PrATe7a(]t!Vqu?]Tjm`*Es.Q6hlg4'=s8LgQo`"milMgh_q4dk;s8Mus +rr)lrrVulqs8Musrr)lrrVulqs8W)us8N%QKTQKC'*&"F!!!]4qu?(%0)CPak(_m]7!!!h3VRuX$s6T@Qq>^KZnG"4X1_CHG!!!N+rr;`hs82fq +!!!Qc2+EjuWV,ubr;HZfpAaUMp](6ms8N&sr;ZH^q=s^^s8N&squ?Zns75[Pru_7? +g==mVrVuZap](0iqY:$hrVuHXrq5m_s8N&cm.1&Rrqucq[HSrql]mq>M$,rr2rsrVulqs8Musrr)lrrr;<`,6.E: +s7cNmp\t3err;fns7uZoqYpNks8Vurs8Dfjq"ssarr;uqrpb+0s8Vllqt^3ir;Zfp +s8TaGb"PQ6p\Fj_q>]sUqY^BnnFQQ<4%Gm7YlOkC&eQf""UEirr;fns7uZoqYpNkr;?EQ +jl?@?rr2oXqu;,sg"?6&s7,jXo(W+Wqu6Wr%O@&[sPEhm?s8V-BkktJ\rr;rTio0k7s8W)uq"Fafr;Z`js82Nirr)l[rW)lb +rW;`apAY'nmdBTDs'P[#rSc_qs8N&ts8VHToDARfoCr8;0gHNn/H>bb!X0G;rVu6R +qtBmdlL+E;pAYmG.e`Z;2`Oh\,=2SC-3+)c#S&+;3_^_D2M[<[hrF)#s8W#ss7cEe +q"jgbs8;lp!qu?[rqJbXs8W#ss7#aUp\Xsfs8VcerTNS:o_&([s8W&ss82ZmnaQ5O +rr<#ts6oCBqtg$drqufqs7Q!Ulg!^+oBuYYrqLUEXmJj8m`s2tt +":??&Kq7i.s82cpJq]R#&0(fX&7&[Tq#(*gs8VHRli-q_rr3T#nalbYs7>gXs8;or +qu?Zos6KZ5rVulqs8Musrr)lrrVulqs8Musrr)lsrr;Z`q>'gas8N&ko_JOds8Mus +`Q$*sr;ZZos6]=Uqu6Tr!u`7)3WK-p)BCO/rr;lqs5`D8qu?[%$QKir/#K5^qu$Ki +rVlj$)ZTmR!!*`0s8Vurs82irl0[p5qtfgQn+$!fnG`Ias8Vukq=OFVoD\dgr;Zfk +rVcKfrqufrk3;=3s8W#ss4Z;kr;ZfdoDJ@Ws6An?n*g#Ms8VlirVlisjQ>S's8Drs +qs3\5rr;ciqt'^`o)Ja`s8Vlos8)BZn+H;EqY:$ap&+RSrTWJ5rr5UBg">c_o)A[h +f%Jm[!!s&D)?9aI[CF?MpAaj`s/rZN!!!fI'efUf)j?Vm!!!W3!";Ip=cJQ4r;Zd] +6:\Ak]']%Yqu-H_oCDn\rq$-a#Q+Dss8N&sqrds+rVulqs8Musrr)lrrVulqs8Mus +rr)lsrr;9Jn,NCejlG_'q>^Kos3T*Brr2rjp](0is7uNkp@eN:J"AJQ;ABp$!!!`6 +!#"GXp\b$jlKn=P?Z((4NTB1"q"XmdrVlit&s/^!Wqr$Purr<#oqtU-h +pjW8CqZ$Tlrr)WhqXs[ZoCr%Nmd]T?s823SmdKcC9^o)BLD1&qD! +7nRJ7*^9W))3^D^qu?]jr;ZQjs5rS8m-jZGs8T[D_Z'T8bg"K(nale\rU][Ms8VrZ +khu=5o`"jfli(i#s8MrrrqufqrVulps8Musrr)lrrVu?So`+pjo^hnQpA=dbs75^R +rr)llq#:O%'lnAOr;?Tgp&Fserr<$?dEqA'*B>,]1D:HLkNV^*m.p>Krr<'7r;?Tm +r;ZQfs8MusoCDq[rVts>m/6h\rsIiJiqW?As8Vrqs8MeBnFZA>r;?3es8)Zlp$_M6 +qu?9Yq!RbMoDARfmdg8Prr;'dbrqufqrVuipp@.SGnal>>mIKf6r;HBerqHEl +qtp?irVlg\n+-3V?"Te*Yke4s"U?(K!#tt=*VT=/!!",]+?T8ls82irqu?]ns8V3E +nbiCdlKn^Kls8W#ss8N&urqLU.o^_hN +o)JX]s8Vfmr:L$hpAb0df\+[Os7bO5h>[HOqu-HTkNi'Gs.lNt!!!Q1!Z)1P-2[W? +Q^>5_!$Va[/+N<3oD/4Sq>KI@p&+ghr;HXh9k"PA,6Ir^rr)lnq#BgNoDejfkNUk' +s7--hoD\ddli%Rrs8Musrr)lrrVulqs8N#trr2rprqueFrSZVjs8Vu^m,q;H:I7?: +!<i8%M;YE$<.07=TAM(!!#t$#[m]89`P5K#SAa:/kba0 +s7cNmp&"dRmf3%Xs8)]oo(2VRs'Y^'rUKpcmIK`&s8D0LFlMC>Nqtg*fs8Dut +rTWM/p\"=]rr;$;k5YG\mI9f?p](-irur^M!!"&B">BfV2[Tsb!!#Co$s*FX!)!n< +AH2^.!nFZbXrr9+(`Xrb-0+%t:!!"6hGG"m1s6](NR$=`Mq#B[Fn,NFblg*O+ +qXFLaqWn,2s7uZoq>UEirr;fns7uZoq>UEirr;fgq!e=`q!@D0l0@:.s8)cqqXjIL +rr7HHrr6bJIK0?arV?J5Cm5A70FeFC%h'tNO/;@7s2W1-',2>Gk3N$Hs7Gs_q"Ogg +rVuW_q"4%Hq"+7[rVlirs8W)us8N&np@nRcs7>dSqYC0krVu*DoDedhkN;R:r;T_q +H2mpk!!"V_%nH[#4:_p"!!#Lm"]#@0;ZTl#9`P/^&JeO[(0:J949,@A-ST<9!&t>u +9*,Db"q3a##rrM/4o,!To(2nQo`+@IpAY*jrVuH`qr[qYkjIros8Vliq"F7Im.'T3 +s8Vurs82irqu64Orr<#ts8Vups8)Wm!!*iB$7#WR+R\^uoC`.Zr;U)2G5qXc"9KqN +!%%R=s7c0cki2XAqYpNq)/3]0s8DusnHescoDejerr2i]r[\$Arr;Zjs7cNmp\t3e +rr;`ls7cNmp\k*ds8Vrqs8)cqqX3h;mdKH9q=O[^,O+F]md0e2MkU1O)>Wn(o^;`F +4'_gd)$U0[s8Du5^W#F"m/I#&kih=3rr;lls7#IHqt^0irr<#ts8W)uoC;hNIe<'q +o)AUfnF65Ip&Fj_s7c3dk2cC7M-D +!!#%k'hnZ.0E;)#00*:$T"=Rns#3,`!!5Ie!'1`/UEjs8VucnF$;Qrr;uhqu7l2 +nb2bPr;?Hls8Dt5B7:X00`:\FlK/'Gqu6s,))X36s8McmIcBAJr;?QlqYU0[Qo`+pjrr<#en+ln\s8;iqqtpEkr;UqaQ3@F>!!"Mk)eB!L9G7kH$3jc> +!*TF(<>#dN!WYmo!'^u+8r\tIp\k-ds8V9PrU'CZ!!*]W.9VIebRG.]&f"LY&QAu@ +8I#Ml#mj$LFt6l!!%0NZ<;?=iq>L?js8W#sqrR#%na?/Or;Zfqs8Moqp\"=\rVQWp +qtpX8h@8^$:!!!l:!#u[e2@^3REGq0D!$s9L1*bq#0LFp@%POqu-Qiq>ZYCZO7-q +!!";F!%SNi70j,m"U%d>&n:nA8H8`^#R+61!)*Lt8K&LJj5p=9r;SH/:..]T@;0MQ +Y,:mks6]CWB5F=C!&Xi^63%!H$Off2!'UPj8H8`N'GX@M$p>.74%W+]p%n^as8VX& +p&G'gs7PdZn*'QAo)A[es8W)ts%E7hs8(sDj8&QDrr;lps8Drss8N&un+-8T!tk_? ++U86$&J6l;(d*7pU&=celfnES"t0]Z,7k;4R?joRr;Zfqs7Z-_jPoA%r;Z![$NKu% +s8)`or;Q]nr;M0Frr)lrrVuins8W&tr;-HlqZ$Tns8MoqqtL-jrVuEXn+QMGp%A(O +o)8Uds)W.5)AaqD(b>4Jr;ZcrqYL!Zp$_q\qXO.Cs8Vrbna,c8m.0c9s8W∨66` +qY^Bnp\Opes8Viis.ZC,!!",A!$_ID//T:"%1Yc6%RkgN#X]4=:B1AT*$&<#'itJ= +6id&45nO]5 +&._tV%pK/>9EG;a"U@?o!&>'!4uGB/q>C9go`+p`s8Vrqs82imp]'jTo_.tJrVZEi +s7l?amdNL5lL4<0nFGuAqY0d_rUfg`!!!mlLTB_*s7Z0do^i*=LSb%O*!cfo"9KG> +rVu-Fp&G!jq=t!gr;Zfrs75[NiVk2(rr)lrrVulqs8Mrrrqufgnc*iVMBsE*(_eVY +/PCqRUuU;2q=agfIf'0Fo`+sgo'l>Cmem+_rrE*2p@A7[p](*bqu?]np\4.?khbn$ +kl1STrr)WjrqYmHkPkM[n+#o:nal\Ys5`>5naui/.6nO^2$F4;*[+8b$:#1:9E5&S +!!"\R#q^.DQE%19BPruUGbZ<&:]USQ!!"SN!%YOeibN7i:]1+irqufcn,:2CbeV*@ +2EFbF&2O:d.0'?!$4B6'!C[_;?iU1"!!#ao!)j12=oe_#$P$)R*aJaG2$jXQK7'NO +de*S8s7c!^mca&.qJ6!&jlX5kk-To(i;40gk^7s3&g]O-I!O!$5rpNgQB*eoM +!WuI'!E9%!;#pbq#7=<<&QAi75mRKM(_/fNC6RuGs8W#sj5KF[g"u`.rV?Barr;cl +s7PjOkOnW;rr;]RkhZ4;r93DBq>(%*'e^%,-34/a"9f_\2`XFsnGN.Zs8N#tq"ap` +q#13ls8N&uo'uGQrrrE$s8N#tq>Pj@rr;ios8)`pqZ$Thqtp!bs8)]mqt9UWlg"'? +rr6tWJ7N/4lKeEJr;YF&lV1,^"9oSI$Q9!F$k!FXjlYn/rr;uts6f=EmdTWDs82Tg +o)8U\rr;WPkM#q8o_J@Srr;ips82]lqYL-cg"kT`s8VBQs&WHN!!"2C">2tI&jQF$ +2#me=!!P:^"??Mc3s,OJ!s(^j!]r1s>R:os!!"\X#X/_02t6M?n+6JSs8VW[s'8rO +oCN!m]"J(CqYp2;G]S]`)`IWns5iV]gVr9iM#jo>;Z91i:m#SmOF&Vc%'q>('XmJ$Dur;Z]ps5iJ7qYgHjrVu`m +s8;oso_8@Jk3W-Is5iA*rr3f4rV-6hoDej_o(;)Br:':Jk5>2Ns8W&ss*jV3qqKlg +-7(O>SZhtis8;iqnaleJnbr(Rs$o^]!!!B=&0N,=0^.`mp@eLSnFHSYqq^2^q#'R6 +hTtupmJd.Xm-j*9s82?Xo'Pl7rr<#foDJLbs*fHe!!"2O&3q0W=o\O_!!l-r#"8Lq +70*Q[!sD!p"%<@p7gK)f#CZ_B`lRr3ir9`-=;r/`!!"GZ'e?u7`o,tBqu$KOi:?jF +s7H$Vs8V`Zmd0uMs5`&:mdL2Mqu?Kls4lZ-\A6_hrr5;XFoVY/!!Gpp"&].#j"9;L)!*0L9^KMitCbVs8Vmh&`o_&7QnGi=\s5iJ=qu?]mrr;TarrrWC!!!S6Y.jmarr;lns4c>crr;rYki)O@ +qVpVnrVu`iqtemqg]%3PnaZM?kP:aA]`J3`!!"Q#.q\h^7fWNZ(E%#i"'>O(;uctu +!!,pu!Drq!;Zm)$#67p3!)ZKcL07]AnF$m::4"9;O6$"j5<:]LJg'bspn*``OS2uiq)!XBunH'J!us8)]onb)qZs8VHU +o_eaho_.tPpA=mgs68b:s8N%PK9#s/s82]ne^`V'r;Q`orr970_BpZi!!!Q8$6)`; +@eom#rr)lgnGh"dhsKe$rr3T&p$hVHmJm4[o^qMMs7lQlq>To5s8N&emJ?5:r;QZp +!Ws8>!#9g,OSo(Wp\OpVn,DD3o_JFbm-=TQ!>cn%1B.7PiSj,%s8Vfeq>UEolKmj3 +qYC-js8;fpj5]V-rVsC:aUen2!!"AX%7Uj;:&t>e#6e6=$t]VE?iU11!Wu^0"Bbg/ +=Tnk0"p%p5!+-%]!+H67=U#$qDJuG(J'&60-@lfnHBo)JFU +s7Q$^s8Du`jo:'bZNU=j!!"nW!&X`V1Dgs.!!#&;2h;8C?314:!rus;!,D`Q2%QaXj,6.gF-6XX%ZaA*Rq>^?ks6fFW +oC`.WpAam\r;Z]pqtg?mrr;lls6/V8qtpElr;ZE_ruE16&ecPk!"pJ$3=uoQ!X'Bf +I$)CcfhP1Js8;osrVu3KnG`H:nF>lAqt9pcp[n(Fs8W&nq#16ls7uEhrr)lioD^g2 +;'$c:!!!i9!#MH/])2L,p%\R_r;ZZis8Mrr!!!Z2rVulqs7uKjmdBfCq#1*fs8N#t +mHs`Fq#C?lrr<$4#R)=T![SHh5nFDs$jf`:##td-g1>RCI>$3F<0!&YT0:^$nl!WYan!^$_p3=cWX#RE$h"ZHPa1PL@YZEMQe +]Zu+ZPlq(5*>V6N!(%5(;@j:8'GFII!C7;1<>$$O!!#Ll"C)'2@g2sH"p&BC!+uQ; +@gW3D#Qe65!*0(":hp%29*>;h%Lu5I'MT#G5lq-E!s1(T!$i'c2$jR>]XunkpAb'g +s8Dips8N&jo(W+\s5rG/o'uPUrVtg6m/Ht`V5Ca8'.3b['/qjG_o:KjiViZOrr<$: +$3qa^"s6"^p!!,Cd!C6\e561dN +!WYUiHiQ\?!)3Rr80K*Y!!"\S!'_,/:]LJR&edP2!$_^Q0EhJ6+WOAd"#0cU+:eo- +!!!ZJ&i0Lf-Q*Rp#6INrr;ucId61\s8W&pqZ$<`rr;rs(DJ5V2GF,Is82]nhr"=Y +d-h5G,QIfZ%1a]f#93^D'+kd"!!!N.rVuBUrVlfrrr2r^l1=T@s7Q'bI=6qR!>,\G +*X`8r%h'gE1f5#'1bpd_'br_K*^qM-^Kos8N#tnF-#Lrr;fgs7Q$arr)jsUs8N&inc&Xj&d/7S!!!l:!$7Jm[J9Lr +oCN"ZrVq@uQlmS32E=I.V6g.!s68e>qYL6\n+Z29o)A[hrr<#qqu?*Pq#1-jrr)lr +r;Ym=q=jR^r;?TboDeU^s7cHko(N+WqZ$Bis7Z?ikj\QDr;ZG=rVuQhs7Q^Kis8Us>nb<(`oDJX[qu?L?]oDe4Hs7>n1s7,[[kir-5lMpMKs7,UYr;?TSj7rQNs7Z*br;-Hdo)J:Ls8;`m +rrE#ss*jV4pAb-lk2c"1rVn2j2cj*u,U>PR!#kq=+q+l8%1G)5`U3Hors8lSrqcZp +r;ZE[s8Musqtp?ls8Dutqss7Hs8Dutrr;NXpnFFa!!!WD%OhDY)[6Hk!s0YK![/F! +21pUSqu-Q_nGiCbs6]4HrVlirs8VrmrUomZqL8A>r;QZhq"jsgs8DrsrVccprVuip +s8DlqrVZ]mrVuQds7lWom.1/Do`+ggs6/kAq#:9gs82Qjo)&IYmIoZ;s7G(,htd

^$Yr:g'fr;Q`iq#C-ds82cpn+$GHnc.nArql`qqZ$Tk +rFZ!#q#C9ks8;osnb;eBo'PrDoCr:`nGN.Ws8VQarpBFXq#CBfqu6NnrV69\r;ZW_ +p%\@_s7H-em-t&Ip&Fpds6/\Hqu$Khq>^9fs8;fprVliqrr;rqs8MrrrVQWjp\Opi +rVl?ds*jJ+p&G$kmHs]V#oNgJ)#sXQ!s0ZK=*a]?s68bIqtg)B9ZI[[Yqu-^Kdp](-js7H3\oD@tGq;h2Ik5,,Gqu?9`s80[UbehHN +aj/kW][4jHgAM!Nr;ZQaqXF(MnbW7bpA+^Snb;YLs2)b+l0SHIrr;cks7cNeo(hhI +oOdgprVufqs82inqu?Ngs8(C.h3b"4N0freO-Gp"U@nKbr;Z`ns7Z-]kk>#?m.BK: +s8DH]rHNdOEcd:SBn^JEN0KX/q"k$drVl`oq>L?hrVu]ls8;lqs8Dlqo'u2Ks82p\+L[q#C?ms4uJs!!!ZO)`:AbD#F21QBo/k$8Meh0,>6^(`"\#qZ#jEoD/1[ +rr7HGrqQ*XlMLPLr;6U0fs7?6in+HYCqu8JE +p\jt#'H[ep-3+#`%hC*Q5>h:Ss82firVuEes6fmdnG`IZs8MinrV?Knqu?]nlg*g7 +oIp+,n*g)OrVoG]?MjX"!WjDC!$;OT/cYkq!!"8E!$:t1s8Mrrs8N&`l0eQ@ +Ic]_Ms8Vfbp?:Pri;`fVs8N&urr33,&q>:ikiVmCqZ#[=rs8rYqtg?jr;Z!Gs7uQl +$k=Kt)CGI`s8;olnFQ#4mcX9;o)A[drr;lnrqZNmqYgHjrVu`ms8)]oqYgHjrVufm +rr7"^P6_RP*?R]]&2G(>2#dFQn*g)CIe37(o^DeZqYpNnr;Zforr3-.-3OQ-%hLi@ +(Hs2m3r]0Srr;?\roa(Tl21MRqZ$?]qX=:\rXp%n(E51G(c_m3-D7<;qu?QjrVZQi +rV-*`p\Xsbr;ZEcs*&jR!!!r<"""!J+92Hdp\FjdrVuTcq>^Kiq>K[Xs6][_1@k;A +rr<$-"pQ7P!$D7A*AB3;qYUsaq>L>@J"d)N1(Y!`',*kC#WMYXs7Z3ep@eLcs82ThmeQnPp&+IWqu6j)*YAo@ +)AbdD!%0if=8Vgnr;HEhs6oseli7"Os8VTgs7cNkq>0p[q"OC[s8Drr1A^kFs8N&t +rr;uss-K.P$k4Al]@4g@iTB>'qu$Kco`+OSs8)Njs8;osrVuN\rVulsro+=cs8)*L +jmMO#qtg$cs*b=_%o5o%!!!KO*]*s")$gKl"pQ1Z%4>"MBt(Xukj/5[^?M)!!!W8"W[XI*>0&UEcp?V8AhYR6?r;ZZ_o)&=_ +s)E+M&.h;>$:tsG;A0U3j5U+;qu?Tms7Q-Oq#'OWs8Dips7l?g&Igr)!'(;c7g/lW +)AUEcs8V]js7cQlrr2iprs&GooC)8@nGE5Lrr)lrrr;iks7Q-d +/MBMo,rp]CBs8Vuq +r-n;0q"spfq=jpXmf34]s8;iqjlQGsM4QXc9`P2/&JQO0EIduds7c9fqtpEmrr;us +s8)Tlp@eL^qZ$Qps8DrsrVliqrr;rsrr)lrrVufos8)Wls'&c`!sCae!&P?#71]qe +]XcPlqu?Hbqt^!]kN1k+rr;T\s8;fp":kSf!<>@p$!@6.:E:*Pp@J7_If'';s8W&d +nFcPPs82ir]>;kp!%Jg%=Tnh,%1HK@C7u?A\^_ +3<0%D!!#+]!&i!AoD8@aqu-H^o&]oOo`"mjq"k$^o)Amr3!K@P&Ihk[&m,>=3VrIL +r;-HlrVQWpp&G'bs8Min&H;_.rVuEWmf3=aq>0dUoC;hY6hpHQrr<#trr;oqs5`>6 +p@nU^q>]mPs"?*!:/GX)!#bh;(E+&B#6Pn@p](-ds5i>.s8N&np\b'krVQQi?=7.9 +qYpIYs7,XVq=t!bp](6ks6&P>r;6NkqZ$-Vs"H2mdEpbLrr;rrs8N#trr2rsrr;us +s8N#trr2rsrr;uss8N#toDT^,qu-OT4D+j*8H8`^#R=!-#lg='p`W,ud!!POd!Cd.o6odA@o(;t]rr;utrV-0Yqu?6`s6fLUrC08(!!#Rm!_Fd#tb1!5Q_UEjrr2iprqu`os8Drsmd^/Fp&>!l&fDQA +'GWD(!#ups5:\9Wo'ubWqu?Tms82^Ys8Drsrr<#ts8DZdp&+[dda71a"sF]o0)ttk +.jmph!$D7A+U%io&I^K+#r+t^Bj[s7#mbmdp>S +5!F&g!(mG!9*]hK8-/cVT:O9uo`+[`p&=sgs8W&rq#('ds68bI!!+eS"[`A"9E5/\ +!=(RVpAasas8;cgs8MThs7H?kq#(*jqYU6js8)cpq>UEjrr;iorqucpr;HWprVlin +rVufps#N59!!!]A%4M8W+2#8EoCW(^r;ZTgs8N#t62:6TmdKfHrr;uts6oLIlfeBJ +qu6Zs)h!%#A70rg!$2XX1+=JB&e-`!!$_ID,6@ik$O/5DMQb@LnG`=brr)lKrdObC +s"l]H"U[p'!)^Ems8W&ms82QjrVu]gs7Z1-js8Vums.Q*g84QbUpAaUKs82Wlrql`JeaWM4s0&NEH$5<@7:62u)=Hkkrqufe +nc/Ues4@64qu-OG0O4hh9E5&i!Wc(#"?pX?OSf%Wq>L6eqY^9is8;osr;Zfhq#:U* +.K]Z@"T_^*!E0428EoI?rr2pnqtU3fp](3lq=t!br;VkGWrN8S!!kjj!D!@u7hQP# +naleXqu?Tnqu-QhoD._Ls6oOTr$j.)"9D=)#>G4!643uhI=&'lr;Z]pqu6TmrV[]1 +r;Z`qf[og($p4Lm63%*X!!5Ch$U+=^s8N#ss*jkDqsXFZnc/Xcrr<#pqu?Zpr;Zcm +rr;ios8)`or;Q]nrVliqrr;]frqufrU85,/BmomWs7H!aio:"2pAaXLs8Moqjl?19 +r;ZWhs-K%ITV/=7eDBllqgsHV"pYQiKT+*tfCee9rr)llp]'LAq"FC\rr)ljp&>@* +(CTg)rq,j^n*g#Mrr:UL4T#*W+='eb#"esu<L>HN1U(R/cZ/C +!!,Up#=o"(1%Fl8qYL6hrVZZpqXF4Bqu?3WqY_NY=9Sb'#ma9+!'^r"9P\@2r;Q`o +s82fprqmc9qYpNns2`7D#n&fp!^H_f7fWTW"q3]co)J[err7HErVQ'[qXFObqYpNp +r;HZprqufqqYpNkrr;iorqucpr;HZprVlips8VW]rVZZp+<`V@Wkk0p\:/q!9hoOm +5@?&m8K/L(/1Nse!#5J6&;l=4rr)lhp@W-8C0=bE8P2Ya$kN^P%fcS7'GMU(CN[G. +b51u7o_&%\!lXmh_Sk:/rr<#sr;#sUs8)coqu?Nls*KBa +!!b1Z$Ut1#:(%J+!c"UdKNi;`H@rr7HGs8;Kb +qXX[dqu6Wqr;HZprqufqqYpNkrr;iorqucpr;HZprVligpA +*to>D!!!uL$SDDZ*XMus"p6%L!#Qh"1i7&Xj5TY.rr;uts6f@JoCMkYrr;KWr;QZp +m-FJ.NgqFB1B[gl:f(=)%2TEFp&4=Io_e[frr2rLrdObCrs0#p!!#@h!E]L-9`\6NI9`$k6#5!%[pDs7uKjq>1$gs823TkPP;Lo(i;"'28]7 +;\'=d\TV'%#!%e0P63e!"!shL##X$G[ +n*B96s8W&trq63eo`+sgrr<#rrVulrGQ7[=rr;ios8)`or;Q]nrVulqrr;ors7Q0e +r;Q]s!tkqL+UJN#.kF4>.7aI>+r_=\G&ippFd@K'Qr6ao2)@f#qZ$?as7lKpA"[cr;ZZlrr2rpq#9j[ +s6oRUrriNh"9DC#!(R/$"%a1:<\#S(r;Q`os8Drh,5hBI*o)&7_rr)l] +k5YGXs6f4QS!UVb!#uR[0EM4t$3hpi$SDDZ*eAa2q"=ZmYKR[m/-#Ybrr)lrrVtLK +If'*D!s^^d#>P:"<^!VqYp^%5Qh*c#6dp,HilqG!_O:E9)&/]o_A1Rp%SLcs8Vurq"=ZI +NNW<^1B@\N!XV^(!^m5#6E-s-p%8:arVlisq"ss[s8Vujq#13ls8N#ts8Mrqs8)`p +qYpNkrr;ins8;iqrq6*`qYgHhqu?Tns7#X[/MKNl!#6Io3j\NoD\^g +qtg?]n,*+_s4@7!qu-Nq"Z6Dg:BU]#"9MU)!'USm0)#)?o_A=[qu?Kgs8;osq"t*$ +]?13X.0KWE"p&!0!)s(,8:lJdq"aphrr<#oqu$0fqt^9er;TJkC]FPl!!Paj!_ib! +8HK#On*pATqu?Qkrr2rrq#9p]s7,^WrriNj"9;C/#ZUs8!D3=l64F8dnF?PNq#:#: +q>^Hos8)cmq#?/*W$rr2pN5!DR=!"UEns8VolrV-?hq>^-_s$fap +!!P1Z"@E.j9`P/_!sLRCjo>8Us82`orr;rlrV$'eo(2_X"U%'n!)s4-;?M@K8co&^ +'+dV.qZ$Kns7uHgqYC0kqZ$Qls+,Zq"U@'g"%<1o:&k>b"U[PGJ>Dl1s8Mrps8Vln +rV6EmrVHEkqtpEmrr<#tr;Q]nrr2ips8)`pqYgHlrVulos8V*@l2:S]5snEX&Kh&R +&/cH@qu-Qoqu>g=rq5m_jPiDup@\H/Fb:GF+T;9=qu-Et#mgP1s8N&ulg4-:qYp9c +rr2rtrr<#pqu?Zqs8N&s!!**!s8(a:h!+1err2iIrdObCrr<$P!s_X-"C269=TAFb +"U?[Uqu?Nls7Q'`rr2rmqu??as,E,6!!">L!DNXr=oeY,!X;,)AV9jUs8W&ts82ir +q>^Ejs8)]o6qh(n$p+Fp7gKH'"9_C*$p<7up\apgqu$Kns8D`kpA+aZoD8Ij"@*(i +U>Ar;?Tmr;Zcqs8W)rrr2iprqucqqYpNkrVufos8MfkrV-3g +r;Zdr='u"/%K$/)p\OpWnGiIas68bDrr)lrrVulrs5`8-2`Nttr;ZWjr>Zh"k3)(% +o_AFcs7,[Sf\#-]rr;uts7H![gtgles8<`O']7p)rr;cgqt0jgrqtCIIf'*D!!"_T +##>F*?3^X:!WYLl$8MGVs8;osq>('hrVucos7cBiNfg%9!%&'Y;Zm))!WlO+"@lHm +FSbk6s8Dutqu?]ms8Dipq"t(Q6"%rk*3QB,"r;6Nkr;Zcrs7lQd +q>^$WqYp^$63I9f#R+*03Wi%V!(@8$5P"FGr;Zfqr;Z]ls8Vurs8;n0AVp]u4ob^V +":A*/#"et'5[@ZHrr)lsrr;uppAY$drqq6Err;lms8N#ts8Mrqrqucpr;Q`mrr;in +s8;iqr8d))r;ZfZl0b:BY'tt^mdgAQr;ZNfs5`51rr2rnq>]C2kj7^-rr<#hoC`+_ +s7c6e3&aD9#T\SMQasTMbK8Z@r;YC!mCp6]XfK6iJs7&e,QIfQo()_No_e@Sq>LEo +s4@7!qu-Np!&=T[:BU]'"Tqg.!C@)#1Ah%MqYgHnrr;fis8;osqu6V^R]?Dg-5-np +#6J96!EfC'6qBm^q>('jr;Zfnrr;for;-Hdq#<'.;?-kW!!#4i$WmB/7f`]JZ*M[Q +qu?Qks8N&uq#0p^s75dXrriKk"9;F+"&K1_"AJsu7g]Jbn*pATs8W)ss8W)us8)co +qYs]"HisU7!!>^p$WR338cSuV84[Rpqu?Zns8Mohs8Vuqr!NH&s7lBhrr2rtrVleF +r;Q]nrr;ios8)]or;HZnr;Zfep%J7\s%lWt+!WB^?hs82Zms8;osr;Zfprr;rrs8Mp[rr;ios8)`pq>UEirr;fns8)`pqZ$Qms8Mrr +rVZZlrrN0U"p@^)!*0@*<^Bn,N1_s7cO@(IS9(2'!<;"TV@4&7GYC98&,/p%nX_s*jD, +qWmeQp%SLdnbW7c"t]fT1_(3p!!"q[#s/.o/bf;FnGDnRs7Gp_mdL2KmJQuZ=`k&a +6NI<_!s2@,"]>L(68'chs8)cpq>^Kkp\adWs8Molo_AI_s82^Khr;Q`s#CZm_'EA%2qXslfUq/QD:]LJ5"To\E!#5hI)Z]pK +5X7s;q>^Hoqs*P4rr<#`lLOfIs8MusoC;k[r;Zcos6o@Tq=t!grVu!AkkkARmd]H> +s7cQeqZ$6gs7cEjqY0sep&+j\qZ$*]s6od`n,*.Tq>]sXqX!qLmec_Ls*XS9s7cNn +!%S0P5l^mM&dhVM##-'O;"X/TqY'sdq>C-eoDAFVrV6;1BS-Ef.N8ap*t;]_!)*h% +9G\%#s7?9algb#Qq#C'ZrUBR]p&>d31BRV9'b+1D!($Yd9E52fOI*rWoCr:boDejc +rr<#qrVu]jrrWET$k>IM!!"tY!&b2o4p_TOp%n^YpA+Ucp@J=PnGi:Ls8Oc:=9&=S +!!#4e!`'@6mJ$>Eq>9dYr;?Tp/M&p_!"K)2&/Z$2"TT\S#V.!1)a"*#)DNm8C1r#D +-T1o&s7H!Yp%J7]rr62,B+PRs"To\H!?Se[e+r_;q=jpgr;Z!Dp&=sjo(2PRs8DN_ +nb<"Xp&=d[s7c3dp[nL[o)JCSs7Z$`o^DhNp&Fg]s8)6\o^hhPrr2qHrr;lprrs-" +!YnE0#t5.<<<*@p!"1s-d.68fs7cQno`+RSr:0[as(?"n%gb0'"%E7j64!ij%M))1 +!%.7.s6oUJr;ZBds7?$ap[%DI"UHIa&3pC-6N@*I#8Bf2&k$Y`ScANcs7u]po)ARQ +rUf7Pr9aLe!%AEZ4;%aF7MlG*(C6+_">'ZZ +6O*li"Tq-m!&=c`./s2Frr2rrrqQHjp%eCSs8N&urr;QXp@IkMq=sscqu?0UoD&7\ +r;Zfos8Vurs82irlgFH6nbW1\s7>a[?X.R]$R>iT+USE&`kpbbqtU3jr;Ya6nti.f +rr2rrrr;uss%uX!!s0)L&h!_[)@-Hl!rsP0jo>>Ws6AhJrquf[kOk"$RdTY9qu?]c +s7bp\p?qtTmf3%Ls7l'_q!\7Xnc/IIp@.\Rs7lWopAY*gs8W#ss7lKkiTU+<"XX3\ +49,gS!>e<-"#9k*#;<4Cht--rpu_#BlhLMY;HRTD&2Xe%63RHZ#73d%$Te=g +*;BL5p](-Yr9N_Jlh1;TlM(;Y!ZV1J1B7\?!"M-q(.&!+/OiTSs8;osqu?]hs8M`l +s82irqYq!10G+dX&.:i;$q:3s0)tu"g!fWjp]('_s6oH+o'H,Bp&G%:.mOFP2%L6f +#m`p#!&srY-NF,as8Dutrr;iko)J[`s8;corVuQ]q>C9mq>^Kjs8DiprU9FLr;Z`p +s8DinqVL,ghr*Sprr5/G8eDUYrqufoqZ$0Vs%Gst(DAVP,=:PQro2l0rr)lrrVuN^ +s7Z0dkihYf*#gC.!"t]cZ2XY#rqcY;EL'$ZB)_Z,h:h[pR^)nn&g\eYrVcc\nal2K +pZqkNli6YFs7c!^qXOU`oDed]rr;Nar;6Noqu?]kqu?Qms8;osl0S)bceSR&*<6Bs +!!b+_&ifpr.ffu)NL$EqkNDU>p@nUUq#Bg@m+s4@1H5@7'`\4]&e[S4!%nTf3XQBK +lLb,Ns8V9VmHXT=o`+s`s8N<=0E;,'!!4hS#;lJ_.g-87@W$k_qY][Zp[A.[kPt>5 +q")hul2V\F!#6^Y$R#Kg1&r%@!?Nr$ce@7Rr9OC_nGiI^s8Vrls"Q)p#QcCW!&"BR +0,+\@3[5J,*>:!kjmr6:nc/@Us8)Q^kO&Yt7B!"T]s!&.C8n!#uFT-P[:D"9TD;r;ZKfs763b +n,MtKs7Ps_q"=[bp\k'equ?Qis8Mrrs8Duqqu?Hds8N&ur;Zfgq>'"3lCXcPS=QjH +PGk+I[\Th4R@gP*f[oltp?qtBmf2/3s5NPJl_1heTXD51^sBX>jeTH0ZcpmaZ``SB +s8(XQkM6*sirA>ss6/GArfX^u[FX6Jg?#]ggSi'3Ml!55Z_Z.OiR.\Zec4I47j8.U%s691Um,I\ehs1.-m/Q\4pu1N^Pl2CSR +s8MoNf%U0%s*]*F!!!K>&1"s+f^&)-q#16]mf2nJs8;]mrqudL/OBjR)nW`&rr2ri +o_e^fs)2e&!!!Q1!#5J6)$U-e(DA\6"t9NP*ZQ"W)]1G,94J;7*S]<5rVcbFqZ$Bf +s7ZEjq>L6fs7uWnp](9es8V`ks7ZKmp](9hrVcZjrr;ils7Z9goDARZp\4.Op$hG< +m/I"^r;ZZfs7PXRj7<64mJktts3&pla4^L@f)OO_s7=e@p!3U*bl?\?s3?qhS9`8( +>-:t&VbKm`:HOn20o/+YO]+AkNE%?J4re,c4bH0_I6&]n+<#)/&SV=cFpeXj!"*KA +$Z5q[H3t[E(]e1M$Z6OnHQ`i8',l-:$Yp(aF:]F<)&7-0*-We^-Zs8)Njrr)lqqu?]ns8Vrm +s7uWnp\t3cs8Vcls7H;>s7HI$&onQmC'b]"&eoF!'m:AuCCqD1-j=?('RDA3Aet\k +*!p[(#'(4[FUT.A(_:s'#]U1_FqYaB+rtbP+^HHI==laI4\&sKnc.eJs7$'gq#'aU +s7ZEkpA^D:ScAV:s7Gs`M3"Vf3E#nX)ZTjU0J,h[P,e0Fs8Mus[C!gMrr;uss8N&s +r;QT`o(2n^"o\E"rr)lali6t^s8Mrro'l\DkPtJVs6JqKq=stV5uI(8q#C-hs7ZK] +hs171qZ$Bks7lWoqu>d9h]pJrnZH2dcpecS'HtAMo0jp_091W=$D0r+(ZN3 +?Pshp*ZJ`4(2"HuC(h4s&/]X-$uHCeGSh0@*sca&%sB<,C`*k)%g$)<)gi#'EW?8Z +!$$e+&:FfjFTiS6()DB:!bMNaMC9'R#U=[0%qYeiG8i)G/M:Nj,$6*DBeCE1(`m'& +-YarBYARTmSRkQY?AcjpONs\K[uH$RP_d5DPKfYP\VQm,U40G(KY*A3cD-03QAWYH +I_CP?R9a6n?sK+#BVT!2L.!krr;ii +qt0mfrUfdWn*p#Ep](!]s7Q$am-=WMr;ZNas3&O@4#p%C#o`jE&H;P+rq$0ip&G'g +s8Vurk2GM&r-mAYg%YO=nc/!N`LCP-@3&Ga(g@IiBFlD1(E%9-%r`*cD\*:q'G#:& +%W`EnD\EP!',,U-&9JNmD[Z\Z!t]Pe*.8k9C_$b`%N'4*07>8jAe5kk%5NAX/:/KK +?31^I#U=I7)JKsVPt"oO2epf`1&fMT=$jn)_Yf$M3'O1tkBG`.1(`uum4`N,kO_19"Ss-ICXj!m"pt4[- +j6cm6eb%DQs5i\Kna-;GmJle>s6]7Sp?2JGk5=`Cs8U*bbj>,moDe=Ns6eV2fB3"m +k^NQth"9e!s8V<\qr7>DkP>)Hs8V`ks7QEllhL#/mcX9CrTX1Nl2LGHs8UdAkiVp< +jo+]8s7>g]o],T&nc.hAqr?MqbkM/%jo=6(s6AG7g@G:4m.ol(kM?1ZH!!!!W<%O),f+USf,%1XTu'RhJ7";Y$('grVulss7,aIrr;ie +p@4TAS%H>Ko^r'(Fb'Mm%LECZ'G;bn!##qT,tCC.TqAg;al/#/S`Jf*r;HZjs8V3Q +p[8(]`9Ph's5_)tcE6iN)K$c7E?5g9)?OIU%!3-bD$_#2*XI'1!-8hSD\3:s(Od'C ++;])A&nMjh]k,d_Fcg^t`hYOqEqoe=)lh(5WhX9_"s8D]ls6odY +mIp5Ks8VEWoC)GLoDS^Uq>]m\s6]dbn,NFSqu?!Qs7H0fq#CBgs8Vcls6T^Wo)JaG +naQ)Ks-BUjDL[_H\BEars7H?kj$rS&Ks8VZis4HW3^sh:RHAF.C<]a;lkl:\G +rr:jIs6K[alM:APs8V`jpA=m`meQ))o%N[7n)jH-melDAr:B[\q#::>r;$BmrVtp8 +meut]o'cVTqu;>)QmF.@%1j[++uTE$&/,[#$k*%PIO5!ms6&V5q>1*hs8)B]oCr(U +p\=S++!_U;+92BM'GDc,&h#e#:s[AKq=aj\nc/Ucs8;]mp@J=`qu>:%mH=$:nGiO= +p#ad(jk'On.W73T?5X;e)&mZC)0I,5B,;>%*tMs#!)j.=B-J^E1.RL)GJ/I*lE8J5 +e)12`Ic17birA!.s6]R\mHX8ro(Li8r8%5DeGfL3i;2p!s8D6_s6]jdm/R+Ip%?u" +kOefSp&G'Vq>'=Us6K^bi;`hM_q/ptZttf*NMOJ]s8UR2s5a(Wl2Ue%i9m#Aa?NsQ +(Go"i)F#3$?o(K!\pAaFXs5a.Yg[tN!I\4ak.9-Hq:E;Z:'KBb1.U3!#=4R$E +j8]/5p]$8Nat?"b`Ra2;q>^3hs6KFHq>^0as7l6`oDARfp%eONlLO<.p8b7'qtg?l +rVu?Sr;QZprr)lrrr:^*kO%X8XK0#a.6.A.$]9h+rr2rQh;\G6s5iG+rr<#`lgOiQ +FoN-i*WQ0K+i@-Xf0SV#V::CP5kI[qu?]Wo^V8I +pt,Q)+'Bs&<#63S)*3O;'42OpA037;0NslRYj/^Ps5Mi6iSsn"j8\9#s5`,DTnb\lf`LX?No)Ja_s8VH] +s1Z\*o)JaMqu:o-W>%?l$ohH!5%t3V@2_1:jo>A?r;Y=>s+R8b-qe7m5%50`?j\Mm ++[gW+8qR[0B-9H\Z-rZ5YLkU.HN5*_![1Vk7XH":EuRGm!$>H+@"+dT06.U]GnDiR +&M@`D5&Mo:@f[5lo)JaYqY^9jqu$Efrr2ips8W)us82fqp\Fjds8N'!%+*M^r;Q`V +jmrBKs8Dipf[f$]rVuZes7c6ejQ#c#7oRCGchI55rr<#io_A@_s8N&ulK[s>rr8sr +[V9E$hqdu!oDeLRs*jtDs8MioI!;4r$oe4e,m=9#%L+RF-:n1,s8;Tjme$)@s7GLS +jrI)57!h3[F>S*BEK%_jhuDQrs5hu/g["n,n,MnFqX3tRo^r.SoDeLYs82Qjs7cQn +med%Ws8Vcls5<;Eo)JaUr;Z*]rUU!gbi\#`aP/OSFqli4(Odu5+tur[S\Fpts6]7S +q#:;SRC!YR72.=R$nu-*6@B%tI3DIO![CfbMmZK&QlJ;"%PUop2I..`CBH(o?%ft$ +LW15tJMgSs,Y*D,6?W\e=V`r(-q/%h10c\9J7j\GM6#Ac^Hms7cB_nFZbZs6]1Fp\Fjds8SO\XpPd`!!X,p3CUKj +a7T$'s8N&qpAOOLpUIZM#m_CIrVuEXrVlfrrr<#nq>L6is8W)uo^r(\rr;cfs7#LW +jPoq5qu?3Ss7u?fX/F077r/eI2%^6R$OJKm""OTV+pTD/0Dt/5s82fqIf&$hgV)+H +S\:9@s3T@ +H'tYEh!+\8iq*3Q>pE*'.mf7sY[jT>n=%PUor1g(;BUEjp@dqMoCr:[s7c$Xs8Du\k3i0Is7lNl!!rAs7,LSr;$APN1:%S&s&*CrVcc`mdpGXs7H$Xs8N&trVu`is8W&tnEp6O +94F0LX^GF\#6lIa%4hJZ*4Er2fK$W +AI^Cpf^o.3s8VBZs760h3(/!>2KolbDA=pK'fgI_7YVI1F"gOV)a/QQ.:Wf>A/I:? +&2.6/3ao24lfJ-GhtI)8WlGJo6k_I`#r#Ed/5S3+Ga,MZIbXPqli7"KrVu!Rs7$'g +d,k*O4]3Fa:2G]SiV``:rr;3[s6KU_mJm4Us8VZis763ioDej^rr;`ms7H3go_JOb +rr;rqs7c3_q"47Wp\X^Ws8W#sq=jp[nbN1as6K(=qu?S8G]`l`rJHVr%M9N\":tY: +'EeIU#m;G*'.QPm_V+h]rrE*1['II=oDAC[rqueDrVQEgs8N&rqu?*Nq>^BmbfJZV +&hO(`)%@!)!!!lT)Do@Mg&(dKkj/*@rVuNcrVQQgrr;cms8)Hao@M[HqY^*`r:Bme +oD\d[kNpk#s7>jUmITuDrr2rMf'E>5s8Mioqu$I%(d\og@gXo0.pAMjC7)2:^J.<*].gM/o,-R[c@Dfi;`fW+Aa:SH6Gk+!$>#U5]$KF9QcW4 +bNAiWmf2kXs7cQni90VX1I3Za@r@:-[F"^KN +kNMI9s6KX`nc/XSs8M<`q<7kNjo=l4rFYN[qsWbHna-5ImeukGq==1Xq==LWm.Tl> +qt'^bq#(0gqZ$Hlrr;HUq9m^Hrr<#kpA4afrr2rrj5o:emd:#Rs8Dor`5BtV/jfmJ ++:JQ)$je7++?9E%&fMQ7s8Durr;Zfrs8N"HnF5lL?jr;M_:3TjR*!Fs4l2bq>C9frr;lps8Muss8DutrVuonq"sXJs8DTirUg-io_na[ +r;ZK]q=3hGn_s9,g]-3_s4Z-*gtMd?h;&%hhZ)Tns5`2>jlHI'f_jCMo[1eE`iR@_ +RCABfe$8-:jn\rQr;QZos8U^'h>[ERN/X&N-oCr%s8MusgY1rlrVtU)lhgPYrr)ji +8mDDu',(p%!!!SB\B4C6s6f:Is8N&tn:(E;rVuopl0.:'pA"[es8W&ts8;m/%jh5P +s82]n=]okI!#Hh'3WK-nqu6Wmrr;cks1>n\'GVMd!"&Z(s8N#tp%A@[q>UBns8Duq +l0IKtmHX]Ns82Zmjl?0tiVt2Q=UlNl2GBhc0QeHiB6/O&o_nf6K<6goEYpNG.Xk!F +!@hOY+\a\$I*honf`1j/s7Gg\o@`E\o`+RSs8&S'Z0VGhkl:\Irr;Ngs604TcIq%H +qYo[AlM:,Fs8DiprVc?^qWdYDmITlMp](6ms8Drs +o_&%7gZAG5s/;d0+WWfp11DY3Q2iUX&N==cs8VWbs52c*rVHO2)F5/^=VE)o3)Gp1 +\FSDMs60L_idU^lmf2e5l/DF;s5rnAo`+s4g>)5us6p!fj88f9q>0X]s6BLSp&FpV +qa[l0.p@rVr"DP.J9= +(DS&q=(VC/s8W&tp\+Obrr;uorq-Qss7Z1WK-hd24\Ttu10b#QC=E4_k5YJWs8V`[p&Fphs8)c=c1^Mqs6][_g["n& +o`+4Hs8IKIs6]48s8W&ss8V'@jn/QNo`+s?lK$dun`9`FjT"tuo\A."k264%i;_`& +`05VJF)[dg5CH-B?n<1%-m`R],%`>XE&'4m1EBsG*Fp32BHRmq)C0Vb'Q#96F>*]' +*XH0t**aULE&V9m?AZ=JUXYj8gnh"&UncA0eGiLoi;_Tfs45?_`R+;%kl9f1s6/A: +g%bU6oCqJAp[\(Rr!$gt!s8Musrr2q6DJ]@T!=fPR +p%/4`rVuTarT*#&rr;uUr;V6Ar;6Nor:g0LgZ/,$rVlcqlL=f9mf%\2s8W)ss5r2( +qs3qTqYgHblL=)mq"NnGs6T=Vm,\3-jo=YJiO+!CL/jpW1l"9q=pbpa)A.-.'R^f( +E>/n//c]Q1&pZ;SIQ7R<)@0I]*b?K7=rAf!,AEWTQc+ldetTb6Z/bl=li6&0s5E2A +jQ?L%iqqThpY+R$gu_rCipZp6o)J1BqrR)?k4ScHp&FaYs7YI@jl,Xgnb_nBnE0`M +qY9m`!WidrPc=KPs82QjrqZRW2e*F.2#mUt%h'gX8R(cVrqlWnp%J7[qu?]qs5;et +s8N&`l0eQNrqucl$i^1rp\4"Rs7lHfpAXQ1s8N&]kOJQMrsoYbVl79s79T]m)$^Hj +!!*pIApsORs8Muso'ub=ht>g[o*>LB!!!c5r;ZQds8)Tln*p#Ls8Vrms7>j^St3%r +%OSZtcgUo6mf3.Rs8Vins6T:MpA=mes8VBVlg4N2oDe+Ks6/S;f^Sh"r;ZT?q"E\=p#GlJoD8L_ +qu?Nis7lKkq"t*cq#0p[qt0a_p\k*lqYp@ap@e:Xq#16ks8W&tr;6Norr:X(h>[ER +!!!GYeEQf's.5^iVkh6(o)B%%-5[IQ#R2=Z$QoHM&6N%F;,LQioDA:Ur;Zcrlg!s< +rrVldp\t0is*jP=s7?6ip&>!err2iprVuips8Dorr;Q]t!u1h<().K50/6#\l2UYZ +s5E#5oCDqRoDaGpPQCh"(`"Y*!Z3712u3:LoCVkQq"k!is6]:CnF?5Mr;Zcps8M`l +s6B%Po_8%?n,<+_p&G'Vs8V3\pYGl2fDj%As0^S\Z[C."WLV4\?]e#ECGd;A,8b89 +&9AU!E>K.&'b4sp&o&C*D'^EF/h_?+**XU>B.suf&n6r0S]$eodA#n*i9L@-l2U,/ +qr$rCm-+<*q#BaRr8mYJjT#8Ks8D?H]8:9 +)>Nt+rr)jK/3Et7'+PHnp@SAh=`,&l/-Z4s!!!aXFc-1ss8N#trr2rsrr;uss8N#t +rr2rsrr2qHoDej^rr;`ls7uZnr;Q]qrVliqrVu6PqE[JH!!!SdhX]dkr;-?kjlcR= +rr;urs#N21!!!KA&L.8U')qh/p\+Xdrr;uts6K(;p\FIZrqZQns8;iqnF65QqZ$T] +m/Q52s7>p]s8V'XqT8["^All?d?.7t7P&fs)e8qt+DCg$CBGl#&g_H?(Mb&mAIAQV +%gm@o&To04F=/2R0e7H.1j;97[>:EuVs"*Hm/QJFs7G^SlfINlqu69`qXsdbq"!tB +s8Vroq=ajfqt07?s8;cor;5X3h>dBNkM+nknFlbKpAb$ilf%.*o)8Uds7GdRs8Duo +p%eAbo(N+]rquKbs8DuqpA4XTq>^6irq$0]kkY,Es8Vopna-8^"sa*Ds8MrrKnP[X +6VZb-mIg2LrVlg!!t1-LRe?=QrVQU+%4V>X*<,j8rr)lrrqucpr;$!crr;fnrqucpIf99GrVlips8W#rs!]HXpA"[brr;cjs5;r2p%\Oh!tPJ9 +%3Q`E77:2Tqu?Ngs6AkC-71@R\@;)&nG`I_nFPr>qXa^drVlisrUfd_n)jZ>i;WcC +g]$&0Qtuq6,7o)O!,WDfJK>MI#p=C!.=)XIC^h%f$km7k(1n^=IV:H%G"?#)BS!OK +UslN`ma'Veki`!>lMp_:qsWPBoBcMVm/I"IpA+C]s5WVBh!+;#s8V]is.um)q>^Kl +s8V]as7#OSo^r.^r;Zfps+l>ls82ilo)JCNs/i91Unk*?f@p'#s82ipm.9T2o'?2Q +p\b'bqZ$3`s7PmQ9C2ZXrVlisrVlirs8V'9mO]nY'G)uT0MVKAs8MusmdKfIs8W)u +rVccop%S04K8]Kts5)Q%)]1HYbOG/os8Musrr;ios8)`or;$UEjrr2iprdOhFs8DrspA+aMkje'/qu$HnkN_m?rr;lprsB2T"9]8N'd9c`^Ae*2 +rqufYjSAfRrs&c@!!!*"s81'fa8Z,4lgEm6s82Tfq>^Kki7l?Qs5^iIYL3Bt*HNb^ +PX#4_$j1\h"`=h]DA4::+=1kJ)IOI?Grg&YI]_eBh1#7YkkjT4s6fIXo^r1Vo)JCP +s7PgZo^2SLf]V2So^DANra9V]"VVQ=WN,^ms82fq?=@jS!>;ZE`<6D_d*q.Srr;]f +s7cBiI".:Z!Z/;Tc-t5.q>:1"%3h"(W;m)1"qVC(l0.pBrV6Ehq#C'WrTrhDjmi97 +q#BsSr(cSOs7GaUnF?GMkk"7cI"D=u'b(L!'+cZ$#T`6sp\t3mhr*MZm-43;o_e[f +KS><_rr5_e@/p9Drql`ViqWNOs8N&orr;fns8)`or;?PCs8N#ts8MiorqcWoqYpKl +rr2iprqu`prr)irr;Zfps8W#ss6]=OpA4ft]#F^M%KQ_F"pG\*l1alCs6].PrqueQ +LS"PH&fhrA!!!-%!,V1$=XDD?iqI& +,nb5;'l,"B6]G!/d%o4ljQHR8kPt55s6nY0iqNKHr;ZEgs7QBko`+s`s8V]is7$!e +n+Z\Arr;HZq;\9MP5k^c#n?sfh8f!Njn.I$*WRCDFHlgtrsA`@#65S?p]'jPs#rVK +!!!i.s8VE[s7--h1IbFG%Nj^&s09;Y$l'bVXfq;+rqu0[n`00#p&FUWs7>=Ah=ps> +mJQ5@s7,CLlgauHoDeQAPEc"Es)2b+!!!Q1!"KbZ,O=[irr2rsrr;]crn#cZUSFq" +$lB3R'_h>$o'ubZrr;usr;Q`jrr;`ls7uZnr;?PCs8N#ts8Mrrrqucpr;Q]nrr2ip +rqu`prr)lrq>L:M%12eUYX^Q[mFNFL$ +h#H>^eGnIXroVr0mbRF%meQhYs8W)us82`fqYKXUq\a^k6_PCIY+'\ +qu?&Ho)8%Q +s7l9ep[\4Tq>^Kgrr;N\q>UBnWN!32$5NUA%N$!0R[L5EmJm([s!fHZWiC9ml0e0D!!tbQ8bDfXp%8:Ml2U_YrtcA*#QuLT!$53@EW5n9r;6Nn +s8VBNlh1#Err;rrs8V]_pu1Q+mJm3qf$SZ!K"fI@pAX4Os5N&)b4kqqkPX0!s5ibM +p@81[nbr@Yp\b!_s*XP/pAY*cqu?3^s6f[^n,!%QqY]mZq"+4PoDegis8Dutr;ZTb +s"#N]"99:O[FFsCs6]:T!!O;e.RYD!!!s@C9mrdOnIhrEkrrr:0eeGoXWq>:3kr;X^Pg&M*k#R)I`$S%:!XoA7ulKJ3.jmi?L +s7>mVqY^6is8Vliqsa.Kq>^KZqZ$'bs82irr:g*gqtg?^m/R"To'5'2s7,aZmIUAL +o`+[Xq"Oges8Vrqs7H0brq#mamIpSJqZ$-as*j\@s7lWorVcZorql`en,N1Ss8;Qi +2D.o>#VioshtZpFo)/M;4&#ej,AMO^,;;Ci'IN5?rrNEG!!!r:r;VM%RL&s2a19Rs +q#:[$$jltIIrCPW!$YB1C&72rs7QElqZ$Ths8Vfmp[RqQo_AI_s8DZis82irqu?BY +rrMldrr5+Xrr;iXl0/'Cs7Gp_0.]U""XXT^.P3)CZEMOS!#>D-s7H![rr;liqsF%N +l2L_Srr;Zjs7cNmqYpKlq>M62rr;ios8)`pqYpNkrr;ios8)`or;Q]nrr5^jrVuio +s8;iqqYU^Hms8;fprr<#go(N%]s8N&u +rr<#ts8W&ss7lNln+Z\Ss8VfhrVcbFr;6*RlhBu=s8Vrqs8)`pqYgHlrVcWmr;HZl +rr;fns7uQls7cNmp&>!arr;Zjs7cNmp](6hs8Droq>U!Tq>C$fr:g4D-peFM-bQk< +p$i"Gl2UYZs6&\Gqu6U"#oGW_8aYsG'b`(t!#P\3s7Pm]"ooW=7pl;ms7Pdrrq,UX +JpERb!$(t1s7c*ao'ZGNp&+jhrr3r9s8W&[jl,t-o`+pjoC;PQqZ$Tos6f:Ip\4L_ +s#'H?q;^H#s8;o\jSO%UEirr;fns7uZoqYpNkrr2iprquTfqt'FPs8N&lp%mq:mf3:dd*L5I +"V:kA(C:Iq>9UJnG`FhjlP\(s*jqHs8DrsrVliprVufos82`oqY^BjqZ$Qjs8Vin +s7cQnp](9fs8VinrqZTnqZ$QpnaH,MrVtd0l"O^P!<lh^MPs8W&smP=Y8r;Zcrq"Oaerr;Q[o^D5>rr)lsrVt^-li6n_ +s82i'Yf?_D'?nSRrql`enbi4XrVld%naZ)Js82fpr9O=ts7uZoq>UEjrr;iorqucp +r;Q]nrr2iprrquao_J=[rr7HApA=FNpA"C\p@S@r%j+SB@/g-)q"OgTm.TDsl2L__ +nacDQs8V*=jo5;[oCVhEmIC2Us8N&uo(2X5N03r6s8N&up\=^Wo(M##jnSTJs8N&u +rVuors8W&trqufrr;HZmr;ZZls82ZmrqcWoq>UEgrr;`ls7cNmp\k9pq>UEnqI'*i +oC_nQrSH>m&J#li#T50B4Ntq&oC;gu_oi#["UPGEp%8(ZrVu]fs7Gm^!rruu4&AdK +A/#V$rVQWprVq(bHN4$LYH>>%lhL)ArpT7Lrr)lsrr;9JmTNe!6psNDrrV0-rr;fns8)`pqYpKlrr2iprqucprql]pIerp=oCMYSrVufm +s7l?es8N&lp&C,7SbDdWp@eOcrr;'@lL+-4q"ajm#72"V(OCFXr;HZanFc8=pYk)s +rr2pn;HjeM+0McXrr2rsrr;fis8W)up\+Oaqu?Zns8Mrrrqufrqu?]orVuforr)`o +rqcWoq>UEirr;`l&HDM(s7cNmq>UEis8VuWjPp1=&V#7_]=GlXqZ#='kI7k9p@\:] +[f6=+p&"b*q"O^drr;fgs/2^!_8"7foDejis2i@,rkJI*0DbMDs8N&qqZ#gDnG;t\ +s8N$9(a'1n&p/2Ap@\C\q>^$Up](6ms8N$#!XB5H&cMq3s""*Kqtg?fpAaUKq[NuR +#R)(8mf2\?q;^H#s8N&nq"jsfqu?]mp\==Yrqu*]&HDV+s8)`pqYpNkrr2iprquZm +rr;ujrr7HFr;Q'KnGiLfs8N&9_T;`Us8N#thr!VdnG)hUs8N&urr<#:`Q%u\"rS=# +!!!3%rr;uss7Q'bqtg?lrVlj!&H`1N"pZ#qJWTm0s6/\=p\4^err;rps8Dlqrqufq +r;Zcos8Mrrs8;ipr;HZpr;Q`mrr;ios7uZoq>Ls*q>UEgrr;ffp[S:`qr$DhrVm3' +s6f:Iki_F7rr2p.qrHkpq>0[NnETcCoDejhrqHBk%K?D"oD/Fcs8W)udaHYEq$@$# +qtpL=;rr8+BQiI*m!!!E?%j2/_(]XI6p%/4JkOS!*oD/1[&J5]R!<2'Y +ru1@ooC25Cs8DudmJ?k]s8Dipr;-Hnrr;0Dli-_grr;iep$MeZqYpKlli%IqqYpNk +rr;ios8)`or;Q]nqu6Tprp^'bq"k!iCA7H!k2kn%p%n^fs5`;,p\=^ds8V`aq>'md +l0@X%mI0oKr@BNT"U5@#QCe!Ns4c;krr)l]kkLL1W"Kal!!!]1rVufos,N&3=&rr( +nc/Ufs8;`nr;6NmqZ$Qms8Mrrs8DutrVliqqu.`9rr2ips8)`pqYpNjrr;fns7bF/ +gAh3Lq"aRRoC;eXr;Qfss8Ms2lg3^4s7H?kpAb0fp\==Zs82Qbp&=1]q>'pOkj%6i +k5P#Ps"XBHq!RS:o(2;Gqt'geq==+G!!!-%!!iQ&s8W#s!!!ZD$mP`P'EA"1s8Dud +mJ-YXrVul="onW$s8W&si"u@js8W)uh;%)Wl1FuQs6].Gs8N&sr;Zcn%fcS-r;HB_ +p[%q[q#:9jlM_+frr2iprqucpr:U'gmJd.bp\sIWs(D[HNm-a-6qtU0js5N)#p%S%SrUBLSl/C[Ts8Vran*U,r;-Ei.Icits8N&urr<#ts8W)us8N&hnb253li7"`s8VulqXXXc +p%\@Qrr2iYrW)lbrr2lqqYU +s8)Wmrr2rcmeZbSs8Mus/1Nja!#>hH-0FCjr;6Nbo)A[i)%I-'!<j7`3As8Ds("rZdks8VrqTpr_&"XO-K(]XF5s8Dukp&4=G +o)/Ihr9-p>r;H<\p?VbYq#:9j +lM^e`r;H]riViiTr;M0CrVufos8)]or;HZlrVu`ms8)]or;HZpqYU6gr;ZNcs6T+I +oCDq\rVm'))%6p!1Gi"rn,N:_s+lN0!!!oC$7#*3s7,[[q=st;-8Y]&#rt"3s8N&m +pA=@Jo`+pjrr2rcnbW+\s82fql0\!0o_&.^s8;oqnFc>Ls8-]qlK7C"mJR"ar;Zfp +s8W)urUBC>q>9U[s82Qaqt'@Us8DuLe`6].s6oCLs8N&Sh;A#&qZ$Qps8Ds&";TM; +hu3QMrVuNhs8(jU!bp%\Ogrr2rqrY#/.s8)`pq>UEgrr;Zjs7cNlr9F7is8N#trr2rsrr;us +s6]f5r;Q]nrr2iprqucpr;HZlrVu`ms8)]oqYgHjrVu`ms8;iqr;Q`rmI'QErr;us +s8Mus*ZZg4!"q(D9;A<"!!""'Q*_SS4TGI"AnZbnrVrmu^BF`U$ORaMrr;ESp](:! +lg"!>rr;ESp?_,@iT'M,rr;?Rq"=F^r)NdslgOE0mdL&Qs7,dUr;Zfps8W#ss7lKk +iT07fmI(#Sp@7b:p\4@\rr<#rs5Mo.s82iGdH(9's+Q,`s8N%RL5Ycts8W#s!<Cqu?E`s5W#1$jS)PS@nmts5`);$3hY'-9YC.AGQ!"s8N&rr;Q9e +rqcckp\Fg`r;IH/rr;ios8)`pq>UEgrr;`ls7uZnr9O=nrVulqs8Musrr2rsrr;us +s7?5=r;Q]nrr2ips8)`pqYpNkrVufos8;iqqYgHjrVu`ms8)]oqYgHlrr<#cmdToC +qsEeD_SXS#!YQY!1Aq+No(2nWrVm!+,ldo_$4J6XrVtX.nc8k0!!!VchUEirr;fnrqu*]&H2Y. +rVulqs8Musrr2rsrr;ThIf03Er;Q`mrr;ios8)`pqYgHlrVufos8;iqqYgHjrVu`m +s8)]oqWR5-rr<#Wio^7>rtQ7j$OR_bBR&Cko@M[dmdgAX!#H+X/&oZfgYME)#ojQm +-6jfno_/=^qZ#^?nk)MT1c.Dfnbi(Qs,;r2!!!`=#TZ,p<"T`g-FgY/q>:2GLQa2= +3Drgb='9.A[D]nue3cW)J:Wt[:g(QM\,H?srr6*ckk=W:s8Vop76k5`!#bG"s8W)u +mdBQ['cQN,qW?f7?WhdY!$21A&/lB1f$r[Kn,;\?rqcBhp@A5Z94UmoB)hc.o'ZN' ++Z'K0(E45>!!!E,rVuosr;QcrrVlrpq>:0`rqQKm)ZKa6rr2ips8)`pqYpNkrr;io +s8)`pqYpKlli%Rrs8Musrr)lrrVulrs8N#trr2rnrdOeErqucpr;Q`mrr;ios7uZo +qYgHlrVufos8;iqr;HZlrVu`ms8)]oqYpNnk32"-s8N'!"TSN-(De7jq>^Bls7uZo +"UcIX$Qf?O)!C8cVl[W5!u:n?(&\(2l0J3>q#C9krtQ4l!!!E+rr;NXs"cH(',3-/ +@sn1Ps*b+V)uosOmI:/Qrr3H?,QIfW/1s1)8H%#l!%0$8+k32J`IuadC*ruQ`pAFs_q>V`k3s,['#R_XDp&Fshs5rP< +nalbk%NH/r+o1p5p\=ar$RGcQ*PB)?qu$JA!O +jlZRO$n_bi.@Zj1rr;Ths6K7ImJm.bo^Mml[FGQd+uqPSnF-,Os8CO#dJs7FnF-,D +nc+GuVl$*-p[\=u&1\V5/f#'KZ`hCKr;Ys@p\+4YOH,i2;dfk5&e,0el/qa?r"]83 +r;WUfZaI-RhVI5gq>^3_r:T^Xqu?Zkr;I-&rr2iprqucpr;Q]nir0Vis8Musrr)lr +rVulqs8Musrr2rnrdOeEs8)`pqYpNkrr;fns7uZoqYgHnrVulqs8Musr;HZnrVufo +s8)]oqW[>0rr;rkq=sshs8N&ur;?TanG$L)E<#tK',i>`6r`dTs75sb$4n6Z#8MuP +Rd]hInaukZrr5>S][Cr=BMk!!"#9r;ZWjs*aqJ)\Wo>qu$KdpAZs, +;#gS9L52Yjl2P7'LCb"T"U$B8NM?%>jT#8BrVuNeqZ#gBqj!;F'bMnr!"\l!r;Q`l +s8Vfms7l$Lo(i"Zbf8ir,>A(1s)Mq9!!!rPj@rr2ips8)`pqYpNkrr;ios8)]orr)irrVulqs8Musr;HZn +rVufos8;H[nc&Requ-H]nFH>Kr;Q`roCVjNU8\;&'`\7Fq>^K_o`+OVrs9)Q!!!N+ +rr;cis7H$br;Q]r!"L1r1QRQhl0.u;T="Y!*#TVUd*M.\!#p@s%P"$@]'J__o_&5< +0i/Jq1k^O^qtg=,'0?0o,omsnN/XS.rU9acl2(>Js8N&rq>["SY5eP8%1='Rrr;ln +p[.D2qYTs[pA=FMrr;lq!rsAB!#n^+B_h?$$O7^Q!"]_Q*IrTsn*TlX$5*LF%0->, +p\"R_q#C?ks6CNcq>^EnrqufnqZ$?brV#p]q"O^`qu-NnrVuKg$31#(s8N#trr2r\ +rXAi+rr;uss8N#trr2rbrXA`(rqucpr;Q]nrr2iMrdOnHrr;uss8Drsrr2q.@r\*2 +X7c,brr)is!"T&0%fZG,p%8:Om/Cg:I2*GC#6Yq5m/R+`s!8mO%h'shrr;9Jme6>Ns8Du]k48re(V@3!s8DuVhsLIBrrN0."pGG< +!XP["X8Vtr!!!0%rr;ons82Zmq=spgrr;urs8Musrr2rsrr;uss8N#tK)Y$6@f??' +q#BpSrVuirr;-HLgZ]Xp-XBnki8*hoo)Jafs!8jH!!!RJCOl3Qs7Z'a'+ZJq"!YIk +g@4M0+U`s8N&urVta0l1juPqt^9hq>UEp +%0-;+s8Drt!"Ju/%UE7Rs8;osr;ZN`rs/`H"9BSAq>^'Vrt#Yb&eQ@iX1dHMpAFjg +"U-7U""A))RP$6tf@g0T02_cO+etmFrr<#srVQTbrr5%Kn+?>Hqid/4!!!<*!"8i* +s7uEhjPoS,rr4>m0)tqNChn"j!!g-I_Ya30mHjEdYs8Dulp&FUPrQ`X?!!!E<$lr,lg*sUEequ?Qns7uQgs8Vr_mHafPrVlg8 +qYC-^o(`7as82Zmrr)lkpAY*ks6Jt>qYC-irtOqjnc/Ugq"O^]p\b'js6oFHr;?Qn +rrW/ts8MWhrt4tuo`"jfq"XR_s8D9MkPtSZ\c) +~> +grestore +currentdict /inputf undef +currentdict /pstr undef diff --git a/grbPMF.jpg b/grbPMF.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92853b608386f03d111698586b30aee2b5acb832 GIT binary patch literal 6156 zcmb7|c{mjCxBo|D-;E{vJ~1QvzGpDZ$Tqf&h!8W3%w#XJCPEBS*2EYyQj~ou$*#zr z8I^q}Nh*@t_xU})d+)#ZoIl^6=k-44^UrzCIsJG#58y?@5pVzl0|3DAF9D}?fH{Dj zg@u)cnVprDm4ls~gIk!Fn~RHELQsfLSWXHoFDoT0b52QD^&CVCA|tD2rmm%LXkual zRuF`V`Q z!~uXaXMq1H_rHUMiTMnWk%9G}dVv?f00aWhFantvS=j#bh~b~a#LNc($?&VQ2*{dg zIQj_6!SD$}Id8_!YNA}PCgsV4bWutmcv(4l4abC>@;74(doZ8+QyPF1$ndXjARoXKKv*BExWJq#N_Gp0 z0tIOX4`rmTkIOgYvJ*UM1qpz?@=S6lD%8G4c*I(?y0?k(U3*o5sPCQ#-U-Y3f_zc$ zF{GDqi2%2@+haAn(axeb>E9YQ(%KV^v%IFQ6QpwBoEkY`hD?V|vcoPMr@uobvO1DW);VKF6m67r7pF|YQ9g{{wHC)o zug!tt(8X8hiT7C--X~K))EhDfm%!c4Zqg)={QQ6gTH{h3Ti3K2PJdiQPq3NNE!VK| z-5K=#?m2VSaB(v*(wh{3AfOv%u5Mp@-IHs=lZ2JT}FHO;xop7M!?!#nsWgh zc({Q5N_SCU2#G05Bq?An{{h!Rd1^q1&{JjR#=0Hh0H{0rc#FTyeY(!5D_ zIw-@cFfG&EISh`o)oW~TsjXvkKoPTvCcFgr<1a6E2P7pfHq53-V*TE6>okFZV*vzb zr!Cf@#N4u+xtrbrPj)W1mHf7;>J1opQ*Lp&7m-IJ(k=Cvx_G$5PQ>tiiv)ZLyLw3c ztKJq0kvdfI<49YFX7kKEGUc&ifQSh4?x-OGh$^&pS{TK?Eptsz^&o6ivp##5_l%Os znJ?e6cy~!56xHsXsNVNXCo{$=7mG>$m5UuKT4y7csu+F0i$G21AEIt+W(e$b&0EyF z0biU{TyCHhLwk)M9c(D(iY)J%-!+n2WZgDfmgH`0jDHKy6a{FHn%qMBoh92wX-XvL zx4g_v_|1*@%`j-h6^3mYz3ZBho)-TpPUg1WiiLF9lL6Xo^AU>WD_()NmGPa)6Up{# zF0X0x2B;Mk2ey?cYp8vTqfBR4Hb>eU`|2%&T3Biv_0cM-`W|tE>|72Zw&F`f&^j6Z zdJw$f;bCYZGxx06%eOR-T__A=Zja{1)LiKu37f-I90a&i+xHAm%nyaAs^Am`GaoXKC=>%V121XBkGX*km$mEWgX1ye761(ovU8E+*Im zOO!(FMM30VgRx}F3vmY=$TK*bBniOPZ#oVx=`BYXyoX17y`ANxm7vQklPUT789hFx znNz+BjPtifSrP`P7)fMmP=8^r08 z*gf1?eOEJAhdiECMkNTqJE?1`Z+wrI<4V$W7|wmQpoGploc>ACr-@$p{5W?*p*kb4 z8lSO6^6qDy`}B+ddJAC!+i=vQ^{(pOH4pZsn>Or#d2y+n<=1?(@x^oJat9@*C! z$L};J3N>e}^gcc}ThWu<%bih$E?7lX6&D{(3XWTU9e}z^`(|Y6>=Gt69k3rJRLYbe zT~vLUd0sJK<-pYLD7~#V;u-Uk0W-ET`)G};`PFwGG!!Sdu!NP)_QCB8vkA!uZP_&0 z(%_E=-`pv#5ATZ_n!SGc1kRYtus^Il;ULjh4 zi>Yaj#N9(VQ5%<%8mpSZ+EJA|9e>eV6>^eVxS3I) zP=>x%mEmzRLMav2gw5Aa%4*IHwK7}#=Bp$JOnAexIM7!+U=0H$5J74h2-A+A)98NG z6pr(E(`$|%rBb(tH7M%W9r^OtiVaO)P9Q+w_ubgRN&9WjiIX|%?aC|r6E<(}(K@|e zVFhR;tLJ=8o=(aK9(Do+AQp(VDVy;K`4;;5lrkNCzU^Y8W$caY@dtS%cLZ!uJZU%Q zxbgE#I}Ha%i{D{V4!|zD>8@25d7^ zHJ&3UB(-A`)6pjdC^#rF4b^#>Zc~<~ zmCq!9%=?6mg>L*U=PR}Ue_Eay(|r$ffeukelD}OwKM$hEb5<_%+#YrC;+=uIY`HoY zR!$Aa^5?}jF3A}3URc_+dnPjHy&_B%3{hM^xOeoWV3ndpePSBG2qN!ezHT;w z{rGC@E12(@2eL+Dgr(>{Td&T|{YqcR;ZEsE{M7Z{8fq)7qa03lk+;b5XT}H!MzG8>B)}_vNfJA~LP-qdoh!I2+aZhC>jJ0Oo#u{dsTT=x|b(ush-#sAI?J zx#-g|e9$>%W=2)5Eeg{m9@RY%NVCx*{zfz1cIFY*oLlWUFr18XXqwKhq{w?G@`S>3 zb8)Nd-!3Ot)l4D{v)bqb_hq4uO5Td{ZHw7YA<{M2H!M(^`qO%+<=|_y@JHdtF~-PX zezvt2k7vTRO)3S-df3^ce=p-R0w+E1MUICEQ&P+;C!f4Y{D9*gz{r$00C)w2p136P ztPCC%4q+<~MU{T&HIhRL8wP$1od_yr0|T*n+fCv~4_G81`+|JszSZ@zSbuBVke7r$ z@^I%Y1&(X>mkC|cpzkO%vC`^L5g-XuuOo%QG}mW#wuHZrV1)CjqLwC_i&D0AvFuQ{ zA4Nn^$0^_*(4EeU(Nq;U2ad4pnbYfCP@g*A$>-yHl{48lMo3`oQ;pn*s5b_mH{#et zM708EAXcMsysu0v^RlC&$?+$%e?>c^Hm$b(WO8yHt)y03Nw1SDPXP$$VsSs?vOh`_ z!2VPLg`R9ErEPtw682C}|QO$i&+w)X{I_-Id=YjY!_P ze}DQ&{H?Zo7{_5aS%)e<1-L9vn|AQJuPRk{JfJEr!F}bty!eB8o!o;TPyczDq8>M-$S*7UN!ux|6?G zrQ*+nKO$Xyh>@F_I$@oia?r+`u;#O&`Zo6rgjF>~o_FS_sD5x|VS{YmvLH(z*@b5* zpu}{>{@9ma%(1URRezuL`H6aK;~duT*0=5r)Up z7WqC!FPktshkBy-IXh>BtxpZ(H}TF)@GCENCvJM+YK1|Opjy%O!QQxxbFHeO?E0wO zWclj6y~nW%Sv?pZI-|-f66)iCK(o3dszC z91@BoY$Ogjdy0x?b&%Kzm`h)rNhicmLpo zPvAG_16~#Ej;ju5UHyWt?9SRBBGSi^ydQU&$3_85hT(5>&!r+fG=_`JD~tSG9xc@N z2Ym`V>iJ=Y)e5iHyVb9UVvia)+KlW)-i-8%2}6fp%}$c&t(}m?I%dQ(v*`bv&Wmyf zD=Qz7LbO8lm5|8(O=l;HbCjp~HI34Ir#y$e>rNCjZ#-boD5=k+t$Ff?Cb2Y&)Ai!l zyKeXNIt+5{UevB_G{#Iab+lrmP29)#VMt!Xgf9?-D=vWx$9O#&-kv_eVhYf|-Q~5VJ$d+hQM;^pK2;Wn|_N%TuKJK5EHcfQx18T-NWZmPnI>UOvQ>tNT}Eah z><1NGMmeydPiLT4Fhj5$HSL#AQmPY6eve%EJ6+53smUf7u5|?Dr}8|8@X2-C9Vlk( zC|nPXT2jaiOj~3!;M{Q76^kzP@i#2OG<8q2yV8ICKzV+#ka z1LY7Az`C!bPJ<$|4$^Darmxr%jpy2)ZWTYeAjU&Bz8DAVt^s-Pn;Sl_{KA!Le;YS# zQ^O@I>>{*HBw`D|D{XU_A&x-uv~H8G{66cDz1%C~_tx$Y4#uK~sm=itn{l?>T4~A_ z<~%=~9}7-dGk7FAgt`=`EQ?EsMtgRC91Cq#1!be_fV5!yKs#;XE zYcykUP)7wdLbX@Mv6yIc?!7$hP0tVqh_uaVGQCy_O-ZcH*i7(HP z+^04BQ-I!dTT)K#F!f876GdS45v66*^CsyhXdTaUGLxq^9J-2Wb}IMh#~Nv7wfs z0f${R-e)}-6RY<1*Q3TWVMI(b2V?3bRawmy?@an-SKb%;lCNSF625r$-J+W`h`lPb zMKUHX;cKje_r&!*RHdcj*JKp_ty&2i+bOv5ps5E%_s*QbXr)na2^>wjqJ-{zu&UIu zDY?wVH-JEf&x)oW6$)|4rpTsTFXx}$%4dVBB0WaK-CE|s;J9N4P^sQQao|)cyp`VU z&)m9Zmg$suAd<;a@hUNu7a_v3sW0_#Ij90&0DyVu)EZ2X+a*gAn?2nV zj{@jfYvLt=BvRQtj zBwRytV?|%Gyri}78O^F)!yR+nmiLw}nGF$|;BFxuG%qXnq(qDefHYtTNFPW$6w{>a zF*H~H<`!kGVj$+Z%!S?Tl4Q~hVg!MQzEOZI1Cx?&B%nz$6s z`#%3>_Z)eYU~D*IPl1XB1LhGhILD)rC`WrKxypK5}3Gy<>;{D%`^-mg8^s7EqF)*@13YcRrLGoalkFCbMrlc8iNjp^YplHj{*CB< z*=4F{sT9@rwG3Yn!rJGpG9auBVeg=blau$$GUXkRNLFTFw;bk*AoYW*pc~!g&La9) zN7$>K!~8Bs4mv+ znu(@Ak5$5<#>jfCu5FHkf7-A=8*wiqm4^2SeGTgxx<}i)CE?QfGEj)3ykF&#+(zGvX|A^NJDH+d@mhgnkAeTWgrz<8_=e4K zhk@uk@CRx2a~ms=SOpoRwOj0hlbrQ2YOg`11RG81T+Iea)qLm!|^Kklg3^4s8)`j%cud9q"O^drr;0El1O`Drr3&dm-alQrqcWgrr;uk +rqnbUs8DEUli7"^s8Vrkq=4@ZoDejas8Vfep[/"\pAb0fs8VrqrqcZor;Z`qs8Dut +r;Zfqs8N#tMZ*_Xrr2rdr[ImIrVuors8W&ts8Dutqu?]ns8Vurs82irqu?]nr;HEj +s8DutrVuorrqZQ`rr)ihqu7AnkNVd:qZ$QpnaZ5IqtBCDkkY&Krr3]3rr;9gVp@S"Nr;?QjqYpBmrql^Nq"OI]s82irqYpHgp@dq?lf7[2mJm4]s8VinrqZTn +qZ$Qms8DrsrVuors8W&trr2qLrq$+3s8W&ts8DutrVlforr2iprqucpr;Q]np%@qV +s8DutrVlirqYpEirtbM.s7uHgs8N&urr<#ts8W)un*]oLrqcX8rVccho_G#HTmqNG +G^"XUDKbaHrUB:Kq"O^XoC`+[C]FG3p\==UqtC'hs8W)us8N&Mf&"6YaN_rYe^WCF +nbN4as8W)us8N&sr;Zfrs7l?eki_@5rr;lkr:fmXq=s[`s8Dutqu?]mrVZEgr:g3h +q#:6es8Mlprqufprr;rss8DutrVulrs+:7ArYPV7rVuorrr2iprqu`nqu$Bgr;?Eh +r;-Elrqlflq#:+\r;Zcrs8N&mpAF1=mf*1bs8Dunp](*bs6f7Lr;-Hhp](9ls7uHi +s8N&[jQrnFZU-oMSXZR;MjS6mFl_QLp%81^rr;lmrVl;"s8W&ts8)?YnbW(]gY(`Y +me`iUY[LmT6pa[OU?is8DrsrVuors+:7>rql`prr2lqr;QTm +qYpWrVulf8bi)Srr)lm +pAa=9qOa7_+<31^FGo/8p&4^doC)_Bj8/fQs8)Hhai3%E??IJ72H3LcM2%MFakcge +s7l6diSNhin+cq^s8W)trtt_3qY9sapAFg^rVZHirV?KmqZ$Qms8MqJrq-0ks8N#o +s(hW5s8;foqYC-cq"j^WqY'UYq"OgKip,[en,N@dq=jp']ZP_OO'u@9mcsiNq>]dD +s/`-;5W`1",XsdM]jJnGN.]qYBm_qY9sapAFg^rVZHirV?Km +qZ$ToK)YEA!rr9!qYt@1rVufms7uHgp\+LXp&"FSqYpEmqY:*_o)I%\gO=L.84?X$ +DhQ'EfCA8.s8)cqqYuqGZr0S:L4H'C)a@V0HgBens8)cTh>RBMs.>dhCM//U1.`]5 +20d!s8;osrVuoss7Q!Us8W&srVQWprVQHds8W&nq"F^e +rquZnrq??`qu^Hos8N&urr;rps6]1F +rr)lpqZ$3Xs1GndM2%GQf^"[1Y +]IG-m@U+*FlMp\Qs6](Fna?/HpA=mgs8)NdqY9mdrr;?Mli6taoC;DKp\t-as8MP^ +rX8c+rVuorrr2iprquTjIfK?Cs8W)urr)lsrr;T\qZ$Nos8Du4]uZh:WqGr_p%&.@ +h=CUDs3]*P76t$61.f6meF2`'qtL-jqu;4qQp!E0G&`S!K;"m)[j3%Y5s8>RX2`&l +eil/lMMIR6BQc?n6'@@unaQ8Prr;ons7uHgn*]fIrr;QZq=!_J>J@_n?<_6,N1J&/ +fPte]4uuQEX2=Q"s7l6deBmMA2,H\*?/*s&q=O^eqZ$6Vs&`-=,p#48OKABSs7c-b +s8;osrVrsuY_%CZnF#oJrVuZdq>^Hoo^_\TrqHHlq#:-es8MV^rX&N%rqucpr;HTk +qu(=.qu?Tks8Dlqp\+Obrr;KUq>L3jrque1B65%/-CU:$s8;opq>]dErVucpI6L<,'h.j+2]>IXI!QWj8b. +ZM=1lqYC-is)J&;s8W)ul0.O7rr;]bqu?WpnF$+,KTC"eH%gm4F`W,7W4Ds+s7l9e +lKA)?T=+q*)/j;Dp@A7RmJm(Ws.5Re,TT'Sh3Gjl-"!jo#/Us8W#sc-"ot/OD`e;4YJRJtAI7p[nLcr;ZWfs6f4PQ^"?/jRW?Ls75^Us8N&^kj&0Hrr3&inaHJK +rqHElC[:9Ss8N&sr;Z!Dm/R(bqYC-jrr<#ts6Jt@rVQWfoDedds4uGoKn>L'&gb0" +c2[_Ap[nLLjS`UpIN&tYZE)4LqZ$Tls6&D8o^MmfYeE:_7b,rArVHQkq#C*\rUoaY +s8Dusqu?$Lmf)hWp&"dgr;Q9ds.]K$r;Q]nrVlWkrVQQlqtp:rqtg?iqZ$Tps6&P4 +Jq/cNS>l,Ms7uEhrque)?>hYT7ZWJ%p$r(^qu?6Us7Z'aT:E)5,rU!jLA^oJiSX$? +CjN+[[JTe"rqufgo)J=Orr;rsr;-Hgp\k-ks8Mj,s8W&_lfRp8o(`%Qs8VumqY:'_ +#k[c_s8N&oq#13l!qc-Urr)`o;Y^%`s8N&pq>^Ejs7uEh`l-8ZKTbuts6o=Qp[nLT +mJfaE@6$)Aq!nCCg\:U=s7l3cqtL,.C3a>tDZB\8o^MkPnG`Ics0],HW2-a!r;Zfr +rVuldrq$$erpg!fUAbT!rVcWlrqZNkqu$Bgrqu`l=Si'pqZ#gDn8r_uAn5h*GD+l0 +li$_\s8;o&YJN"G6mNm8eBmCGl2Ue]s7l9ehV7HC+>F]K,g=E_s8Duhnbi=^s8W)u +p%8+QoD/.SrqlQls8N&alg=]D'`7h&o(28Bp[RtOnc/Xcs8Vurs8Drh*<#j9p@\=Y +q>:3lrTWV.rVlT^o'Q/Eo^D89qtpBk9E4kas8W)us8N&emJ-YWs6T%Fn*U#Oqu8f< +;`lpS#brVQQmq>C3cr;H,*?uc5Es7>a[jPf[ojn:r$:C77C +ARKUnA9EihPN_2ss8N&oq#13krVullrr;Ke#64]%s8N#tkl).nq>UEirr;ios8)`o +r;Q]nq>Lm(rr2rsrr;uss8N#trr2]mIf8^%kl:\Ss8VQRn(@F4kktJSmdKaB:LnH` +PjI`9aiF1h^$2Dnbf@ohnb3"Sq>WWG^-as7Q0e +n+?A@o&fK7lhC/Rqt^9cp%/4`pAb0bk3:OjpuhGPmIU2>r;ZKgs82ThrTNSd[q="?EJtQg_HBjGeKR]:U5ur&IK^\@/j5fq3rVu`is&N'3+WN:UBn5R1 +rm]0Q;+tAQKU)6%s75[Xs8E6&s8N&cmI0lN!<)`m%0->*s8Musrr)lrrr;<`&HDS* +s7uZoq>UEjrr2iprquTk&-)Y.s8N#trr2rsrr;uss82eEqY9s\o^`%^p?h;)s8VK` +rp0R`qX3eFMMe8R+%\(8?nO'B5^KYmJlYHrqufprr;BVpYkc:pAb*ks82T^n)j97kl:\Trr;]is7l0ZnG3+] +nb2eHoD/;Grr;Q]s8)Qkq=aj`o`+sis5)\irVu`ns8V?Jnac>PoC`.]s8W)us8)Zh +q"s^_s7lQmq=F:Ko_.tWrr5Rgs8Vops7H?@`nul4Sq;BS\$X3AlMUMUs7H'clL"UR +=`#9&1g3pup@/+^q>^Khs/i385o)JOc +s5`Y+qu?BZoD81Vs7Z6^mdT6)o@!R8h>dNIs8Mooq"=LUo`+jhq=ORXo`*_$l*%A- +r;Q`jqZ!In\UKm7Vo[$4md9suG`$fkN4c^FE,^3ajmM^3s2N.0rVZ]prVulqs6f7M +p\+O^qt^9lo_ndWp\!b@n)j93n+cGJs7cQnpAb0es8Vfmq!nCSmf2nLs7cC8W +QE)A]4Z"od_S4XnmJlP8s7GaZq=XbU5Zqu>Ja_t*mKW%SqY:*jrr)lorV$3ps8N#t +rr2r\rW`<"rqucpr:'[cs82fgrI4\As5r>2mcj]Mqu?Qfs1#JVMMIYKd,t&os8;fp +hqn@E]%XR#e]lD+p\Xu[TX6aF:pRULn+?YKo)J:Ps82irr;ZZfrosF^n+ZVJs8Vrq +s7,dSf(JUQs8U[Ms5`h(0^r,:5:b +`ROhas"#Wa@:"5IQErnE?JjZ7b0/UPB6N%`m.'KCs82iKdd5H,h"C4.s8VQfs5a4[ +k5YJJs82HcnacPEo)J@Zs82irr;Zfps8Mlpo^i+Km/EQIZPa];*?@#]bi\fts8Vur +q"4Udqu<^o`%!*";bq)kjU_:hr;Zfqs7c6dp@\:[r;QBfhYn&crr2rsrr;uss8N#t +rr2rgrdOhEqu$Bgr;?Egqt^-cs8Vrqs7u]oq#=W$HTErf!!"3fF.;7Ks6JnKp\4^[ +p&F^[s5rSDqu6VuZ,BjQETZN\lL"W=mf34_s7uNknFGcBs6BXak5Y>ArqPLQrS.AP +e,THboBWL=fVmZSZ2aR`s8)chk5SdbHW[_a:l1k/T +s"Z?%@q(*a8oc:*<8um:bKK!U@W_VIs8)HhinFEJ@>8l=K?M'Kq=<,*ke-QS^An/b +s8;9ap$VkRmJm.Ws82N^m-=-,n,<+_s8Dujo`(/@W\#emF*!?;qZ$?cs6f4QnEp7g +[i0s_qYC0\li6_Ks-/MPG]9FLQ-NT3 +M\Q^gZ)cLUqZ$Qms8Musr;Q_aS#B_)EbfKBYHZ":o`+jgs7,RXp%/4`rquQajSer. +s8(7FqUY]=bkUP7n`H_7him-QM;QU8f>j-Un^mg7oDeC]XI@9Q$;u>CMV]a#D5!^K]nc)QiH8@?g1GNi[@]AVU +s+lN0USY9rrVuons0&0B//q."ZHiLCnc/X5n)KPth1b@SOR:JmAbFlkqs;<%q9f6= +fD>!eq![)>rUp3hs8W#skN)=1p&DqGfnY?V4ZukH=)]lM9EteI3]:-OZe>3Is5Ml5 +T:<8<,s4[c=5;Nmq=t!dq>U6er;6Ber;HEhrqZQnq>^Kkrr2i]rXf#-rqufqrVulq +s8Musrr2rqrX&N&s8Drrr;HTkrqucmDu0>.q>'p`q#:]sE +kLPdF`+&AuG5^QXmE^j^e"bsOSFYdGs7aS6s4@;Nj8])Cs7c$Xo()hYs8)Hhq=ajG +h=?AYSm#AHF(Am2G'8ttdId8+s7Ys^N/"8^-UeFL+cM8Lr;$Bgp]('as8)Qjrqd3' +r;-Bkq#:K_jY_s5f"0gNW&4D=Q1oqquVp +k()%(E:rP"s7G4FkkK[DUL6`\3drK'<(N2$bl>#Uf6r7:p\b'Ag%Ji`NaQ1a9M(>B +V!@+*s(Q8!cdUJ@p\=dcs+5ns7XS4 +m()-#Pi'Q9qr*e;ie?[BBA'pskf@34l%B$2OT4Bbh8`XYfQQlPT`"<%s7c8kT#,r* +Co1H3OCD=WY,Kpg_;Sm9H*=Nm\[pEd8p#Q0\6iL5O,_B7fDf;kFR\qoq"OBaWN\B3 +6bK;0s7cBRd]M'9B^=>Wrp""nk\9hEFm-qjs6Q0Rn=o:'OO1^hhp7Per6,-?f_4XW +qt&bGqXFO`rVl`pp\4^[pAaj^s7uO;s7c-bH?>Sm&iMg/=h1lhs8)cfnGi1Os7Z'a +s8Du^kj\??qu6'mrr;ips8)B\n,3+[qu$?ip\kNts8Mrrrr)lrrVufpIf03Er;Q`m +p@n.Np%/+Zrr;utk2l"&o)GS_Z:%#UhVRJqrr;fes7Pj\XejN32JYK5BROurd)kVK +oDeOQs8W#sr:^0jr;Zfns8W#sqt&bGs4IAJ_X??Skgbm]dZ3eFMYZ"\n'>b7b?Y&' +EW>Tdpt']9YYEuk<<)`MIb2kXl/Ij#m^rMum)$3LEFjuTEM8>EZ]'^@^VAG[2b@Ok +GI"O"BP*77[-D[KVld)Ybg5cV/pLhJVr8F6Lqkk0ePBfn9"YPl0a;s6QccoXt5'ciLbjDngYhV,oo<92cfYBs7c$_nE]Z5kj&3HqY9[N +mcW4%p!Wm<`:rSijjo"Qgl;3jP4?tPk/;$0enG*MGlQZ=gq-PG_.Wf4NrS+NXN^5"s.,Lo\@C=q +Y/Nq);V'LNhVHjU5^T17@N64>77((?P+_F:r;Zcps8MfqrVcWgr;6HfrWrK#s8DlqrVccp +r=/c%rVlTjrqQHkq#(*crr7HGr;Z0MpAb'jF)Zgd.n&+Bn`f39`51:h1f;`KmI'6= +qtC'Vjo8[iGE%9Js8)cgmJQqWq>^HdqXrhFq:blKgAh,kims.7^gcKZEW5-Yk0%eu +[p\XHC@KJNo?gV;ghZrHI.#1(h7ROleTUuhS+5a1i8'jYfVnT9de8.ZjKYbhkMbms +kks`/qZ$Knm-=BGrVuZbs82Nis7u]dmJm+_s6oOY]"Q&>hW)Sj`&f_3EFNM4aM?NM +WW2FrrTTL(c!BYd=oRSsqqbrVeReX7Gk9O/jiM)h_d;WUD>N7Bn_/EA_f,SHX8i%1 +s8:1BqVD/Kn,NFdoCb!=jQ6-_c02mPg#_/ls8)bRL8HIJ7Qrh8/h':M1f$+h9N+bt +N/F"nnbN4as7l?do()GJr;6HfrWW5ss8;for;7*%r;HBfrV-6gp&+d_mI'6!TcmFH1BcYrF%G5p]WmE&6!dT?1lA+@i`pX5!" +hjF5sLud!3in9^Ne=kmX[J07AqL82$dE]f.p\Od^s7>d[p@SC^p](9ks5i/(s7cQk +o`+UQq>UBno(DqTp]'pYr;60e^9kQDjQ-=.iSi(aiQd\Sf7s=lLB$O_jN^fda\`#u +DrJQ8o@%UHd:_@P<9hb:s6G+0ics"g>ia@\oAuMBpqZq0gAUp2p\+.Sr%eAXs8N&urVuWas8Mfnq=FRbq>^Kms8M`as8MokqtfjTrqV$CoC;k\ +qu?]ns8VunrpetFm)\bVWT_iijj85EhK](mK`C7Vh82ndjE^d`GQ$?:pXa$DbuiuE +:ZKMplI'4uaCXAZIIcQts8:1Bs5s.NmJHb[rr)lop]'^Js8VurIsRJ&(c[;&U@%.D +s8)cZj8]/Vs7>^ZZ*(oWB6=U>h<=nB)h7UpY1Maac,T;SGqoPs7`r$s4mYNirB&Br;,CLIer1+s6]jdo'Pi)nF,ZB +s8Duss6&G%s8Mohn*09'h>dNHo_%>Gs7?6iqXj@Or:L$hqu?*DjT#/Ls8D*[n]Ln# +]_^fdh91*$b\m:?JH,%lgV..T_IE5mD?'Eas8RZLiagf[8BJ/(ld]t.a`$%bK`(JN +s8UaOs6B=N4Ri(;qtp6iki_d@r;V7nP#kRumHOZGoDeUWs8D`ms82iko`*:_i\<&M +_SFFenGE"Ts8;for;?Ehr;-UEjrVlTirV-3epA+RWq"aR]s*i\T +huEZTJ:3M\;f([Xs7Ys^s7lW=`Um2+I6KPn)&"qQ)b6d!_=I*es8VZfq<7kVn,MqI +s8D0Xn>l6KKA>!Uh:,g/l)4RYaS=hekg4YUlA#?(K'giol,dE.fld/LKC[iYjOK@U +hk^/F_#OGPq>SD6s5!YNjS\l5s*Xk-s8V6]s5a+VhXg?js8V6]s6'C[kl:YKs8MKe +s7$'dnG`@IrVk=Hs3q#JhuE`@s8DWjr;HZjs8VZfs75j_p@81]lMpn>q!5EGduiM; +L@O>jn_Tek`d@%(Du]WYs8R9Bs*Oe0ElbFVs6>UDr2&Q/IF?8\s898`s8UO9mF_I= +qYgEnqu6Wdp&'>jN.-25naQSXqu?Kbs8Vrqna$5Qp]%P$_^HfjW26rln,<7brVm-$ +rqZ-Vmf3=dr<)rnqY:'irV_3Eq>L0dZq"FX_s8W)ukiVNY +`S*gL?;3t(q=FXXmJm4]s6/D@T:!)nUrVQNiqR%s8UpTs4RGPf)>U!qu"t>q:#-6eG8pl +qYS\?s3(HBaT):bq"E)1oA0H@mf3.]s7u]pqZ$Tiq>^*Rs7bXTr7q>Ic0XPqgUEjrVlWjrV69erqQQgrqLm3nb<(^s7lgpS_hT]4'l]qD4S`S7Fi66':kCNWqJaCj/m+$g]gR\)u[JoR@s7b[UrUU!gpAY*b +rVZNlq#CBcIfKH>s8Vins8)Tlr:'aajo>84s8C=ErlP3=_YNu:o'rmNm\oXEW:KP` +kio;CoYUY-dJs7%s8V-Zs60LWk4\0"s7GXWrUKpcmf2q=s7bLProF+Uh"L*Hf$/[( +giCrj9\.KZoAaQOeTL#pOT4CUs6d`'o:0ks*ApBG]nbbb2**ps4Yuj[BIb@5?\Bu+c_GTn*C#JoDeLTs6oFHs8W&ts8Ms9 +qtTs[qYL!es8D`fpAOserVcWmrqu`nqu$Bgrql]jI/*I6q=t!WlhL8Js7,LVs8)c. +[b*5^:RREUn`p/SqZ$?_s5rD,s8V`[mGRd3p&Fsiqsa=Zp[8(Ye)/Q;m+RWkgP#@^ +HJHPEf"tkRb\cLjDu/XJs8S\jrLa,VScA)]rT_8uldc%,m/Qq^s82irpAb!^qu-3f +s7_!Bs763inGiO]s8Vojs7>CBjNQQ5ZcU%IcGu'rc&^;tM9X.mbK,%Vb^\*gMp0>3 +c-)p-aeR2*V:sM)mcqdkq:GZHhuEZ5s8V0[roj@QhtZNls75:Or:0gdiU5g'o';D! +hf7u@ErYcss6$$3^RK@4ltU3W2`+)\/OirV?6eq"OabqZ!k*^9k/b^:Me?bNn`cs0]&\=]9I8 +S$`.js82Wks*jhEs5X.ZjQkpjqX=Iao`+s]k4n>Qf?&L=l(A"OWrMg^hSs$K[8#;k +>3aUTqWNV4oU>gKUA=)Xrp\&0puVPJnc/:^s7u]pq>^Kes8MTes7cEjp%/4Ync/=K +qrl_re\BeYXOtUlh9DqWdAZ?cYP%(gr9h8sn@\el^4-+V_uK\]lK#nGiPaO([F*6s +d*/-7e>1sUVVp:/s8UOIps/j/df9+#s7u$]oBuYIoDeIRs8D6_o?d="\G56js6[8p +rQ>03al:0um*UL^ics;)6.!S&l/5S'fkKHnN;rY#r:f:Gp[S:`rUB=Is8N&em/<97 +W`2f1-Q+*p7mUXUQb3:ns8Vops8)cqqZ#L/oC),@rqlicmdU5Qrr;un"T%uis8Vro +rr.654BE^I4^M6^Kjs7,$ogWb]5c?]H[V#U=os6Gp1b%]PE>N*Y5kKn2/d!=Kn +KAtIPn`[gfp#,lKq#C3js7lWop](9hIfKHEr;ZTas7kdWp=&s-_jPKp@e*'u/%7go_H:JY3`me6PSp&G'Q +oCCB'm,e$-lMpVJlIiem]Q`)PF7nINs7Du[i.L+5C%Ki"ptCDrhN@'POke0Kkh`oK +p#H)Mp&=mhs8N&ur;HTho)F1:li7"Ds7t(:m'Q6ESE8XdhUdPFhNRd)XoJC]jYs6BU_m.gMKn,)e@p[[,1n'Lauao2+Xs8U.>s2N:* +NRcLHjkm96m)AqnfDkO)s82Ber:L$cmJm4Ts8DQhp>tPmZe3BQfumN-gs&UH`^&M, +:#3cmp=k3!s0)IpV!66Jim35Vs4m8:ipZ3ms8Moqrr<#rs8Vurn*9rMp]%tq>^?lqY'sdpAb*cs52N.aMR/]_;guOXf//*r;-HnrVlH[jo>AIs7ts[ +rTa(:`pqricFe8H]k?3AD#a3pr8W7c`a\u8PQ19Qs8KY1oY:+``W,\ns8Vriq#'p^ +s8N&urr;`hq;hSSfDg="c27(:iS'73`c'VdKD+u4s8T_2s2G$q<.eL +mJQA@r9X1Xmf3=Xs8Vcls7lWoqZ$Tpq#CBcs8VHcs5F"XgAh,uqY8&0rlFZ$1DT/kWm,G;Ms6BX\lK7*Zs8N&MeDKuks5)N*?sJ0m$Ss^s>7h6%2_\EJ +@#D4gdauk9JUW[9gZJ>,s8)Qks8N&srVuipqu?]pq>'dbs8DrorVq?Gs7Gp[s8Dud +m/?AXXr:^0ep&Fpbs8Muso'lVJmeQn[s8MZ^q^-as7#aS +qu?*as5X.Zd-Khihq3C6jP>g\l`'aZ`;fkbrVt7@qUGQFirB&Ds8DBcs7ZHfpA4FT +s8;osr;ZEUp\jdbs8;osqYpNorVH3Xp[[\Ns7?9elLsc&s8V-Qo@![=g].<(l/fG( +c_'"GVY^&*s8U@Ds2Y0>e,K@/q"!G@nC@3u[JB9Os8IiSreFDOl\=N@L$Q^Bs6$Wd +jHJfN:"dHZgsM>cq:u#MkP4W/s8Vrcme-SVs4Glk6U,$@3+%Z$Z&XXI76YCWQGNUq +s4,Ea4#fs=Y.O8oqt9UZs8Mus%fZJ*s8Vurs82irqt'FLrqLs:pA=mhs8W&tai;qs +Of$.8g[jn6p$i"Xp&FOHs7u9drql`eo`+UYs7,UXoC)_Zp](9gs8ViFs89OjeUmMU +NrSOEp>(_hb[TGK9\I6Lk06ub`a\#PH0WqEoA[4Un_!m>pAY*lqu?]ls8VinrVHQa +q"rk1kIK6pQerS1O6l&-r;P=Droa1XlhpeQs8Vfls82fp'(55[r;6Nns8VfcqsEhC +p%8(Zr;ZccIfK?Grql`jp&=g^s8W&trqZTip%JF`q>'^Ko^Uf7p=]B?e*6)+cd8$- +e!9(]X8)_6p]&Y6p>l,Gnc/UYs7t4?n"fgLNrT-Ds7hlUhidW\OSRFbkJUud]fY<# +($ke ++I\Xqq"Faer;Z]ls7lBcp%@qVs82Zip&"[\rr;ios*jtGs8W)uf@AkoATf=B2Ej0# +?^hI)4leRg*pr<@6k5YJVq>('Vn,)_Ps82irqu?T\mblmS +_qs%UoR?,Es8V*Xs8)Eds7H'cnFlnMnGhkEs7lHjq>L?`oDe1Is7lKkq>^Khr;ZHh +rV6Efqu?]orr;W]s7c-brV?Kip&Fm]s8Mcmqt:!hqu?Wirr2fcs8VBZpsRjMWQ`_S +dFOuWo@3^$rk]ZLPD!'&NiPepQ]M@Y2<<)-3 +lJ.Z^eY<*Cdf9='rqY^Rq!nC`s8DlqnF6JEm/Lg6O!#B/EbgnhGFg`E<%K4^Kn#NG +g$Jb:s8Mrrs8MusIeig6p\=@Zs7Q0_nc/XcrVcWco_/=as7Q!`TUi5o??8_.>ojn? +.jmYD2,J=1Mm'/%rquflqu?<^s8N#ts8)comf3=^s8Vl?jOAq:a^Y24JH,YLs7i/M +cWoDK8H7jes8.KFl[\1-ZIdmC6qu?Wns6oCJkiCjq +l0&$9nGi4]oCN"ElMof's4#[#ZaSnLM7IPEU2P%FK8-^eMQitYbKJ;tf\c/ms8Vcl +s5`M=`lI,4TZ2qI["3\.G&jF>M8-L&jh\Rphq7tsl2USRs8)Ter;H$ZrS[,8bMM9s +hrN_fp](0i3WJjHs7>^Xs8)Keo$Q:DQH[6Wgs]Nccr&6+5Ld;8kf[Q;if!j1WrMh! +h:%\irlG->f_kO#rqu6aq^DCAs82cpD/P:B%52$kJ*5ejs7QE0\(dL=[ccWJrqcZh +o`++9oD8:[rt#)*r:g6ko_SLSs8VllrV6BW-iX)Es8DudmJHSIs1GkfE,:5=@!Ops +;^j"X-R1f[>&X9:s7Z?irr2qHrVulfr;ZWbs744cbCes+FO@a"s7_]VmY0T<;#fa" +s8IuWs.&3)Ie`K2s8U7@pt59-k5P/Us8)cmp&Fp`s8Mlps8)cqqZ$Tjs8Vclmc+8t +bOqa-cu!Wl3B;"+-Xe8E@3$7l)]2j'*FofpJn56qXjg^mJm4]s8Vloq=FXdqu?]os7uEh +qYC0hqu?Qjq>UEjr;Q3\qX"7^pAb0hp%@qRqZ$Nks8W&ts8;osr;Zfos8Vur`5(&F +CkYJN?YO2"p%n[\qt^3jrr;uns8)-_qV_>=_<010pYh(FVa9m&fk'[(?00+,s87uY +oof=8NR>dsrVFM5s53\DkPtGZs7H?.\)Dj]UkaE$MLi!hK#f@Rih5gY)UqRDTXN6S0j. +.k5d,3f?^(SOl8!RQrut2)0e6,]kUeFW_T1+rsrP3cSG/M1'`GXfTh#f`&q3qmEm! +Xf^KVUropE`967Es8V6Wp;-%WR/d)Us8SkonWN"XI.,FCs67)oo"Y%`T@(Z&g(3@\Ms.:G"]?8aBI4>Cn;06f#jEZPg, +3\Z=N0T81OPKo;K/>-%4ud`+_tK7S]ItgG6U-bq +3L;?JM(0j+0eJ;=/rVYCNC#go4#`*K-@.!^F"o7qH8@*u-6I%O+_rkeHSI+'4#`*d +5*R]LF#GacR$=fFn*'Q>eG&OGnE6\KpTso"\G5$Hl-a_NictLkK]CO&e]DmT_05hQ +])VfWs8V'OqWn%Yrql`ql0SH3jo+oEs7#CTe&pdbZH]k\aHr!lDJFlQG`Tk^eGK(A +s8N$1s8W&ts8)Qhli7"Vs8V`ap@/(]Icok[Ism5[=`.\TH((#)e^3g=eFN>(s7#CT +qtU3cp]'dXoD8L]pA+:VqWRtZh#I#dn(Y;Jj1#'TX8i*ijj$WFZnU=O=Oa]dd&h$8 +]oDdReG&V(nET`Ep&Eans%c%5$33=d6&%QZG;q0m0dp`g,\\hSE%N;[1b"2BIP?pQ +2OHW\OYnJF1aS/A.$ZqIRQrQt68P,n/.t]c8 +Pq=A?/1-*423TaGLa=0i1G+;<08DG>LbpW80IMH1/VlYNPW^jc0I_i<0pj($JMJ[; +2CjUs#Z3B-=fS4"s8MHdp#oJd+>tJ`1+ae70IfNt"^KaqXX%DnG2kOs8)3`n(RQs`;AT$s7E>kr1DQS:supMq;-hib_G)oO5e?^ +p$U]9j*q"+s7Q'b:f2]`+':QaI7m4u.4K=&5)MB[L+4Kn2_KkX5G(G-T0G#p4t_pO +,(DU&M+9Ol5;8-V-\OB*KJk6/1am_k&R[UOH9sT@2D&mk_Z-!bbSLad2_BYB/rW(S +P"7d'6opDj0n_VDKge"[4Y_RR1P\1NM**GH3-Zs/2CO>?.Z6;=OZY=f7m!\2/X\^P +O$PFO-P]QV4C>q-YlFRWm+J#U\7ajIAbP+paL3GZei;C)3;2Ebs7!)Ed$4@r_#OGj +q"NeIs7lEhs7u]po(`6i[`MEIBFbRq<)I+BC3Xi>J!?(mVkgl7\&e@gs187"^>R8>mcWL, +rr:U%mq$$g,UH_[5(kOAJKH%[-RaR'1laLONAiVQ4Z&9X.>]I%)LNqMH9a3D/0K*d +*HWt\H79eP-l["Z-?_C#HTa-52_B2K7>s\uJO2AEkMH6R[eDg:F[.d<2Ca53,Bu$n +H8[3s/0SjS(1J6q>qI4:1+.3+/q?/BLHdMM4"c=N/;lM=N@Z324>a+C.Ac8\q<'VW#Xnf"QCfb@p%d=k1AKgrM;AhHU$VUAt/*iRX[pm(r`%j7N$) +r;ZZ`q"s[Ys7?*eQCG$;4AV6,VS9^cs8;oal1af=s7Gj]kiVO;rVufmrVmB$p[S:` +q"+.Ep%InTs82fqIerm?s8;ohn,NF_s7PdZR?5HV3c?Af:/4>pXJio.p&Fsis7-$Q +o)InIs6]dbn,NFTs8M!VnA4_UScA8Gn)8BAbZXQ"G5qT6s7iMlosFMZa8bo1mH4Fg +C6fhQ;CNf17mN[t-&jW.QpNj33AR$W.#Tu7N&rYL/KT0lINa#24HquaJMSg$5rOBj +7?U/'Ld!YD4>M7B/Ta-3GV17U-6$;(#"gWuC$FLS`k21).;UX_E%WJY3%]JE4,-Eq +Ma]g_5;daI13PN*E%rh]0I:]g,&\tRE@`>X1amf3/;QJJRmfH;5Vf)l,*k;9R78`q +59te9(gUiM<-HHh\ae:cqVeLFg5>LXGgO#oqriP0s0ht-`oYsRnE\!ls5N_Fk5>8V +mI^87kk=fOs)WFDIXm^_r;Z3Nrr;cnqXaaequ?]os7Z*br;-Hiq>UBkIdlmnr;H@QCb[8W68s9_4FUd>Q&C1*c,T\)ant,Ws7l6d +na6A9hZ)0Qs2VqHXJOR5N5'1>QTdk\Z2O[]!gk@ +^[]^srS?3-h:hnQaSN'=hhZos@pYNj5'ek2B-\R.-mWdR)K@YdAW9;FV`cN#1`_]F +.$IC_N?SWuKkl_?g>2f%g&LZVs89(Vb&6q9N;rOQs8'Rqiiqt?a8c2"p\O.Ps82Kc +rqZToq>UD4EJAaaOo5"Sna-;To`+sfs75RWq=aj\o)JR]s8W)qrr`/oqXXXMqu;-D +r;Zfqs82TkU7Sna5@YE<3`8RqUn#Wqk5YJXs8Moqp%81[s8VWcp%SLaq#C?gqYC'd +p](9bs8:gNn\Y>*]%khic,k"H`Gif6H0+(`s8UOIs5pJ\VE$=t-653;4_?Q%?nWg8 +6p#]L.:kLpBMqNMDJ4ujM5[ngbLM'djR;4/s8)cep&F=Iqt0dcqu?]jqu?<`s7Z6f +n+$GWrVulqs6T"H^qJ*uWkS2ss7#@S\$X3)eE5u\r;6Knqu?]lrVuBZs7#[\oCr:^ +s8Vurs82fqo_8CHkPEEJj0Z8>U8Gb;BT4c(A1]BK5WjlW-%d9OF!_TF.Mc*&//MJ` +2dk7TcM$AIs74)-rO;7UO6PPZjP66pm^MTL]Cbd@rr;'Sr9O.Vp\4Uck3D[.nc->< +e7E-:kMc=7nGiO`s5r,0p@81_r;Zfps7Gm\oCD\UnUC9/o`+sfs8N&qqZ$'Ro`"gh +io'-.>&,B+3A;pVG&Nbj_sRL!s8Vops82ikp&FROpA+R_p&4p`rr;Wfs7Q0eqYC0k +rVZ]omJm%:q=V_Nb)Os&PjRqBqu4S7s4I>NiUQKsp[e%4eDo60k0V93e'.4)aQhI. +oZYG0p]qu?Nas7?!bq>('eoDS=Ws7uQlrVZ]q +nFH,FqYpDArq5pZnEolJrVuors8;`npA4[YrVH3ap[\4Tq>^9ds8)WmqXsm_oD8(O +rqZHks7u]pqu?]ks8VNYpZ(T,q#CBBh;PlYd\s7pPEX+PNmO8YeW,=!Vjte\H][4= +e*>o/lf>2;lCR5"LsX@gf[lGWm^i,eanP__qu>\0pAX=Hq1-kq"k$WlhtmC +L2:CJKm8cXQaEKPYCh:h?X.MF9O2g`J`PkUr;V6CjQ5;!rr;T\q"a^as8N&`kjp\h +64XJJ76k0i?@n&fWii;G[^"6%`SC@ds8W)uo_&%RrVuB_s7#a^p\Fjer;ZZjs8Mof +s8VEbs52;VWS?F9p]&J:s4mMOjRE$*qu?Hhqu?Kbs82Tkn*L#Qr;Z^3Zs6oCLqu?]ks8DNcp?VGAnG;_Ms8)EgpZqPBpAb!Zr:o^S +o^;MKoDAL[s8Vops7lWjl20$"s4-lDlM#c-p@A.\o_ea]qZ#aEo_eadj6+egs46o@ +\`W4El0jV_ght'QB&`!LnbC*"s3pWJo^DDDpA+agrVu!ZQ)C7qFM37XoiDjlG\#q"ja`rU':PnFcVRs8W#ss7lH`q>9U[ +s6TU^hXpcpr;YLAs3p?3eG0(+lhfZ4s6ojbp?V83qu?K^p@/"[qXXFLqu?9[roNbN +h"^p)o`*J6s4.&IiVWZ:p&="Js6G.-s6/qOiq*36oDe%Aqr78Jlhg_Pq#Bj\s7?6i +p@\.Iq>0a`s82sanaukN +p&FRWs7H*dp@SCUnc._Cs3L*4_mJk`,s5`eOl1Y/Dq#BRJs4@/Je,+Uo`;KYD +m/!.Is.@m%FOT&omeF?es3^`Dg$\[`p&EnGs6B1Pk4nuHr;ZZao(;t]s8)Bfs8)cq +p&G'bs8V]jrV6E`n,N.Ss75[Ys8N&srVufnqYL*^s8DutrVu]gs8W)uo'uJSrr;ii +s8Dfol/hsFqZ$<\s2`.9iSK%T^qS"lrr;fkq"as[me>`(;c>JJK9]l#Q"5?!P\,rDDP!hW +]u?T=s4m>Gf_YX)me"s(s4b63S?KefTsT6>Y^E1PJ>BW*TX'*;Xa?nRLSVA5UU>fN +[=tB`Kqu,4V7)5X\;%9+M3OlRX1a@m_3:1`I\4!(ZcSZ-[=+g\GdGMBV7UEC_.]^T +>IhglX12K>\nn=NIDZrJVT7,b^WWP!f,p[\.;fAuD] +p&Fjfs7QEgp&G$fs7#FUs8Dutrr)kGnaZ)Is8)3OqY^3ip@\=Omdo`/m/?k^s8Dut +rVulos6StLq"4Udqu?]os6].Js8N&ts8Dlqn+m"GoDIL[a/Yo9NNBRQXL==n[umVu +NifsVZc&<&Y(WjkRDIL]TXC)LWdp>:D47hKUq(r\a-Nd=R$X_.S#MLJ[[a@H\X8\\ +IA*uuT-sKr;_8UV(oK\pU?bI\jT(VRh8T\:LThJuH54WjmbSXF#AP=e2O= +oDd52rmUlHh#@?0qZ#2kLJWMc=c&VVLRM\,QXGW=A'nSKTp&&O_9uQI?U79I"@AtOeRAeUj[QO@tpRiI@",]OA:+a98B$=K9K9! +U1]d`CPRp\Llu_5PBDJ:DhF'hNgP6LOEH_VK?DWUmdfE8rq#=8jMo$T9gqla;IXri +Jsh[td*(GCoDeges7Q!`mHaKDqtpC!qu6Nns8N&urqcZooR?&gmI]uJs8;o\jSSlM +s8;Zlhq[bsp&G$hs7c9`l0[@#rT^!>k10#$mHXK2 +n,MtLs7b"%g[tO;o`*b3s3L<:jR<'8k4/-8q>^9hs7uWnq>UE_p]($gs6fgPjn7?r +s5*5Eg%57"nR;IRo)I\>s5EPKiV!61oDdhAs5N\NjlQ'aRA5S<[$gdjl0J#rmJ#E4 +s69.Si09j^^s8tHpXSd4h*nF-D?k53s,s6B@Yn*^#;o(VbTrr;*Blhg_Z +o`+IPrU'F\oCMnEkO@6sqW7YTnb2hFrr;]ls8DllrM,p]TpVg.Fc'mAGtCA/D/"Ta +Nh`PM[,'L!qtg9k'_qIsqt^9_nb;bNq!mnCmdKFqLP#M/IWBFP;G^\HG`>WtBJM21 +PE2U'j7`0;s8W)urVlWls7Z$VlLjr@oChQjF`1;a=]es;Jqf=j@;Tq+L3\<4GCPcf +DM)2)H)@jUp&FLOs5inQor>@.D/tGA@YSH'O$uBR:JGqUH'Q_)ht@!Io`+RVs6]1N +iUHm/o_n(JIf/R*r9X(Sm.C8Ao_n(IrTa"Sl1k;HVmDkdXd.r:fD,C4q#B^Rs68S5 +e9?IU]#:TBs60@[mJ?kNqu?3`s7?*eoCMkGo_e+Ns7#g`nG*%QpAaLNr9f=STOf?jQDbkJ]^d'C3s +^rX[Df@7RT^XLrar;ZKes7GmTm-X<,rqR]6q#C6cs8Miop$_q/biihTJh&36$O@b- +/jH_K^$b:Zrr*/hm-=WMs8Muos*jkFs8&OfT7;B\AtON8ijNs8V]gs6ojbm=+^-kkkDK +r;ZVnQ5YgmeQmSVTUJA>q[gD0I^it/:'9.F#c3j3^-\77U8>L +<\cKsIY!7Do(;D@nGE1^qYU6jrr;ces4,Q\Q]nRM9Pt^]2^9A+4#]u^G)`o8_uK]8 +s8Moq"o[u\pAOshrs\l#q""Ibp@S(EoCVJLs*jtIs8;ofmf2nIs7#CT@U=8STsjmp +s75UVrql`qr;ZZis7#FT/Ls++(H=-%=W\P[2DK2)-uLjmG;_(#-m3:[.<70pBS:u8 +p%&.WoD^9d4=h^8X.cWpp@\IboDejUrqY@Ls5X.ZiU6*coC_;=p[8%\qt^*]q>0aZ +qL8)3qssLXn+HVFo_n(GroX"UlL4c0^<`jCVgbefR@^pFN2Cf^VgQtM]^PXMrr;9[ +s6KCUkPG5Irr;Wgs7H$\me-JGq#'RRrU'@VlLXo8oD%DY?SF-9.4In.)Dl\a +MuN_Urr2roqZ$Qos4lAp\@0UM6=28o9ee8'Ec%,"Kr*>IlMpb]s8;omp]'LAme$/F +s8W&qqtpCHqtBdQn+#K=s7H?kq#CBmnF-,FoDeFNs8Vurs82hM`1im7PeA!eYhJQkp&=:Us7QBkp\4OUp@e.S +qtg?ls8N#t!ri6!rr3'!s8MrrH2djBrr;ips6T%1Z2*gthq,*qiQLWQk,5)`%1t.1 +Fdr(%s.H7A4[=-0*EFL1@7!&*4#)%3+_ieaE\oFf/h(9j2.nNj;0-];o'ZPFlM]l, +p&=piq"XmCg%\]OHp9f.E,M?;m/QJ;s82Qjlf\91jS/B?s8W)ss8MgTr;6Nmr;ZQe +pAb0hp%IhRs7l<]o_.tSq"Fafqu?Zks6f.ObfAn+Lo,lWSE/Z$r;$Bmrr;6Hk5YGZ +s*jqEs6AkEr;-Hbn,MV2s8Mcmqt'jRiW$X!nPMc+3A#/'*-&Qcq:34Z:,cUiTr@G7 +_T]WEe]<'Q[:.G$G5q9Js8UmSpZheUs8)HhrqcZlp](-cs8)NjqYC0eq#:$_r:g!b +p%eOQoCM)4k4nuJpAaLOs6A_Eh=:O4klgqJpAO^aq#^Ehq#:2?rr)lrrVulps8Mrr +qt^9gq#C0bs7c6ap@e:So_J1Pr;-0On)^RuaEY(nA&>p3iSM36mGh)D@o?;nB_4ZIbKM8e)ns7,FTf[Kl:]_%kec`!S`NJXa:Vo8W4s8Moqrquf`li6>9 +s8;cor;-GpWRtVs?B\,VI-]tqr:ps8Duqqu?0S +o`+pjrr)lcmJ?k\s8)Egmca]Dmf1YUnlf"=)&"m1WQ4Sus7l`@/9]!A\rU9dcqtpEmq#C*Yrq,dYs7?*ep&4ITrTj:Wlh^JKr:g3h +p&G'fs8Dimqu5pVs5N\Nht$g-n,MhGrqH6fs8;iqr;QTkrqlZm(B"43qZ$Qjs8W#s +na?/DoC)_Zp>Y,erVq?Es6J_(gWl5-\RF=FDS*AWai/Z-s4Ud_=`\J>e^=Cb5Cspl +CHjb;hUVZ(q#C']s5`>(oCDqTo`+d_s8Moqs8Durqu?Qhs7uEhoC2e[r;Z]is7Gg\ +p$i"\q#BsPs.>_$9L`cXMQ#e$rqlKjs8Dudme6YZs8N#qs8>Ujs8Dump](9ms6]1D +O,]Ms6rd&W@m`Fd69J^<1L2CP8f\^28jm:Lh"UXrVuN[s,2Q*/0@kX05LUPs)M:^C/[S$n%enbSBA3I +_lmhKiO&XZmHi`pn*BiAq#:$fq"4U[p&G'cs8Vinn,!(HrVu$[rpTmas8Vlos7cQn +qY^BmlMLV>p]'+Bs6'"Qp@A.\q"t*gqZ$KkqY^[Ys8Drs +Ier^1kj7furr<#clMpn]s8VT1i6R2#^1>=$C&e%>gXWP_.P.Zt`iPrf2(NW22i*ob +iqN!Cp\+XZp[8%\mJHeVr;6Nmr;Zcps8Dorqtp?ep\adZr;-3gs8;o\jSO@MQ:!fD +Am^C8C7/pNOukO&*Z?n(5ZaA>WVlVm!WW/trsSf(qu?Zqq=spcqu-Norph:dK7ts2 +2D?^H3]9c'6!lT,<'3'@D.n[/XiCD=s7,RUrr)lrrYkb6qu$EfqYTs]qXXFXn+cbJ +s8Vl^n*0]Fq#:;BlKRj-mJ?k\s.,Lg/0SU+!(+c:pU-jA+:f?fQ&#D5ec5*[s7P1I +q!tbc[lf6mtr;$BkqZ$Tos7c6dq]#A.r:^$co_e[\r;QcZs;[0d]A1C6-ieqHR!\+<+mYrr;ik +r:0CNm/?qZr;?Egqt^-ep\b!arr;`ms8)cqqY'XTrqRc%kO"n4W1ffd`kpE-Uq`n* +^q[M2]!oo%_:7/ijn/0Arr2osIf9^<`s7cBiq"XmcmJm(Lrqc*^q>0gTs8;coqu-Bgs7>15e?QTq +^V]BO\a3R!D($5W.Mti.@i&&a%n&rQCu!S@iS4B!4+8Y(Am8AmmHsr>mHX]NpA=a_ +qYL-grVQNkq"t!_qYTm]rUTpeo`+s`s8Vfap$2SWqY^9fn*ffDqZ$Qms8Dfos8;os +r;Zfps8W&ts8Dutrql^HqtBdSrr;Zis76-gnc&RXrVu?arp]mcpA=a_qtg?mrVu`h +s8Dipqt^9lrr2p=rVuoorr;Zjs7?3ho)/LVqY]dWqsF1TmJ-PHqu$0es*jqEs7Gm^ +oC2e[qu?0Os&`0N1G4,(,BmR)S_)TqnFusIRC>4?Al;N[e'A!Yj8[BClss=D+Vl>D +ASgDVg].*Ls7QElp](6hp\asYqu5pXrpBL[o_8@Zq#0s_s7Q9hnbiCVrr2Wkqu?]k +s8Vins8)TlqtL-cs8Vlns&&X\s8(mUq<7_NoDeagrVQWTjP9b7lH7MX',h392,po` +hu!$F_mn`<Jo`+sis7uEhmd0]F +qZ$^Knp@n+QqXjacp@nCNs8V`ks7?9jnbrLXqYTmYp\"1Mq"a[ao'lYSp]'XI +o`"k2oCVMBoBZATo_ng^r;Qs\q!\"Sn+HSJo_S:Pqtg'crV6Biq>U0erV-?iq>^?ks7u]pq#CBj +qu?Kis7]^ss7cQlqXOO^kkt>@qYKXRnbE._s7Gp>r;Y:Hs37REK5G4<1b)48A<+aI +o\J*u`51rbaQMpWs8;fpTUj.f2M!P/IkN*qIWrL!nGiF^s8VrqrV?KmrVulqrqm]3 +r:g'boD8CTqY]gYr9s[co^VP:qYTmas82cp&H;_0rr;uqs8W&tr;6NdoD/Cc+T206 +s8Vunr:^0jq#CBjrr;`ms7ZBinalG:q>9UZs7uZb%fcP.q=jp`p&G'js7Q$^rr3o0 +p@81_qY9mXq"aIUqXjU[o(i.SqYTs^qtC$cIeNI5s8Du`kPk8Js5)B-Lk)ZM(.gSD +Cb[GQ,U-2?1/6K`mcjHFp&G'ar;XUPoKPTW'+lZq<_EDlh#-ZKi6@)0^3otN^]4,m +s7u?fqXsmcp&4g`qu-HfrVuZks7cHkq#16ir;ZcorVucns82`oqY^Bjs8MfkqtU3f +I/![;q#C6hp\XsWqu5pZrU9darU]I@s8Up/fU^[GM?!C`s7"s)I?#6\5#bF4T:X-j +mJlqWs7cEjpA"Z[T#MKT<&u^i1FRu<08@BTrmoEqrqHHipAap]s7l?eq=spbqY^6f +q>C3cr;H^E`pZq/6iW&rOs8MoqpuqbRa2u/@]Qp%&._rVuins5`5+s8N&pqY^Bn +rVuopnaZ)Js8Drs'_qG#s8N&urVufls7Z*bq=ssdqu-Nn'`\43s8Vurs8)]npA=d[ +rVZ]orVulq#lOYrr;HBer:g0e')MXqlhRBO[4Njm,U#"1PbRU5rq-9crr.5^=b!>osb`-llZWL;7EKEsg:tsO.e]Nio]4CZpIbMMAb-5CJk.gfaj.DX"n`]B? +qu?BZr:osblfds?rVuloIfKHGs8)APr;Zfir;Z6Zs7cNmn+cSQ +s8Dlqs-/b2ZE:/,r9*"iTXCe(hp-9-e:,]HG5qd["S_Whs8Mus48AUI +qtp?ir;QQgrr;utp%/4Yp&Fm_s8W&tqYC-fqt^3hqu?]ns8Vuqs7uWmq#(*`rr)lq +r;Z`os8Ms=r;?Ehr;-L-m;5V +7<-,Vm/?YXq=4KeV91,(/%i*Zs8('saGJ*IBYpZLj3*AUmE_#VK+.qgT9Z)LqZ$Tm +s8Vrop[@MLrVQWgp]#^>s8VinqXF:[rVQKbkPtSNrr;iks8;TioCr:WoD8(8j6#[p +qJ^>">?+bH_63@m\'Dg:jjJkCaaV=0C]EnP@Tm[r.8S:=m-F-?qt^95_>dY5RY#ao +p[S:\p]&.FhG$O\3&#/(/8?U\;`H^=.k!bS6Whpgk5+lQq=d5Us8N&oq#:9ks8W)u +rVZ]jp](*bs/N!,V4tH=_V+tes8;cor;HEgrV6?jq>LU?mrr)lq +rVufo*rGm5qY^9jr;6Nip]%t>c?G[>VR,g^p?h89rpG73qY^6es8;corr)ls +rr<#ts8Dipq=ajSkPctY7QE5/5rib:ICZ_ali6SVo]cCiZLBOo?Ps>E9L=1`-tP4d +BT\(gfZjHili1!X@VT+Rs7"tHm`itbMZ;nKs8192Ne&Z+/!#FO_R@TU3Cfj2S,`ET +s8M6XmFD77m.^nPl2UY\s82irrVlhGq"smPrVYs\s6BCWfDYa.rVuJPP+$cBQb0WU +4>oMl3%sRS^[C$bdCbIf\VU:Ya7@s$7R'akFdr4)s82ZmJ9emc-[RBcFtOqPDJ"fc +M44,.s8MrrXfBu]?][cIDF-X!.k!bfL&Ss7QDhS)%FOPVFUr0e$Qe.;UadDC6B9+;A-E0QLc0 +PNq$)fZ`hT3E'9^@bT#Rs7Z'LgU:0p\+U^p](9ls6T%Ds8N&ioC;VOnac;;qYU9c#5%T]oD/4VrqucmIerm>r;6No +rVu*CqYU!do'HDIlMl3OVe')!1b<2d,uccZAM,?G3AGta9:\*rH4pTU,T9EtBTqoG +s3\jU<_IQK#;%hc8k_ZR5Wqpu03?-1ork:I1aPhKEdn&Zgud(Qf>`![^22B>JH,/d +P(S4-Cja:@geUd\Z*:D2E;7Z/`H0tfCYI0Xi7"pkf&omnJkeIed)Yd7K:4>;2,["P +E++Q+8Sodi,=OX[o^Vt8g&"uQLB%<3+VS0Z5`cfd<"]4&/fn:q7!V!U?o'H4I=.RK +kl:8Is82]nUnY?urVuZes8W)urVZ]cnalYX.K',Crr)loqZ#jEo6,2.?!;0/NMc"( +qY^6jr;HEgrV6?jq>L9hrr2imrZ_CBrVuops8Vlns7QBkoDS^]rVlNhrqZTns8W)u +s8N&qqYgF7rr;fos7H9inc/Xaq"aOSp@.qUp&4mbr;HEhrVQQnIfBB>o)Iq7rM?1& +4uZjt+AXmI@Q#oJ,q)>a=FHp;h:BsQbJO:HNn7<+KHM."/1*tk;L$j?s8)UhIb]*U]c>mAo@9%$gbjcu, +:8jqfs66c4Y!hF#?q\_U8(b_Ds7ZJ[J']AKC9XPno^DfP88o(I4sV"Y;b*$mC7"V^ +s3f9V-m_85-!3)WBL=[qK640&Vr3np`c>=f0,np_*beG?Jibu$BPWX*WRU>(s8Mus +s8N&Pg"uW+$hX)^rVlWms82irrVlg;rr)lsrr:m3ldF,=hqR`%r;ZWir;6EdrVcWn +s8Drsrr*r:rVufnrr<#ss8Vurs8)`pp&>!arr;Zirq?U'ns8N&joD&@bs8MKq +s8Vukq=4@[o_nacrq([/nF#uCnbDqOp\==Uqt:!hqrd/,s8N&Yi:/oh;([Y`5DP7P.dWf +dHB]mIXJaO)H10KIf/O's7=[b^i/#QB$nJ$mGcqu$0fs7lNjp\t)>m-F2LZb\CL7jK0@:J#JKEffqc +rpodWqYL6gq>^-Zs8Dcnq"+OEg\j;p?pH\a/L4JTJ[O7_s7Z!_k2u^ArVuQ`s*oNb +-6kK-00T$pn+uM/`4^oF^O+PVPgddMi7,h;4?]4$S+#\C1+[*jFef!*hsAg_c+8/N +a,o1bcaa#Os-o%Z6T]0D1g/,Njll4*q>^Kgr;Z?]s6]1QC1`h`,[*/]@qfG0gt;)e +nb3"_qu6Qkp%&"[q>]jCs+l038jRV@(.'c/;_'4dVPLfsp%n@Tnc/Xdn*fZCrsSSq +q=s^^s8N&oq#13l!q>^Mrq\27n*TuJq![_mAq#(!gs8N&alfms1m/-_Qp%IhRs82fq%GTUrAn-"#BS!h*fDkaHs*jhAoD8@W +q"XRToD&1Ws8)Hhl/VenGbdbkE'#jf3\k3UZJ5OtkGXuM,9%u=[^,r3s%,M);au5h`6&&RimkrIpupB1qtK%! +j"MoS9Ls#HH'nL.s7u]ljr!XIq>^V(?0Pmhfb5_G>ruh11pZDMU +nb;hJn*ToMqu?Whs3&@MG&Na#-q[lPGQ7X?ruCCmkOnQ=qtp3cqY^Bms8W)ur;6Ne +o_eags8W)ss"*m;o`+sfrr;`]n`KcKoDJUZr;Hq7.#69Ai2d.IA8s8Vurm-+KKqZ$*Os,2Q,,of!O<+Di"PMOp- +^9t%mGC1SP/.2RpTV%_Mq>YkdWXf7o;En'UOcoJ"k3(CSP_Y_f.P4@_4_M.)gALjJ +p\Fj[qYg6is6T:J_oC4F)*:hqK.eQc:e$0.l2Ub[rVmu'lJ;L?o_e[^s8N&pp](9h +s8D]lnEU%@Pcr$Af)P^Jrs&Glo'Gr=mf*5)n*]f=o(]c)_O[0pbf\Q-n,2nOs7Z-_ +o'uGQr?h++nG2qRr;H]R8s8Mcmq=4L@e,Q22]QS79=&Md\4@CqR4Bk^% +Whm>jkN2I5r33UCWrr)ldn+H_[s1Q%a1bh:UF`X9a?A;Bnbi=anaQ6iCjBQ"ErZ(;k2Q4:qu?9Vs3JmJhq[\no)J[cs8W)ur;?Eh +rUp*ep\k*drVlWls8)`or;Q]nrVQm"rVZ]orVulqr;8AIr;?Egqt^-dq=4"Do^qkW +rr;KVolt\14?>oKCOW@^b!J1$3]'sKZdJgNs8DiprVZ]pp(@9&q==.Ep%InLq""Ib +qu?]prr;uaIfKHHs8Vurs8DchqtKg`s8;osqu>^3s'8T\7Qbr8&5k_LG3@]]n`^!V +;M,eu75QT80e7Am*G,`a:dR*p5rNs[6YqX6V9d6Tk2$(;pAb$as5`D.o(MbLpAaLD +s7Pg[s7ZK,Z1afQiD)b'1FmP_'20f%;_Ke(0JHNP3?h3I-WnO2q8pVM[BJ^0[s7uHgs8W&oqY:*is8W)unF$2RrVu]gs8W)trsASpp$_JCmI9Z3 +rqRo9p\b'js+GucDJOdro)J:Ks/i6>IsRJL5$U-,;3Hs;p[eFPlhUMW*<#R.rV-9i +q#13frr;iorqucpr;HQnrVZ]orVucm%f?/!qtp3dqt^3hqu?]prr5C%^VilA;`Qg& +T:Mq\r;W=S]eV*>Am^AMfD5::s7Ps_p%/1Yq#1*eq>Lp%S=Ys8W#shV%XkP.X:KF\"]E,oU+%Yk7tfs/2F@1Fca&6$GFL +Fu1jm6Tp&B'ja('hqu-Q:amX\*VH?cT +3\l+-(iCW>D]9Es84@hZ0io834>AQl6pGlM.r/?dQMqlss6o.N;Fu=+3IrFm@VB): +ccG\Po`+XWs82]lrqU6tnalJIqZ$Qps8N&mp\FU[o^_V>s8Vfls7u0Sm/6e\s8N&h +nGRrgP"eMWR?Y"7KVgmk>::[b*uR-c*^DhH=/M\+md'lMr;QWmp\b!brVlWkrVQTn +r;Q]nrr2ior;Z`ns8Dorrqu]k"o8#kq"jjdpe1>\s8BaK_Grj`f+;JCm*3&Gtkl8Z9oHP2Y6o]]Y12CiCPQ1O[ +s8Dubm.1&R!rDckrr;uj%fcS+s8Vl\mc!p9mf3=arq8tZp\b'js5rD5\@'IR8Rrk[ +3=Q3D((`Au7r>)p`R)cq84$i^8SRbas8;cor;HEgrV6?jq>L9hrr2iprqucpr;Zcr +rr)lqrVulprqfXjqY9m^p\FXZmdBHAs8DW`pPt5rs8N&`l1+60q"jab>ZH4f%6h%s +f'))mq""I\p&C5;V59rlrVZ]jq"jmbq=XINoCVDLs7ZKmo_JCRp@n.Ws8MkDm-O0? +rr9I8_cBZN3AXf(3G^5j?dd!ps7H>AFghh`5sm\S>?-BbZeFI!s82Zmo'l\Nnc.q> +s.Q.(6pk`R3Irr$O\U4-:p?cCI1=6GBL@Ge,Sq*s8;fp +jQ6.6rVs=3eRD^J4u7a.%U`N];4l^rs5r2kbK8?#kPG5Us/)L)>ZQ)pF.&2L +[(Ea#o^;bYq#AFPjE#4!gXtoiq>U3cp\=OWqYL!crVQWprVlirr])kPtP]p@\CarVtj5o1;8a)A5EU]^,Ums/W!> +BOcZT2,Km6YkI_hs8N&trr;`ep&G'gs8VlMhph]+pAb0krqQKhrr7HZ@9QiVW9>s.#Le7RUrH2HM.P93be`a2n&QqZ#U8s7Q-drr2rbm/#l) +s0Sif0IC]p.'d]qY:$fqu?]prr;ur#laf&rr)lrrr;urrqo1]qt^*b +q"jj^p%@qFn*T`n+ZYPs0JrI%gamT3G@7"s1Yu$69A^L6YE!Y\bc%" +da.!q`mk%es8W)urUgNknc/XcqYTs^qY:'a!rrZ8Y +s6/>>AmC`].q_=7F?VTsW1q<3rVuQ`oBu&5nac>Jqu?Tns7cEjn+$F!E2c5gN@Q-! +@ToVrli6hVs.u@(8ORAP2-2n)?ELH\q>1-hrVu9j7/q=Z5=<+-R1a'HC3@6oDJ=^s7u]pq>]jGs1l;!P`Vjl,WX2phu!6L +r;6NnqYpS,EA/eDGAs)H +o)Jags7c9Rp@deLrq$-hs8)`ppA=UWq>[1^dRQN\((4bg?)dbrs8W#sW1h*d/m'VQ +;,^D;lK\EIrVu3Mnc&Ocs8Vl`mHFNDrqZ*aqXX["ZfO2$B0nY%/h(.Z)1Sgeq#BpP +s)`4<@9mub[E/%4s7Z-arVZ]ppIG8`rT*&!s8W&lp\F^_s8W)ui83e<_:%8to)&1] +P)cFg,X3@h3dPq6bJiZ3kl:\Zs8VurA79XB2b:Zqao)&9s8N&srVulorqcWkrr2os +rr2oq#laf&rr)lrrr;fm:Ab"gqu$BgrVcWns8DZbq#($hs8N&urr;Z_rdK3Q/LO+J +03BYI9:h@'^:_norVts;o#o/,r;-HnrVuos +s7GsWrr3/tq=j7BlMgfFio0)#rVu9Mqb'Ic8OZmdWP\>us8;Zl`PC>LCPs5O3BT6% +Z`_O;k5Y>Rs8W&tp@\CUoC_nRp@S"Jrr*0#r;QTjrVZTlrr2rsrr2j%rr)lrrVulr +s7uXgr;HTkrVcWns8D?Pli-n`rVZ]ame$,AqYL!eDJOV-"seM:ReH7Nhq7u/q#?;, +Y?FkQ(D&WMDO9JBs&Dm5>?>e9nc.P(m/R%as8MusI.?aqrVlWgqXj^ap[%83s8N&u +rVuBRs6]"LF)7+@9m.d&7V6%]q"+Obq>^*To)JOWs8;B]p?D;Em/?tVrVuH[p\8E5 +O=DAc,Sk9VI`_HVs7YmZb.QP+6#nh2D)j7ed)t_TrVuopo)J[Us8MZjqY:*fs8Vur +s8",Cs82hsW4Nrd1*.K%2)J78YIji6s8W)uqtg?`nbMnOrVulsn*ffErrE#ss"aEF +rVcWno'cT`=E/:qM6!Mlc,f&5k5YJXs7Gd[h:VL;AVD`c7m&b.M2%Mop&FaYqu6O$ +s8Vrqs7ZKmq#CBnr<<6!r;QZnqZ$Qorqm'$rVulqs8N#tq>Lg#rr2iprqufrrUojT +rVq9Es7c6bqtg?iq>[e*_6pPljPKq.mJm4]s+5To69Afu'0fSrIFca?kMZBoeG(pV +:Tph;q"=[NjnA]Os7Q'Zp@n.Xs8)6Tl2UeYq>0d_rVu9 +_:[u9mJm4`rr3B)rVuoss8W)uq"O^cs8MKdqD.j@qXX1Ps8;oFcK?Dn531T#s7u][ +jo>AWs8MfnmH=NLqZ#^:s,`2;)](+^00l\B[Job5s8VrUjk0V5nbDtIs8Vuqrr;oo +rr)fls8N#sr!<<#s8N#trr2rnrX&N&s8DutrV#sWqu9(Snale[s8MusjQ#S+rVuil +s82NiqXjf5F."3k75cf'E+kS16?/flaoD/9k2?:>q>^*Us8VurqY1$ap&FaXs7c6b +rr38ro^`%^qt'IKrqh0Err;ces7Ps_s82iemf3=as8;Zlp[nLZo)Jaes8VoorV6'c +r:g-dp\+@Op\F7Sr;L)/I53"W+rqdK#na$5To_%tCq"jCXs8Drrs8DorrVcTmrr2op!ri3!m/I"a +rr2oqrqoCcqu-Bfr;$0cq=t!]nGi+Ks,Di33&4Gc-r,26T]+W)NeXrF;LtjCcfO$` +s7u]JeF_GEm`WZ-eC!FGl2Ue\s6T"Jp@SCbrr;uoD?'Y7lg3g'nE]W7n*oi;nF-#D +pAFpgs8W&trr)lsrr;rorqH*Zp@S+YrVuoss6oCJf[f(7#co%s8)cqr;Z`ls8W&tq=ad]o_\[fs8W)ss8Mp7qYL-\o(qS7 +mIg2Bs8Vfms7lKhpAb0inaZ)Ir]^5VrVulsp%8+)bL;rKVWHh/rVHP'??H5J).d0/ +*#1Xd,=s$t59:\&51>s82Wlqtg?iqZ$KkrquZuqYgEhrVcW@rr2rsrr2lq +r;QTjqHep@&%Bh>d09s(Gi#ZE)UVp]#biShr)r<`3cq +2GH(b99kUC]XQMmqu?9Ws6].Iq"O^ds8DutqY^d\l0%_`FGF^HL1aqI +Y,TJ;p&Fj]s7Q!`s8Dutrr<#ts8N#trqQKerr)`orqm9+s829Skl(MUqYU!Yo^_nZ +9(MNHnF-,?mJ*ri]d+aVWi*GnkPUL(Ug@5I-6PcN6u@3jR;$/b=As2a+#]4?T_\?^ +qt^9hqZ$Hhs8;for;?QmrVuips8DoraSu2;rqucmrVAnWrr;rsk2Z*gf]tCL8nVUb +s7u]pq#CBhs8Vlo_Rnl:>(@k>5WCPs2`"4,UUnq#kY4WZ<)@AH^!uuUs8W&tp\+Uc +ruh.5p](9js8Vr_mc`Tfg\Ug@s8Vuor;-Elr:BOMqYL!dr]C&UrqlQlrVZ]oqu?Qh +s75[Yn*U#^$Qs1Z"uUn5Nnl2Ue[s8Vur;GUh]Lmd)Rkkk5Vqtg?jqu?Tl +rr)fqqu+M5rr)`lr;0.cr;6Nmqu?Tjs3f6Q8k*/V5[N@$qs3ADh:MUdM6ABS80Js8 +?Wq^Squ?Qfs5Mo.jP]icI[;uL9!PP:s8;osrVuors6f:Gk2tn,ru(e6qt9[Qs8Vrl +qt9LMm/R+^qYTsbs8)cqrV\AEq>:!_rVQHkrr)lrr;Zfrs8W)uo^hnJn+HDIqY9g_ +s8N&sr;Zcos8;corr)]n'E%e)s8Vuhp@7tTp&G'hs8Vurs82aos8W)uq=t!fqZ$To +s4uGos8;o_kkjf6s8;]mgXkl_m/R+_s8Vrq:J,@d3EtY(s8Vopn*0lPq>^6]s7Pp^ +o^Mlj?up@-IK0:$arqlQls8N&urr<#t +s7Z0]rqn>Is8D]dp&G'jmHs67q"F=On*ol5rVlTks7uB_n+lhNs8Vlns7uHco_\O] +rr,jnqu-9`q=XCXo^Vt]qu>pBr;ZZo`kpJNDMadGZJaL5f@'6WkPtSXs52N0eB[\S +4_BY,Y4hAbnE^,LoDbVZ]:G@o5tquO/1^^i.SL]n2*3ZuC1N.,XjaDLci"rVcWlrVQQmq>UEjrr;ips8DutrOVt7r;?Nfs8VrUj5Kt:CB"8/p](9l +s7,OWmHOX32GJ+*K_"R2rqcZpqu?'Js8Dcns8)btVo]km3AN-`j4s[Q^#pac8g,*? +A6sqbT>13ps8W#so^htVqY^BnqsNq;rr;`eq>7V''Fll0$8)nu0.J5> +.3hE&BoaJZ6Zd4-o'ZPGli-n\s2i=2q"F^kkN;.2rr;ui(]F=0rVlWkrqZQnqYpNk +s8Vurs82irrP/@0rsSf(rq?BlpA4[Zqu$EeAb,Bbmd0]JrVu9Mq`6Z.:.o!dnGiI` +s6T"Ls8;opq#B^Ds*T![%gXq3Cmb7ss%Pq,-66!=I^,rKe6H"'H?>J3h=gmHs8)Nj +s8N&srVQWpqYL*\qu$*ds8)`pqYBs]qYL!ds8Mcos8W)sIf'0Fqt9[PnabuFs7Z",j]XQL4ClECON@lYO4#U+k-qGLiB2_BVY,("?i;[CqOVncqSs[1jqu4;s7,LVoC)_1dckssMMHkQ@pjA9M3d>dnGiLfp\+O_qu?Zp*V8mmqYU!cs8)`p +q>UEirr;fns8)`pqYpKlrr2i-rXf,+s8Vfms7H?kpAY*drVlWlr([(crVQHkp%81U +o`'2\KP"b7`59mMdGM"([sE4W,T]>k&O;\D^uaAOK6jjN**@T/YOh#Yp$;WuBqQ@W +6^!A8d)tc;2,c.Y7%^$Nrr*2lnEU#QqZ$Torp1[#q"jROpA=^ds8N&io(qS5mIToD +s8N&nq"jXTpAXXer;?EYmHa`N@K-;tnbN4`s75XY`PU6+V7pSPIR#tt<`*jkJ>2#W +s2)G,2_e;Q(HJk+cg9ipNesZgJY1iSp?_#CB4H73FG]>Iqu?Tos8;ognc/Xfs6o@O +r;-HWkO8HMs8Dlqlg!sUEirr;ios8)`or;Q]n\,I$< +qu$*_r:0X]nbN%Pq"aRVp\"O[;"jVXq=sp^p&"aes4Go]:ek4=+>$>^=Vhc$4>pA] +BU%rIs45Kq0.'m=%7FN&Nh`&lCLW\b- +VPCSAE/.4^Am/2W/gs=e88PZ9dd?5tqXjgQjSs+2N%$#?5s/=Y>Br:h;Mp4$jP]e4 +r;Y'chE*\gJU`[Rp&FXSqXA,qXjU[o(`%Pq"aOUq"+4Qo_/"Nrq8tVo_/=as5W,& +o'uPUrr9^Fa,uFOWi*GP`oudNs8McmMhJ5O'0g)9MgBE;GAj'81h/X*@=EEqp[J3M +Oh)8<2,Hnap@A7`rr;ueI/X$DqYC0krr;!9m;[#n(DJ6[O/2aMs8Mlpp[eEgX27"\ +:LIIKgtD&bnG`%Lrq?!am-4@bCk7CqS[5KC_S+e'pA\]2K+\SHKRTZqq>^Kjs8Vop +Z`VP//PR6&2KEYmeBmO]qu?]ns68\Ap[nKRQ_Z`)7D?ISs8Musrq60g#k@HVp@e:S +p%SIb(]XO6q>0dToBuYYqYpNjrr;ios8)`or;?Nus8N#trr2r/rY>A1rqucqqYpNk +rr;inrVQQlqu-Kjrr)irIeNL1q=spgrr;fhrp]CNqtg?Xkk=oJs8Vop`kgUj02F;R +9[h;RjPU!og%jX`rRK6aqt:!co`%BGAfV[NRZkDaqZ$Tos5rG.q=sshrVuors*oEW +2DRiN,!1-pPkjtOp@/+LkPq]`asJ5t.3h8i?$Q#3s8W#sqtU3e8bW0o?[-m?OnnYL +s7u]io)G)?Zm[+dARL&Xli5hpp[.5Fp$hurAVD*>3/iWjrqZT_li6VHs8W#sqY1$^ +o)EZIGC+Xdr;6Nnmf`[jrVuosqZ-HkrVQWoq%WW!p@n@RqYU!ds82fqqYpNkrr2in +rXAi+rVulqs8Musrr2r&rXA`(rqucpr;Q]nrr2ips8;_Br;HQnr;6Norr<#ts8W&t +md'oIoDao2UD4Ch<`]WqDD)3e>CLr@hjo>5Ms8)?ed)krD2I\U!=r7l1ARTi+a4f_; +q>^?lB4H!frr2inrX]&.rVulqs8Musrr)lrrr9Y1#lFMtqtp?hqu-*_rqcBhIfBB8mIK8q +k5P>Zs8Dusqu=:=a)l?MY-#,&nb2t\s7,UOq"Oa\p&4phs,`57-mV$%Eg6:es6SqK +n*L#QrVuT`s6JnEN/4*YJ"!sUeiGWk2D84L]&rhYs7Ym\`kLt(11bZJU.n*r-6bTt +FbnAfiW&fTKn5\&?[D\G5QC$1s8;Wko'ZNd?$7>11RF?(s8;ooq>]jIrT2r:?s/(! +&j'&fEcl;_+rraJYYXRO&tJXejPEoDeILs2)A58O7=E +bkSo^hDd>d,9JgbDN*X^pp[eFNkPk&@s8W&t +p@J<.F,UD.,Z@EY>ulPT8pMU!92\B-s7lWoq>]C,r%'3abK&Q9o`)Y:d46P3,900V +;MA@TLLOJAs82igo)J[ds6]1DZ9>G+.OR8<2b_ZGirAuWs8N&urr;9JnYN%]]tD5G +kO&'=rVulsn*]iHr;Z9To^;,;qtp?lrr;uss8;forr:aP$31#(s8N#trr2qbrr2ln +r;6A?r;?Qlr;QWlrquZnr;6Nlqu?Tks8;`nr;-Hbnc-,,`]cIZ1bhCOJX3jTbQ%M? +qt^9fp]%Cs^,\&GX/U?loF:E`p&+aes8N&trVuiorVlrurr7TLoD\ahqu6Tnrqucmqtg6h +!;lTjIfKBFs8DlqrVZ]go_eFTs8W&ts8DutrVuWbs2;b%`l-:&qu>*lf0hr"dE^Y> +mJlkKs5`&:s7u[V2-C@n.><;Dm-+KFpA\5q@Ag!(r;6Norr;oms8D]lUn,Of1gj3T +DXZuhs8W&kq!IeLn,NCenF$2=kP4uOs7uHhrr3T)p\"F]pZ^u)nac)?p%._Dn,E@d +rVlfqpC6iiq#10ks8N&trVuiorVlrurr7TLg\q]]rVQQmq>L9hrVcWlrVQNk*rl3; +s7uHgs8N&urr;QZq=O7Vs8Dunp](0gs75aQrVn)@s8W&tna?GWqu?]ns6A_GMh\$- +;/D\eXmGUEjrr;ios8)`or;Q]nrr)rsrVZ[+ +rr<#ts8W)us8N&urr;urrr3*!o(2;JruD%.9n,E@]s8Vfms82HYs5r>YY5s7uZop\t3grr;fns7uZoqYpNkrr2iqs8Dro%eTDer;?Qorr<#ts8W)u +rqd!#s7u]pq"=@Mrq@6/rr<#ts8W&ts8DutrVufls82Zmp@\:]oJ-CGqYgEer;Q6J +kgf_5o`"ghn*L#Qr;Zfqs6f@?qu5pOp"]TImJm4_s8N&rqZ$TprVmT1rqZEfpA"IU +r;HEap[[tKo(r4Xrr2osrr2]m%fZG,s8N&urr;uss8N#tK)YB@qu?ZprqucmrqcQg +*r#[6q>UEgrr;`ls7cNmq>UEirr;ios8)Qep](9lqu6imp%S:Xqu6U>o^q_Ss7lEe +nGiO`rr;ilqu,mInc/Ugl0%X:r;ZWhs8;cmruCt8q#CBhn+#Q'gbrs\W#s6Tdckl(PHp%InRrri<#q"Ogfr=o;3qu6WlqYU!ds82irqu?]p +s8W&squ6Hbrso&,s8W)us8N&trr;uss1J= +~> +grestore +currentdict /inputf undef +currentdict /pstr undef diff --git a/grbUNS.jpg b/grbUNS.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00f016148ca7c35e7f1c47de0d864fd44a113252 GIT binary patch literal 5070 zcmb7HWn2>uwA~o3#E>b-0Fm4f6p(I^+9WnQL}^KB1ZfEw4WnbkMoQ^M3L;7?D4haQ z0@5iUJpNza`~1%Rc+S1|{LZI)FDEYN0gMQBEp-482mk=D3UE0MPzBIZQBhM-(o$1X zU!$eHM$f`XPe(`34!H?t;pXJ!xyyN%i%(GUJ|FBMjO*?LWs!%{vI+_cyuy#PROK`! z-gc8#8n9?HlFl@+)vAp8HuWjg>&4R{H72?E{)kb!|9F!1sVfDHg3BLiI- z{XbBUQ<8zG{v#C_0YK0d$UqbnR3M5g36Km#4xj*2GI8AyQASxY-}RspRS8RmpbP7M z+`PrjBlc@ zlo8R^vf=U-4YwXYF|R9{xaH-nQ(Y*2aME4+c z%G1-Gk}~Mbkhh_T!gr&L&^;PIndSRXX_3nXu0r!TEyXib`R_~izk>wr7AM2W>Rqc= zU@vtxwQZMdE*u2!V_4`;(zfv#zV@M4Il~=YEXm8nIR41ZrL@C%o=IL1Y@fc>@MJ~L z6;=G@`WL{`7D~4FU=g%mSrtcLJebHEBr(IT7tv^j>KI~h?cGuoK?A>`yoqDnrd!!< z^TaGMOH(ti@Q4CzVd1JAy?m$a#dnfTgZXfo9pQ#u9s#Cn$D!H2ljN?uYJi39Xgw>c zb^X#jWfV!ltHfN+f9Lhm?SV2Slo~V8@&-ms)5oXJf=v(;I$i1Ksaj!6Aruw!HN2Z5R6DUMy;?pmaen0!-Yy7Ak7etmYL1T&yukU!5P>b0?kC|N5p^@e};Z;NXzZ-EQ1xL;!M7)U+E}R4wRBYwR4YL0uTv5mp5SpkiV%1N2fL$mXsl72=v#mfkOwU*M6|@AWhD5511~7wZ&Y?eNAWqoW~Oq-*qrmZMTG~f^Q+7xf zQCY4wdgj1Y_6w4=li4D#PQ)c3dIN_&^JrH%n9LZ4-ab6d-@mMNb zbMARJZT;v2zBAP;{XH$MGCJE;14ix#@H(h0ldcXZGiIZkB|dVLtkUv8WUfm6%PYn zCqvHkaY{|=K|c=W0gj9(7(#ekic6Ub$r7&N^vb? zM%!*47-xn}M87ob+JpwllbQa3QAg+%CFb<(p3|XLObV58 z!iGb8qhYfB5=)Ofgj}8b-khshI{zHDP0%#`Ix2I2m*=j95uTKnPymzO4wpOofjA)c zi;YF7)%7#kr~>moJxbCjm;YU%rC-D#ZZ~=J6&&}3G@WorIn=@SlSXdYGG?(2UW%_u zZ;4;K<$p{aLVPpxl{#dBD@nc)ezztAC|8S{>`TaKxSj=6lMOtQKSL9c&E{K--}>h{ z>{Y{(N*M7%Bu4jOYfl`92u_^HyX>LlOQd2$2jUbCftd-7i_0t1f79aEp-ECKoZH#P zRT1?{iz@me4d)O*1c9=7kOkE8?Z%fzc^xVA>NI6Vrxf> zqLTC5G#dOfn;SC8eW*A_R6~w=e`L+nX^WIH`lQ_F9?0~{2BJ|p(6)^$5^hd=ehIL> zxzqEw@@?s@ne|ePeAx76_&X1tEb#w3j>3l9kjY2xPOp)eWVA`}&Z1)Gg*Rs9AV=kNd#X?~B8%E}v^(?YD2V`Ue0{i5WJ!WbnMIzdRkR=W zKIXqB)azYV*#mHBfaI63l1@gx}5~yh{XLELZ6QS0X8Ps5tk(wE|n-0}5 ze>`tAn@!bFJC_!BmkzzhdAUSZYm@iKIx?NyG=LRyUFf(rB{}JVV;d=Z2@L5nZMfZ^u_E@BB zDuM8HrQ06?Dw)>aOZ?Y2FL3ln06(62qsC}lxHg!*B_fk{1~L}cTDjOggq=PxFv(DN z6RkF8i{0J-anjv4G|5dKmT*3b#b~{#?R{NVEvX?~)8q6^r>9a{)#PCH5+J6}`Ve== z)8i7bEI5*S=TYs~C!MZQNQ4%m=Wj2R$DwIJL>oAukw3eU?BuLg@y#z-htQ(gROO8R zrK~bS_ehEn1`Gl~jbs5rr@^l!yb<;N|{Xnf6`ev|^DdYBRE59F$09;BT z>g}n~B|zcHC+&N6eEc)|$&C8!k%=8p)BXx+*7jeOMrTL0#9CpOwIy*|kRs)c=IDI(kCmpW?^SE9ptfivyPb{`wRe<~Z^|IXkHC^8Io(C34xA%9-wYdh9 zxdE{Di9vqGz(i>%()*Mv4rups<8R{zfQz>^AX< zJ+`pZF?QH#iisKBF`7>qyvLxhIMm8w6(Q2ti4Mli9TdCn4NP{w;26Oim-5W6Q024@ zM2sU#OcDwhtNnR6F4Dww)o`@^tg*T8;nw=mPZU~raZ&?fs2bt*n_Kl?rcA7Q5biMq z2W)Aa&B-{AD>CZ(!OuLMT+EXF7Sl43U`LZwpc>qJ0R5pu^}-1rU;l^F1K~Elq!h$h z{Gh4fmio%CdXKQPeq-CxnTx0#aCWS;pc6FOrlDCw^G`b~3b4spE_FImU7%d_;udn) zm{sx?8yb9%*l}BjDJl8&>zVxx9s7yR3@y~MPQ*yGjRT$#x2Q0i_(J?!&PluwVWGQC z1}`Hi^Q~Go(^I9d0U}p8dFKTB>bUa~plea>X>xCNA&S6D^VBd2Da>mTCphBE{o9|i zzLzrpcNn&NA`&vml!tVw4=0pc00dLkWZx0b{PI+=$xeboA}mQV1F6^u9Gm{k)v>x3 zklryycwarUlwlJoARskYHXtgO=u~1sbom>A8Fm00%!bpFz3$cfn-*84!HzBN-Y{-o zB$ZI~j=BUoXVgsWZ_;ECHGPC=z_`^&0mgidGVYJ9GLbF~PdAMnH%5LZ@7^mU$wV;? zSw#p21gm(``!DSqmlkOxLp<{Bu30%wnWNQ3)-X%W)?zx2bkFdTQElrgQNae`{)gp> z(XzRQ;+Bi~5tUK+SP{ypn7x`e#`mvz3#a5?{gZD~yP=yP#le6>^Xv@d%)N9IM7=i4hyFYn9r&BgopfG9w$#SJK?%K#cyr&Yi)5R9B6eNe9Zk zE$!jRVm}+&@csCHMwm{;w#Vn1o}-wml$~4fZ{zZA2<6i356@B0FusT5Gq!v_@w&WU zq<~wAs(-yO&MtQGsvP7eo$dvqMWl9-Q`_bgjjut#-Gq6sUpY1`f5U8<^(e*EtQ)CF z3#>KI3j~KA4k?nfT1C^L8x23OGogkNi{W#Hf2jYc2Oif<2#Icwvu-3yJeD{7Pnt9LB$)9gu}d&Tq7QeB#N=Fj3@t&kEl4BE5l ztL?wHd^OK4wG(qmnx<2H@0F02z^JrZONN%lapt~W}bp@5H5|~fO&gj&%55RvdwywhsR$@*1jek|GFUxY8DzAszGsl zA&qz7YdkiREJc)oO2N@qNZh_bDV36kT>Q3)y!|Id1$71-BJ%D1cbgJ~qOs7;&M#Hk z1^Xl#Hf)jHyiH<2nE$9B^_Z;q&^W8;sJNDX6%TvAP6vVf)K?s9CDBNcGV1i&HiFB% zm`@g{rcA@nDt|T-!^D!%mzT7D+Yuyaj-f$lw7oKXz77t0Qf9hZp1J?I*K8;vgAI*_ z#6jnenJXq;9-SQ(4IfA6XU;2${0!WSB|#J5?vHmXCF2dPvtYtsAC+XKVCy^@wC%c%i{)U_^UNtUt4TqX_US28 z6R&ii+G^*((pV^Oo55Y_5}V(LttDpWOH~q@#}?}E@-7z25sTP7p3@3yEWpX#-@1pa zR3Ck=6-*)qQr>reN;D57EBWk#t1FDL&8=6Ges literal 0 HcmV?d00001 diff --git a/kodovi/BAFER.MOD b/kodovi/BAFER.MOD new file mode 100755 index 0000000..20552da --- /dev/null +++ b/kodovi/BAFER.MOD @@ -0,0 +1,56 @@ +MODULE Bafer; +FROM RedOpsl1 IMPORT RedOpslTip, MakeNull, Empty, First, PopFirst, AddRear; +FROM FIO IMPORT File,WrChar, Create, Close; +IMPORT IO; + +CONST + ImeIzlaza = 'izlaz.txt'; + +VAR + izlaz : File; + znak : CHAR; + buffer : RedOpslTip; + +PROCEDURE IsprazniBafer(VAR dat : File; + VAR buf : RedOpslTip); +VAR + znak : CHAR; + ok : BOOLEAN; +BEGIN + WHILE NOT Empty(buf) DO + First(buf, znak, ok); + PopFirst(buf, ok); + WrChar(dat, znak) + END +END IsprazniBafer; + +PROCEDURE BaferWrite(VAR dat : File; + VAR buf : RedOpslTip; + znak : CHAR); +VAR + ok : BOOLEAN; +BEGIN + AddRear(buf, znak, ok); + IF NOT ok THEN + IsprazniBafer(dat, buf); + AddRear(buf, znak, ok) + END +END BaferWrite; + +BEGIN + izlaz := Create(ImeIzlaza); + MakeNull(buffer); + IO.WrStr('Unesite tekst, koji treba da se unese u datoteku '); + IO.WrStr(ImeIzlaza); + IO.WrChar('.'); + IO.WrLn; + IO.WrStr('Unos zavrsite tackom.'); + IO.WrLn; + znak := IO.RdChar(); + WHILE znak # '.' DO + BaferWrite(izlaz, buffer, znak); + znak := IO.RdChar(); + END; + IsprazniBafer(izlaz, buffer); + Close(izlaz) +END Bafer. diff --git a/kodovi/MaxNiza.MOD b/kodovi/MaxNiza.MOD new file mode 100644 index 0000000..cd40678 --- /dev/null +++ b/kodovi/MaxNiza.MOD @@ -0,0 +1,125 @@ +MODULE MaxNiza; +FROM InOut IMPORT WriteString,ReadString, + WriteInt,WriteCard,WriteLn; +FROM FIO IMPORT File, Open, Close, RdInt,EOF; +FROM Str IMPORT Length; + +CONST + MaxN = 100; +TYPE + Interval = [1..MaxN]; +VAR + X : ARRAY Interval OF INTEGER; + f: File; + N:CARDINAL; + ime : ARRAY [1..50] OF CHAR; + +PROCEDURE MaxNiza3(); +(* Trece resenje: O(n^2). + Koristi pomocni niz u kome je na i-tom mestu + suma podniza x[1..i] *) +VAR + Max, Suma : INTEGER; + d,g,i,Ood,Doo : Interval; + Pom : ARRAY [0..MaxN] OF INTEGER; + brojOp : CARDINAL; +BEGIN + brojOp := 0; + Pom[0] := 0; + Ood := 1; + Doo := 1; + FOR i := 1 TO N DO + Pom[i] := Pom[i-1] + X[i]; + INC(brojOp); + END; + Max := 0; + FOR d := 1 TO N DO + FOR g := d TO N DO + Suma := Pom[g] - Pom[d-1]; + INC(brojOp); + IF Suma > Max THEN + Max := Suma; + Ood := d; + Doo := g + END + END + END; + WriteLn; + WriteString(' Maksimum je '); + WriteInt(Max,3); + WriteString(' u intervalu od '); + WriteCard(Ood,3); + WriteString(' do '); + WriteCard(Doo,3); + WriteLn; + WriteString('Broj racunskih operacija: '); + WriteCard(brojOp,1); + WriteLn; +END MaxNiza3; + +PROCEDURE MaxNiza4(); +(* Cetvrto resenje. Najbolje moguce: O(n) *) +VAR + Max, MaxDovde : INTEGER; + i,d,Ood,Doo : Interval; + brojOp : CARDINAL; +BEGIN + Ood := 1; + Doo := 1; + brojOp := 0; + d := 1; + Max := 0; + MaxDovde := 0; + FOR i := 1 TO N DO + IF MaxDovde = 0 THEN + d := i + END; + MaxDovde := MaxDovde + X[i]; + INC(brojOp); + IF MaxDovde < 0 THEN + MaxDovde := 0 + END; + IF MaxDovde > Max THEN + Ood := d; + Doo := i; + Max := MaxDovde + END + END; + WriteLn; + WriteString(' Maksimum je '); + WriteInt(Max,3); + WriteString(' u intervalu od '); + WriteCard(Ood,3); + WriteString(' do '); + WriteCard(Doo,3); + WriteLn; + WriteString('Broj racunskih operacija: '); + WriteCard(brojOp,1); + WriteLn; +END MaxNiza4; + +BEGIN + WriteString('ime fajla?'); + ReadString(ime); + IF Length(ime)= 0 THEN + ime := 'br1.txt'; + END; + WriteString(' Unos niza X '); + WriteLn; + f := Open(ime); + N:=0; + EOF:=FALSE; + WHILE NOT EOF DO + INC(N); + X[N] := RdInt(f); + WriteCard(N,1); + WriteString(' - '); + WriteInt(X[N],1); + WriteLn; + END; + Close(f); + WriteString("metod 3"); + MaxNiza3(); + WriteString("metod 4"); + MaxNiza4(); +END MaxNiza. \ No newline at end of file diff --git a/kodovi/MaxNiza4.MOD b/kodovi/MaxNiza4.MOD new file mode 100644 index 0000000..1a2c664 --- /dev/null +++ b/kodovi/MaxNiza4.MOD @@ -0,0 +1,62 @@ +MODULE MaxNiza4; +(* Cetvrto resenje. Najbolje moguce: O(n) *) +FROM InOut IMPORT WriteString, + WriteInt,WriteCard,WriteLn; +FROM FIO IMPORT File, Open, Close, RdInt,EOF; +CONST + MaxN = 10; +TYPE + Interval = [1..MaxN]; +VAR + Max, MaxDovde : INTEGER; + i,d,Ood,Doo : Interval; + X : ARRAY Interval OF INTEGER; + f: File; + brojOp : CARDINAL; + N:CARDINAL; + +BEGIN + WriteString(' Unos niza X '); + WriteLn; + brojOp := 0; + f := Open('br1.txt'); + N:=0; + EOF:=FALSE; + WHILE NOT EOF DO + INC(N); + X[N] := RdInt(f); + WriteCard(N,1); + WriteString(' - '); + WriteInt(X[N],1); + WriteLn; + END; + Close(f); + Max := 0; + MaxDovde := 0; + FOR i := 1 TO N DO + IF MaxDovde = 0 THEN + d := i + END; + MaxDovde := MaxDovde + X[i]; + INC(brojOp); + IF MaxDovde < 0 THEN + MaxDovde := 0 + END; + IF MaxDovde > Max THEN + Ood := d; + Doo := i; + Max := MaxDovde + END + END; + WriteLn; + WriteString(' Maksimum je '); + WriteInt(Max,3); + WriteString(' u intervalu od '); + WriteCard(Ood,3); + WriteString(' do '); + WriteCard(Doo,3); + WriteLn; + WriteString('Broj racunskih operacija: '); + WriteCard(brojOp,1); + WriteLn; +END MaxNiza4. \ No newline at end of file diff --git a/kodovi/QUEUEINFO.DEF b/kodovi/QUEUEINFO.DEF new file mode 100755 index 0000000..e89bec9 --- /dev/null +++ b/kodovi/QUEUEINFO.DEF @@ -0,0 +1,9 @@ +DEFINITION MODULE QueueInfo; + +CONST + Maxqueue = 100; + +TYPE + InfoTip = CHAR; + +END QueueInfo. \ No newline at end of file diff --git a/kodovi/QUEUEINFO.MOD b/kodovi/QUEUEINFO.MOD new file mode 100755 index 0000000..745b340 --- /dev/null +++ b/kodovi/QUEUEINFO.MOD @@ -0,0 +1,2 @@ +IMPLEMENTATION MODULE QueueInfo; +END QueueInfo. \ No newline at end of file diff --git a/kodovi/REDOPSL1.DEF b/kodovi/REDOPSL1.DEF new file mode 100755 index 0000000..71d2fb2 --- /dev/null +++ b/kodovi/REDOPSL1.DEF @@ -0,0 +1,21 @@ +DEFINITION MODULE RedOpsl1; +FROM QueueInfo IMPORT InfoTip,Maxqueue; +TYPE + Niz = ARRAY[1..Maxqueue] OF InfoTip; + RedOpslTip = RECORD + Prvi, Zadnji : CARDINAL; + Element : Niz + END; + +PROCEDURE MakeNull(VAR q : RedOpslTip); +PROCEDURE Empty(VAR q : RedOpslTip) : BOOLEAN; +PROCEDURE First(VAR q : RedOpslTip; + VAR x : InfoTip; + VAR ok : BOOLEAN); +PROCEDURE PopFirst(VAR q : RedOpslTip; + VAR ok : BOOLEAN); +PROCEDURE AddRear(VAR q : RedOpslTip; + x : InfoTip; + VAR ok : BOOLEAN); + +END RedOpsl1. diff --git a/kodovi/REDOPSL1.MOD b/kodovi/REDOPSL1.MOD new file mode 100755 index 0000000..1330bbf --- /dev/null +++ b/kodovi/REDOPSL1.MOD @@ -0,0 +1,79 @@ +IMPLEMENTATION MODULE RedOpsl1; +FROM QueueInfo IMPORT Maxqueue,InfoTip; + +PROCEDURE MakeNull(VAR q : RedOpslTip); +BEGIN + WITH q DO + Prvi := 0; + Zadnji := 0 + END +END MakeNull; + +PROCEDURE Empty(VAR q : RedOpslTip) : BOOLEAN; +BEGIN + RETURN q.Zadnji = 0 +END Empty; + + +PROCEDURE First(VAR q : RedOpslTip; + VAR x : InfoTip; + VAR ok : BOOLEAN); +BEGIN + IF Empty(q) THEN + ok := FALSE + ELSE + ok := TRUE; + WITH q DO + x := Element[Prvi] + END + END +END First; + +PROCEDURE AddOne(i : CARDINAL) : CARDINAL; +BEGIN + IF i = Maxqueue THEN + RETURN 1 + ELSE + RETURN i+1 + END +END AddOne; + +PROCEDURE PopFirst(VAR q : RedOpslTip; + VAR ok : BOOLEAN); +BEGIN + IF Empty(q) THEN + ok := FALSE + ELSE + ok := TRUE; + WITH q DO + IF Prvi = Zadnji THEN + MakeNull(q) + ELSE + Prvi := AddOne(Prvi) + END + END + END +END PopFirst; + +PROCEDURE AddRear(VAR q : RedOpslTip; + x : InfoTip; + VAR ok : BOOLEAN); +BEGIN + WITH q DO + IF AddOne(Zadnji) = Prvi THEN + ok := FALSE + ELSE + ok := TRUE; + IF Empty(q) THEN + Prvi := 1; + Zadnji := 1 + ELSE + Zadnji := AddOne(Zadnji) + END; + Element[Zadnji] := x + END + END +END AddRear; + +END RedOpsl1. + diff --git a/kodovi/br10.txt b/kodovi/br10.txt new file mode 100644 index 0000000..c753f3a --- /dev/null +++ b/kodovi/br10.txt @@ -0,0 +1,10 @@ +1 +4 +2 +9 +3 +5 +-66 +7 +8 +10 \ No newline at end of file diff --git a/kodovi/br100.txt b/kodovi/br100.txt new file mode 100644 index 0000000..8515c77 --- /dev/null +++ b/kodovi/br100.txt @@ -0,0 +1,100 @@ +17 +52 +-5 +42 +29 +-35 +-25 +57 +-31 +-43 +5 +-11 +39 +24 +-9 +23 +-45 +49 +-16 +37 +3 +-43 +-32 +-3 +-46 +-16 +20 +15 +27 +-15 +31 +51 +20 +32 +-55 +-31 +54 +-56 +-47 +-1 +-57 +-56 +18 +-3 +-22 +-53 +-16 +-12 +-60 +55 +38 +37 +44 +35 +6 +47 +22 +9 +4 +40 +51 +-13 +-41 +36 +49 +2 +12 +51 +59 +-47 +40 +13 +-19 +56 +42 +-23 +-10 +36 +-52 +-37 +-15 +28 +4 +-53 +26 +47 +-45 +-14 +42 +-39 +-15 +56 +23 +12 +10 +9 +-45 +-13 +57 +-42 \ No newline at end of file diff --git a/kodovi/br20.txt b/kodovi/br20.txt new file mode 100644 index 0000000..897fdb1 --- /dev/null +++ b/kodovi/br20.txt @@ -0,0 +1,20 @@ +23 +-44 +35 +-10 +35 +-37 +-14 +22 +43 +-24 +47 +33 +-56 +-17 +16 +-11 +-39 +-11 +10 +38 \ No newline at end of file diff --git a/kodovi/br30.txt b/kodovi/br30.txt new file mode 100644 index 0000000..1fae25d --- /dev/null +++ b/kodovi/br30.txt @@ -0,0 +1,30 @@ +-14 +3 +-44 +13 +-16 +16 +29 +-52 +-49 +39 +56 +22 +41 +-35 +-58 +-25 +-60 +-31 +-51 +20 +30 +-45 +38 +47 +-11 +43 +-31 +24 +-56 +-34 \ No newline at end of file diff --git a/kodovi/br30b.txt b/kodovi/br30b.txt new file mode 100644 index 0000000..7d56130 --- /dev/null +++ b/kodovi/br30b.txt @@ -0,0 +1,30 @@ +15 +-34 +-7 +-28 +-22 +-1 +42 +32 +35 +56 +-54 +18 +-4 +-50 +-36 +8 +39 +-14 +-22 +51 +54 +7 +-33 +30 +58 +-43 +-11 +4 +-21 +-41 \ No newline at end of file diff --git a/kodovi/izlaz.txt b/kodovi/izlaz.txt new file mode 100644 index 0000000..86f6e2c --- /dev/null +++ b/kodovi/izlaz.txt @@ -0,0 +1,4 @@ +novi tekst +koji ko zna dokle ce da stinge ne? + +kk diff --git a/kodovi/nizslog.MOD b/kodovi/nizslog.MOD new file mode 100644 index 0000000..051680d --- /dev/null +++ b/kodovi/nizslog.MOD @@ -0,0 +1,122 @@ +MODULE nizslog; +FROM InOut IMPORT WriteString, WriteLn, WriteCard, + ReadCard, ReadString; +FROM FIO IMPORT File, Open, Create, Close, EOF, + RdItem, RdCard, WrStr, WrCard, WrLn; +FROM Str IMPORT Compare; + +CONST + MaxStud = 100; +TYPE + String = ARRAY[1..30] OF CHAR; + Student = RECORD + ime, prez: String; + god: CARDINAL; + END; + Studenti = ARRAY[1..MaxStud] OF Student; + +PROCEDURE UcitajF(fajl:String; + VAR spisak: Studenti; VAR n:CARDINAL); +VAR + f:File; +BEGIN + n:=0; + f:= Open(fajl); + EOF := FALSE; + WHILE NOT EOF DO + INC(n); + RdItem(f, spisak[n].prez); + RdItem(f, spisak[n].ime); + spisak[n].god := RdCard(f); + END; + Close(f); +END UcitajF; + +PROCEDURE Ispisi(spisak:Studenti; n:CARDINAL); +VAR + i: CARDINAL; +BEGIN + FOR i:=1 TO n DO + WriteString(spisak[i].prez); + WriteString(" "); + WriteString(spisak[i].ime); + WriteString(" "); + WriteCard(spisak[i].god,1); + WriteLn; + END; +END Ispisi; + +PROCEDURE IspisiF(fajl:String; + spisak:Studenti; n:CARDINAL); +VAR + f:File; + i: CARDINAL; +BEGIN + IF (n>0) AND (n<=MaxStud) THEN + f:=Create(fajl); + (* pravimo takav fajl da ne + postoji zadnji prazan red *) + FOR i:=1 TO n-1 DO + WrStr(f,spisak[i].prez); + WrStr(f," "); + WrStr(f,spisak[i].ime); + WrStr(f," "); + WrCard(f,spisak[i].god,1); + WrLn(f); + END; + WrStr(f,spisak[n].prez); + WrStr(f," "); + WrStr(f,spisak[n].ime); + WrStr(f," "); + WrCard(f,spisak[n].god,1); + Close(f); + END; +END IspisiF; + +PROCEDURE NoviStudent(VAR spisak:Studenti; VAR n:CARDINAL); +VAR + stud,temp:Student; + i:CARDINAL; + dodaj:BOOLEAN; +BEGIN + IF n NIL DO + NEW(pomocni^.veza); + pomocni := pomocni^.veza; + pomocni^ := p^; + p := p^.veza + END + END +END Kopiraj; + +PROCEDURE Stampaj(p: Polinom; d: CARDINAL); + + PROCEDURE StampajMonom(m : Polinom); + BEGIN + WITH m^ DO + IF st <> 0 THEN + IF ABS(k) <> 1.0 THEN + WriteReal(ABS(k), d) + END; + Write('x'); + IF st <> 1 THEN + Write('^'); + WriteCard(st, 1) + END + ELSE + WriteReal(ABS(k), d) + END + END + END StampajMonom; + +BEGIN + IF p = NIL THEN + WriteReal(0., d) + ELSE + IF p^.k < 0.0 THEN + WriteString(' - ') + END; + StampajMonom(p); + p := p^.veza; + WHILE p <> NIL DO + IF p^.k > 0.0 THEN + WriteString(' + ') + ELSE + WriteString(' - ') + END; + StampajMonom(p); + p := p^.veza + END + END +END Stampaj; + +PROCEDURE UbaciMonom(mon:Polinom; VAR p: Polinom); +VAR + stari, tekuci, kopija: Polinom; +BEGIN + IF mon # NIL THEN + NEW(kopija); + kopija^ := mon^; + tekuci := p; + stari := NIL; + WHILE (tekuci#NIL) AND (tekuci^.st>kopija^.st) DO + stari := tekuci; + tekuci := tekuci^.veza + END; + kopija^.veza := tekuci; + IF tekuci = p THEN + p := kopija + ELSE + stari^.veza := kopija + END; + IF (tekuci#NIL) AND (kopija^.st = tekuci^.st) THEN + kopija^.k := kopija^.k + tekuci^.k; + kopija^.veza := tekuci^.veza; + DISPOSE(tekuci); + IF kopija^.k = 0.0 THEN + IF p = kopija THEN + p := kopija^.veza + ELSE + stari^.veza := kopija^.veza + END; + DISPOSE(kopija) + END + END + END +END UbaciMonom; + +PROCEDURE Unos(VAR p : Polinom); +VAR + i, n: CARDINAL; + novi: Polinom; +BEGIN + Anuliraj(p); + REPEAT + WriteLn; + WriteString('Unesite broj monoma n (n>=0) '); + ReadCard(n); + UNTIL Done; + WriteLn; + FOR i := 1 TO n DO + NEW(novi); + WITH novi^ DO + REPEAT + WriteString('Unesite koeficijent monoma br.'); + WriteCard(i, 1); + WriteString(' (<> 0) '); + ReadReal(k); + WriteLn + UNTIL k <> 0.0; + REPEAT + WriteLn; + WriteString('Unesite eksponent monoma br.'); + WriteCard(i, 1); + WriteString(' (>=0) '); + ReadCard(st); + UNTIL Done; + WriteLn; + END; + UbaciMonom(novi, p); + DISPOSE(novi); + END +END Unos; + +PROCEDURE Saberi(p1, p2: Polinom; VAR zbir: Polinom); +BEGIN + Kopiraj(p1, zbir); + WHILE p2 <> NIL DO + UbaciMonom(p2, zbir); + p2 := p2^.veza + END +END Saberi; + +PROCEDURE SaberiNa(p: Polinom; VAR rez: Polinom); +BEGIN + WHILE p <> NIL DO + UbaciMonom(p,rez); + p := p^.veza; + END; +END SaberiNa; + +PROCEDURE PromeniZnak(VAR p: Polinom); +VAR + t: Polinom; +BEGIN + t := p; + WHILE t <> NIL DO + t^.k := - t^.k; + t := t^.veza + END +END PromeniZnak; + +PROCEDURE Oduzmi(p1,p2: Polinom; VAR razlika: Polinom); +BEGIN + Kopiraj(p2, razlika); + PromeniZnak(razlika); + WHILE p1 <> NIL DO + UbaciMonom(p1, razlika); + p1 := p1^.veza + END +END Oduzmi; + +PROCEDURE MonomPuta(p, mon: Polinom; VAR mp: Polinom); +VAR + tekuci: Polinom; +BEGIN + Anuliraj(mp); + IF (mon <> NIL) AND (p <> NIL) THEN + NEW(mp); + mp^.k := p^.k * mon^.k; + mp^.st := p^.st + mon^.st; + p := p^.veza; + tekuci := mp; + WHILE p <> NIL DO + NEW(tekuci^.veza); + tekuci := tekuci^.veza; + tekuci^.k := p^.k * mon^.k; + tekuci^.st := p^.st + mon^.st; + p := p^.veza + END; + tekuci^.veza := NIL + END +END MonomPuta; + +PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom); +VAR + pomocni: Polinom; +BEGIN + Anuliraj(pr); + IF (p1 <> NIL) AND (p2 <> NIL) THEN + MonomPuta(p1, p2, pr); + p2 := p2^.veza; + WHILE p2 <> NIL DO + MonomPuta(p1, p2, pomocni); + REPEAT + UbaciMonom(pomocni, pr); + pomocni := pomocni^.veza + UNTIL pomocni = NIL; + p2 := p2^.veza + END + END +END Puta; + +PROCEDURE Kolicnik(p1, p2: Polinom; VAR kol, ost: Polinom; VAR ok: BOOLEAN); + + PROCEDURE Deli(VAR kol, ost: Polinom); + VAR + novi, pomocni: Polinom; + BEGIN + IF ost <> NIL THEN + IF ost^.st >= p2^.st THEN + NEW(novi); + novi^.k := - ost^.k / p2^.k; + novi^.st := ost^.st - p2^.st; + MonomPuta(p2, novi, pomocni); + Saberi(ost, pomocni, ost); + novi^.k := - novi^.k; + UbaciMonom(novi, kol); + DISPOSE(novi); + Deli(kol, ost) + END + END + END Deli; + +BEGIN (* Kolicnik *) + ok := TRUE; + Anuliraj(kol); + IF p2 = NIL THEN + ok := FALSE + ELSE + Kopiraj(p1, ost); + Deli(kol, ost) + END +END Kolicnik; + +PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL; + VAR rez: Polinom); +VAR + i: CARDINAL; +BEGIN + IF n = 0 THEN + NEW(rez); + rez^.k := 1.0; + rez^.st := 0; + rez^.veza := NIL; + ELSIF n = 1 THEN + Kopiraj( p, rez ); + ELSE + rez := p; + FOR i := 2 TO n DO + Puta(rez, p, rez) + END + END; +END PolinomNaN; + +PROCEDURE DisposePolinom(VAR p: Polinom); +VAR + pomocni: Polinom; +BEGIN + pomocni := p; + WHILE pomocni # NIL DO + p := p^.veza; + DISPOSE(pomocni); + pomocni := p + END +END DisposePolinom; + +END PolinomL. \ No newline at end of file diff --git a/kodovi/polinomi/PROCITAJME.TXT b/kodovi/polinomi/PROCITAJME.TXT new file mode 100644 index 0000000..cbd917c --- /dev/null +++ b/kodovi/polinomi/PROCITAJME.TXT @@ -0,0 +1,20 @@ +Modul - polinomi preko listi: +- POLINOML.DEF (definicioni modul) +- POLINOML.MOD (implmentacioni modul) +Primer koriscenja modula: +- polinom.MOD + +Da bi se koristio modul u programu, potrebno je da kompajler +moze da pronadje POLINOML MOD i DEF. Uz standardna +podesavanja to znaci da treba da su oba fajla u istom +folderu gde je i glavni program, tj u folderu projekta. +Opciono se mogu smestiti u odgovarajuce MOD i DEF foldere u +okviru projekta. + +Verzija 2012; rev 1 +-promena u Anuliraj da ne brise polinom ako je vec postojao, +posto je pravilo probleme za mnozenje i stepenovanje. + +Materijal za kurs "Strukture podataka i algoritme 1" +Katedra za racunarske nauke, DMI, PMF, UNS +http://perun.dmi.rs \ No newline at end of file diff --git a/kodovi/polinomi/PolSuma.MOD b/kodovi/polinomi/PolSuma.MOD new file mode 100644 index 0000000..1061398 --- /dev/null +++ b/kodovi/polinomi/PolSuma.MOD @@ -0,0 +1,43 @@ +MODULE PolSuma; +(* Napisati program koji ucitava broj k (1 <= k <= 50) i k polinoma, a nakon toga izracunava njihovu sumu *) + +FROM PolinomL IMPORT Polinom, Anuliraj, DisposePolinom, + Unos, Stampaj, SaberiNa; +FROM InOut IMPORT WriteLn, WriteString, ReadCard, WriteCard; +CONST + maxk = 50; +TYPE + nizPol = ARRAY [1..maxk] OF Polinom; +VAR + i, k: CARDINAL; + suma : Polinom; + p : nizPol; +BEGIN + REPEAT + WriteString('Unesite broj k (1 <= k <= '); + WriteCard(maxk, 1); + WriteString(') '); + ReadCard(k); + WriteLn; + UNTIL (1 <= k) AND (k <= maxk); + FOR i := 1 TO k DO + WriteLn; + WriteString('Unos '); + WriteCard(i, 1); + WriteString('. polinoma.'); + WriteLn; + Unos(p[i]) + END; + Anuliraj(suma); + FOR i := 1 TO k DO + SaberiNa(p[i], suma) + END; + WriteLn; + WriteString('Njihova suma je:'); + WriteLn; + Stampaj(suma, 4); + DisposePolinom(suma); + FOR i := 1 TO k DO + DisposePolinom(p[i]); + END; +END PolSuma. diff --git a/kodovi/polinomi/m2.mod b/kodovi/polinomi/m2.mod new file mode 100644 index 0000000..6735e88 --- /dev/null +++ b/kodovi/polinomi/m2.mod @@ -0,0 +1,49 @@ +MODULE m2; +FROM PolinomL IMPORT Polinom, Stampaj, Anuliraj, + DisposePolinom, UbaciMonom, Unos, Puta,PolinomNaN; +FROM InOut IMPORT WriteString, WriteLn; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; + +VAR + p,q,rez,pom : Polinom; + +BEGIN + (*sa ova dva ispod radi, bez real overflow*) + NEW(p); + p^.veza:=NIL; + + Anuliraj(q); (* isto sto i q:=NIL; *) + NEW(pom); + pom^.st:=5; + pom^.k:=1.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* -3 x^4 *) + NEW(pom); + pom^.st := 4; + pom^.k := -3.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 4 x *) + NEW(pom); + pom^.st := 1; + pom^.k := 4.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 7 (x^0) *) + NEW(pom); + pom^.st := 0; + pom^.k := 7.0; + UbaciMonom(pom,q); + DISPOSE(pom); + WriteString("q: "); + Stampaj(q,0); + WriteLn; + + Puta(q, q, rez); + (* odstampamo rezultat *) + WriteString("q*q: "); + Stampaj(rez,0); + WriteLn; + +END m2. diff --git a/kodovi/polinomi/mnozenje.MOD b/kodovi/polinomi/mnozenje.MOD new file mode 100644 index 0000000..2072063 --- /dev/null +++ b/kodovi/polinomi/mnozenje.MOD @@ -0,0 +1,72 @@ +MODULE mnozenje; +FROM PolinomL IMPORT Polinom, Stampaj, Anuliraj, + DisposePolinom, UbaciMonom, Unos, Puta; +FROM InOut IMPORT WriteString, WriteLn; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; + +VAR + p,q,rez,pom : Polinom; + +BEGIN + (* korisnik unosi prvi polinom *) + WriteString("Unesite polinom:"); + WriteLn; + (*Unos(p);*) + + NEW(p); + p^.k:=1.; + p^.st:=2; + p^.veza:=NIL; + + WriteString("p: "); + Stampaj(p,0); + WriteLn; + + (* drugi polinom kreiramo mi, + monom po monom *) + Anuliraj(q); (* isto sto i q:=NIL; *) + (* formiramo monom x^5 *) + NEW(pom); + pom^.st:=5; + pom^.k:=1.0; + (* dodajemo ga u polinom *) + UbaciMonom(pom,q); + DISPOSE(pom); + (* -3 x^4 *) + NEW(pom); + pom^.st := 4; + pom^.k := -3.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 4 x *) + NEW(pom); + pom^.st := 1; + pom^.k := 4.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 7 (x^0) *) + NEW(pom); + pom^.st := 0; + pom^.k := 7.0; + UbaciMonom(pom,q); + DISPOSE(pom); + WriteString("q: "); + Stampaj(q,0); + WriteLn; + + Puta(q, q, rez); + (* odstampamo rezultat *) + WriteString("q*q: "); + Stampaj(rez,0); + WriteLn; + + (*Puta(p, p, rez); + WriteString("p*p: "); + Stampaj(rez,0); + WriteLn; + *) + + DisposePolinom(p); + DisposePolinom(q); + DisposePolinom(rez); +END mnozenje. diff --git a/kodovi/polinomi/polinom.MOD b/kodovi/polinomi/polinom.MOD new file mode 100644 index 0000000..3e46e54 --- /dev/null +++ b/kodovi/polinomi/polinom.MOD @@ -0,0 +1,58 @@ +MODULE polinom; +FROM PolinomL IMPORT Polinom, Stampaj, Anuliraj, + DisposePolinom, UbaciMonom, Unos, Saberi; +FROM InOut IMPORT WriteString, WriteLn; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; + +VAR + p,q,rez,pom : Polinom; + +BEGIN + (* korisnik unosi prvi polinom *) + WriteString("Unesite polinom:"); + WriteLn; + Unos(p); + (* drugi polinom kreiramo mi, + monom po monom *) + Anuliraj(q); (* isto sto i q:=NIL; *) + (* formiramo monom x^5 *) + NEW(pom); + pom^.st:=5; + pom^.k:=1.0; + (* dodajemo ga u polinom *) + UbaciMonom(pom,q); + DISPOSE(pom); + (* -3 x^4 *) + NEW(pom); + pom^.st := 4; + pom^.k := -3.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 4 x *) + NEW(pom); + pom^.st := 1; + pom^.k := 4.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 7 (x^0) *) + NEW(pom); + pom^.st := 0; + pom^.k := 7.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* saberemo polinome *) + Saberi(p, q, rez); + (* odstampamo rezultat i polinome *) + WriteString("p: "); + Stampaj(p,0); + WriteLn; + WriteString("q: "); + Stampaj(q,0); + WriteLn; + WriteString("rez: "); + Stampaj(rez,0); + WriteLn; + DisposePolinom(p); + DisposePolinom(q); + DisposePolinom(rez); +END polinom. diff --git a/kodovi/polinomi/polinom2.mod b/kodovi/polinomi/polinom2.mod new file mode 100644 index 0000000..ec8db12 --- /dev/null +++ b/kodovi/polinomi/polinom2.mod @@ -0,0 +1,56 @@ +MODULE polinom2; +FROM PolinomL IMPORT Polinom, Stampaj, Anuliraj, + DisposePolinom, UbaciMonom, Unos, Saberi; +FROM InOut IMPORT WriteString, WriteLn; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; + +VAR + p,q,rez,pom : Polinom; + +BEGIN + Anuliraj(p); + NEW(p); + p^.st := 2; + p^.k := 1.0; + p^.veza := NIL; + Stampaj(p,0); + WriteLn; + + Anuliraj(q); (* ovde isto sto i q:=NIL; *) + (* formiramo monom x^5 *) + NEW(pom); + pom^.st:=5; + pom^.k:=1.0; + (* dodajemo ga u polinom *) + UbaciMonom(pom,q); + DISPOSE(pom); + (* -3 x^4 *) + NEW(pom); + pom^.st := 4; + pom^.k := -3.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 4 x *) + NEW(pom); + pom^.st := 1; + pom^.k := 4.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 7 (x^0) *) + NEW(pom); + pom^.st := 0; + pom^.k := 7.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* saberemo polinome *) + Stampaj(q,0); + WriteLn; + + Saberi(q, q, q); + (* odstampamo rezultat *) + Stampaj(q,4); + WriteLn; + DisposePolinom(p); + DisposePolinom(q); + DisposePolinom(rez); +END polinom2. diff --git a/kodovi/polinomi/polinoml-debug.mod b/kodovi/polinomi/polinoml-debug.mod new file mode 100644 index 0000000..255c539 --- /dev/null +++ b/kodovi/polinomi/polinoml-debug.mod @@ -0,0 +1,305 @@ +(*polinomL - debug verzija *) +IMPLEMENTATION MODULE PolinomL; +FROM InOut IMPORT Write, WriteString, WriteLn, + WriteCard, ReadCard, Done; +FROM RealInOut IMPORT WriteReal, ReadReal; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; + +PROCEDURE Anuliraj(VAR p: Polinom); +BEGIN +(* IF p # NIL THEN + DisposePolinom(p); + END;*) + p := NIL; + +END Anuliraj; + +PROCEDURE Kopiraj(p: Polinom; VAR kopija: Polinom); +VAR + pomocni: Polinom; +BEGIN + IF p = NIL THEN + kopija := NIL + ELSE + NEW(kopija); + kopija^ := p^; + p := p^.veza; + pomocni := kopija; + WHILE p <> NIL DO + NEW(pomocni^.veza); + pomocni := pomocni^.veza; + pomocni^ := p^; + p := p^.veza + END + END +END Kopiraj; + +PROCEDURE Stampaj(p: Polinom; d: CARDINAL); + + PROCEDURE StampajMonom(m : Polinom); + BEGIN + WITH m^ DO + IF st <> 0 THEN + IF ABS(k) <> 1.0 THEN + WriteReal(ABS(k), d) + END; + Write('x'); + IF st <> 1 THEN + Write('^'); + WriteCard(st, 1) + END + ELSE + WriteReal(ABS(k), d) + END + END + END StampajMonom; + +BEGIN + IF p = NIL THEN + WriteReal(0., d) + ELSE + IF p^.k < 0.0 THEN + WriteString(' - ') + END; + StampajMonom(p); + p := p^.veza; + WHILE p <> NIL DO + IF p^.k > 0.0 THEN + WriteString(' + ') + ELSE + WriteString(' - ') + END; + StampajMonom(p); + p := p^.veza + END + END +END Stampaj; + +PROCEDURE UbaciMonom(mon:Polinom; VAR p: Polinom); +VAR + stari, tekuci, kopija: Polinom; +BEGIN + WriteString("um ( "); + IF mon # NIL THEN + NEW(kopija); + kopija^ := mon^; + tekuci := p; + stari := NIL; + WHILE (tekuci#NIL) AND (tekuci^.st>kopija^.st) DO + stari := tekuci; + tekuci := tekuci^.veza + END; + kopija^.veza := tekuci; + IF tekuci = p THEN + p := kopija + ELSE + stari^.veza := kopija + END; + IF (tekuci#NIL) AND (kopija^.st = tekuci^.st) THEN + kopija^.k := kopija^.k + tekuci^.k; + kopija^.veza := tekuci^.veza; + DISPOSE(tekuci); + IF kopija^.k = 0.0 THEN + IF p = kopija THEN + p := kopija^.veza + ELSE + stari^.veza := kopija^.veza + END; + DISPOSE(kopija) + END + END + END; + WriteString("um ) "); +END UbaciMonom; + +PROCEDURE Unos(VAR p : Polinom); +VAR + i, n: CARDINAL; + novi: Polinom; +BEGIN + Anuliraj(p); + REPEAT + WriteLn; + WriteString('Unesite broj monoma n (n>=0) '); + ReadCard(n); + UNTIL Done; + WriteLn; + FOR i := 1 TO n DO + NEW(novi); + WITH novi^ DO + REPEAT + WriteString('Unesite koeficijent monoma br.'); + WriteCard(i, 1); + WriteString(' (<> 0) '); + ReadReal(k); + WriteLn + UNTIL k <> 0.0; + REPEAT + WriteLn; + WriteString('Unesite eksponent monoma br.'); + WriteCard(i, 1); + WriteString(' (>=0) '); + ReadCard(st); + UNTIL Done; + WriteLn; + END; + UbaciMonom(novi, p); + DISPOSE(novi); + END +END Unos; + +PROCEDURE Saberi(p1, p2: Polinom; VAR zbir: Polinom); +BEGIN + Kopiraj(p1, zbir); + WHILE p2 <> NIL DO + UbaciMonom(p2, zbir); + p2 := p2^.veza + END +END Saberi; + +PROCEDURE SaberiNa(p: Polinom; VAR rez: Polinom); +BEGIN + WHILE p <> NIL DO + UbaciMonom(p,rez); + p := p^.veza; + END; +END SaberiNa; + +PROCEDURE PromeniZnak(VAR p: Polinom); +VAR + t: Polinom; +BEGIN + t := p; + WHILE t <> NIL DO + t^.k := - t^.k; + t := t^.veza + END +END PromeniZnak; + +PROCEDURE Oduzmi(p1,p2: Polinom; VAR razlika: Polinom); +BEGIN + Kopiraj(p2, razlika); + PromeniZnak(razlika); + WHILE p1 <> NIL DO + UbaciMonom(p1, razlika); + p1 := p1^.veza + END +END Oduzmi; + +PROCEDURE MonomPuta(p, mon: Polinom; VAR mp: Polinom); +VAR + tekuci: Polinom; +BEGIN + WriteString("mp [ "); + Anuliraj(mp); + IF (mon <> NIL) AND (p <> NIL) THEN + NEW(mp); + mp^.k := p^.k * mon^.k; + mp^.st := p^.st + mon^.st; + p := p^.veza; + tekuci := mp; + WHILE p <> NIL DO + WriteString("mp w {"); + WriteReal(p^.k,0); + WriteCard(p^.st,5); + WriteString("} "); +WriteLn; + NEW(tekuci^.veza); + tekuci := tekuci^.veza; + tekuci^.k := p^.k * mon^.k; + tekuci^.st := p^.st + mon^.st; + p := p^.veza + END; + tekuci^.veza := NIL + END; + WriteString("mp ] "); +END MonomPuta; + +PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom); +VAR + pomocni: Polinom; +BEGIN + WriteString("puta "); +WriteInt(p1,0); + Anuliraj(pr); + IF (p1 <> NIL) AND (p2 <> NIL) THEN + MonomPuta(p1, p2, pr); + p2 := p2^.veza; + WHILE p2 <> NIL DO + MonomPuta(p1, p2, pomocni); + WriteString(" puta posle mp2+ "); + WriteLn; + REPEAT + UbaciMonom(pomocni, pr); + pomocni := pomocni^.veza + UNTIL pomocni = NIL; + p2 := p2^.veza + END + END +END Puta; + +PROCEDURE Kolicnik(p1, p2: Polinom; VAR kol, ost: Polinom; VAR ok: BOOLEAN); + + PROCEDURE Deli(VAR kol, ost: Polinom); + VAR + novi, pomocni: Polinom; + BEGIN + IF ost <> NIL THEN + IF ost^.st >= p2^.st THEN + NEW(novi); + novi^.k := - ost^.k / p2^.k; + novi^.st := ost^.st - p2^.st; + MonomPuta(p2, novi, pomocni); + Saberi(ost, pomocni, ost); + novi^.k := - novi^.k; + UbaciMonom(novi, kol); + DISPOSE(novi); + Deli(kol, ost) + END + END + END Deli; + +BEGIN (* Kolicnik *) + ok := TRUE; + Anuliraj(kol); + IF p2 = NIL THEN + ok := FALSE + ELSE + Kopiraj(p1, ost); + Deli(kol, ost) + END +END Kolicnik; + +PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL; + VAR rez: Polinom); +VAR + i: CARDINAL; +BEGIN + IF n = 0 THEN + NEW(rez); + rez^.k := 1.0; + rez^.st := 0; + rez^.veza := NIL; + ELSIF n = 1 THEN + Kopiraj( p, rez ); + ELSE + rez := p; + FOR i := 2 TO n DO + Puta(rez, p, rez) + END + END; +END PolinomNaN; + +PROCEDURE DisposePolinom(VAR p: Polinom); +VAR + pomocni: Polinom; +BEGIN + pomocni := p; + WHILE pomocni # NIL DO + p := p^.veza; + DISPOSE(pomocni); + pomocni := p + END +END DisposePolinom; + +END PolinomL. \ No newline at end of file diff --git a/kodovi/studenti.txt b/kodovi/studenti.txt new file mode 100644 index 0000000..6105e56 --- /dev/null +++ b/kodovi/studenti.txt @@ -0,0 +1,6 @@ +Prezime Ime 1980 +Dva Tri 4 +a b 2 +alfa beta 3 +4 4 0 +ha hhha 13 \ No newline at end of file diff --git a/skripta-spa1.tex b/skripta-spa1.tex new file mode 100644 index 0000000..44efda8 --- /dev/null +++ b/skripta-spa1.tex @@ -0,0 +1,2950 @@ +% skripta-spa1.tex +% Skripta za predmet Strukture podataka i algoritmi 1, DMI, PMF, NS + +\documentclass[a4paper,twoside]{article} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc}%definišemo da je ulaz utf-8 fajl + +% osnovne informacije koje ce se prikazati na naslovnoj strani, +% kao i u informacijama u generisanom pdfu +\newcommand{\autor}{Vladimir Kurbalija, Milos Radovanovic, Doni Pracner} +\newcommand{\naslov}{Skripta za vezbe iz predmeta strukture podataka + i algoritmi 1} +\newcommand{\datum}{April 2012, Novi Sad} +\newcommand{\verzija}{ver 12b} +%sc=single-column +\usepackage[serbian]{babel} +\usepackage{fancyhdr} +\pagestyle{fancy} + +\title{\naslov -- \verzija} +\author{\autor} +\date{\datum} + +%change the default font +\usepackage{lmodern} +\renewcommand{\familydefault}{\sfdefault} + +\usepackage{pifont} + +%podesavanja outputa za pdf verzije +\usepackage[bookmarks,pdffitwindow=false,unicode=true,% +pdftitle={\naslov -- \verzija},% +pdfauthor={\autor}% +]{hyperref} + +\usepackage{graphicx} +\usepackage{listings} +\usepackage{amsthm} +\usepackage{amsmath} +\usepackage{latexsym} +\usepackage{multicol} + +%margine +%experiment +%\usepackage[top=2.5cm, bottom=1.5cm, left=3cm, right=2cm]{geometry} +%staro: +\usepackage[top=1.5cm, bottom=1cm, left=2cm, right=1cm]{geometry} + +\begin{document} + +%customize the itemize environments + +\let\olditemize=\itemize +\def\itemize{ +\olditemize + \setlength{\itemsep}{1pt} + \setlength{\parskip}{0pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{-1cm} + \setlength{\partopsep}{1pt} +} + +%% ovi redovi daju header i footer + +\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} +\fancyhf{} % delete current setting for header and footer +%\fancyfoot[C]{\thepage} +\fancyhead[LO]{\bfseries\rightmark} +\fancyhead[RO]{\thepage} +\fancyhead[RE]{Strukture podataka i algoritmi 1 -- skripta} +\fancyhead[LE]{\thepage} +\renewcommand{\headrulewidth}{0.5pt} +\renewcommand{\headwidth}{\textwidth} +%\renewcommand{\footrulewidth}{0.5pt} +%\addtolength{\headheight}{0.5pt} % make space for the rule +\fancypagestyle{plain}{% +\fancyhead{} % get rid of headers on plain pages +\fancyfoot{} +\renewcommand{\headrulewidth}{0pt} % and the line +\renewcommand{\footrulewidth}{0pt} % and the line +} +\renewcommand{\headheight}{15pt} + +%promene u marginama: +%\setlength{\marginparwidth}{32pt} +%\setlength{\textwidth}{620pt} +%\setlength{\textheight}{620pt} + + +%% specijalni blokovi koji služe kao podsetnici u radu ili napomene +\newcommand{\skica}[1]{ + \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small** \textit{#1} }} + \newline } +} + +\newcommand{\skicas}[1]{ + \framebox{* \textit{#1} *} +} + +%boldovane skice visokog prioriteta +\newcommand{\skicab}[1]{ + \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small*** + \textbf{#1} }} \newline } } + +\newcommand{\kod}[1]{{\small\texttt{#1}}} + +% ako je sledeci red odkomentarisan nista od skica nece biti ispisano +% u finalni dokument + +% \renewcommand{\skica}[1]{} + +% title u skladu sa uobičajenim na Departmanu +\newcommand{\makemytitle}{ + \begin{center} + \makebox{% + \includegraphics[width=2cm]{grbPMF} + \parbox[b]{65ex}{\centering + Univerzitet u Novom Sadu\\ + Prirodno-matematički fakultet\\ + Departman za matematiku i informatiku} + \includegraphics[width=2cm]{grbUNS} + } + \vspace{10ex} + + \parbox[b]{\textwidth}{{\Large {\bf + Vladimir Kurbalija, \href{mailto:kurba@dmi.rs}{kurba@dmi.rs}\\ + Miloš Radovanović, \href{mailto:radacha@dmi.rs}{radacha@dmi.rs}\\ + Doni Pracner, \href{mailto:doni.pracner@dmi.rs}{doni.pracner@dmi.rs}}}} + \vspace{5ex} + + {\Large {\bf Skripta za vežbe iz predmeta }} + + {\Huge {\bf + \setlength{\baselineskip}{1.5\baselineskip}Strukture + podataka i algoritmi 1}} + + \vspace{5ex} + %\vfill + + \verzija \ -- \datum + + \end{center} + \thispagestyle{plain} +% \newpage +} + +\makemytitle + +% theorems, definition etc. +%'''''''''''''''''''''''''' + +\theoremstyle{definition} +\newtheorem{def1}{Definicija} +\theoremstyle{plain} +\newtheorem{theo}{Teorema} +\newtheorem{lema}{Lema} + +\lstloadlanguages{Modula-2} + +\lstset{ + basicstyle=\footnotesize\ttfamily, + showstringspaces=false, + breaklines=true +} + +\lstdefinestyle{codeblock}{ + basicstyle=\footnotesize, + keywordstyle=\textbf, + columns=[l]fixed, + breakatwhitespace=true, +% prebreak=\P, +% postbreak=\ding{229}\space, + language=Modula-2 +} + +\lstdefinestyle{numcodeblock}{ + style=codeblock, + numbers=left +} + +\lstnewenvironment{codeblock}{\lstset{style=codeblock}}{} + +% ----------------==================-------------------------------------- +% Pravi pocetak rada + + +Programi u ovoj skripti su testirani sa kompajlerom 'Native XDS Modula +2' sa instaliranim dodatnim paketom TSCP (Top Speed Compatibility +Pack), potrebnim za neke od modula koji se ne nalaze u ISO standardu +Module 2. + +\tableofcontents + +\newpage + +\begin{multicols}{2} +\section{Ilustracija efikasnosti algoritma} + +\subsection{Zadatak: Pronaći sve pitagorine +trojke do zadate granice} + + +\begin{lstlisting}[style=codeblock] +MODULE Trojke1; +(* Pitagorine trojke koriscenjem "Brute-force" *) +FROM InOut IMPORT WriteString, WriteLn, WriteCard; +CONST + Gr = 100; +VAR + a, b, c : [1 .. Gr]; +BEGIN + FOR a := 1 TO Gr DO + FOR b := 1 TO Gr DO + FOR c := 1 TO Gr DO + IF a*a + b*b = c*c THEN + WriteLn; + WriteString('a = '); + WriteCard(a,2); + WriteString(', b = '); + WriteCard(b,2); + WriteString(', c = '); + WriteCard(c,2) + END + END + END + END +END Trojke1. +\end{lstlisting} + +\begin{codeblock} +MODULE Trojke2; +(*Pitagorine trojke koriscenjem zaokrugljivanja*) +FROM InOut IMPORT WriteString, WriteLn, WriteCard; +FROM MathLib0 IMPORT sqrt; +CONST + Gr = 100; +VAR + a, b, c : CARDINAL; + creal : REAL; +BEGIN + FOR a := 1 TO Gr DO + FOR b := 1 TO Gr DO + creal := FLOAT(a*a) + FLOAT(b*b); + creal := sqrt(creal); + c := TRUNC(creal); + IF creal = FLOAT(c) THEN + WriteLn; + WriteString(' a = '); + WriteCard(a,2); + WriteString(', b = '); + WriteCard(b,2); + WriteString(', c = '); + WriteCard(c,2) + END + END + END +END Trojke2. +\end{codeblock} + +\begin{codeblock} +MODULE Trojke3; +(* Pitagorine trojke koriscenjem teoreme *) +FROM InOut IMPORT WriteString, WriteLn, WriteCard; +CONST + Gr = 10; +VAR + a, b, c, m, n : CARDINAL; +BEGIN + FOR m := 1 TO Gr DO + FOR n := 1 TO m-1 DO + a := 2*m*n; + b := m*m - n*n; + c := m*m + n*n; + WriteLn; + WriteString('a = '); + WriteCard(a,2); + WriteString(', b = '); + WriteCard(b,2); + WriteString(', c = '); + WriteCard(c,2) + END + END +END Trojke3. +\end{codeblock} + +\begin{codeblock} +MODULE Trojke4; +(* Pitagorine trojke kod kojih je razlika + izmedju katete i hipotenuze tacno 1 *) +FROM InOut IMPORT WriteString, WriteLn, WriteCard; +CONST + Gr = 10; +VAR + a, b, c, m, n : CARDINAL; +BEGIN + FOR m := 2 TO Gr DO + n := m - 1; + a := 2*m*n; + b := m*m - n*n; + c := m*m + n*n; + WriteLn; + WriteString('a = '); + WriteCard(a,2); + WriteString(', b = '); + WriteCard(b,2); + WriteString(', c = '); + WriteCard(c,2) + END +END Trojke4. +\end{codeblock} + +\begin{lstlisting}[style=codeblock] +MODULE Trojke5; +(* Pitagorine trojke kod kojih je razlika + izmedju kateta jedan *) +FROM InOut IMPORT WriteString, WriteLn, WriteCard; +CONST + Gr = 7; +VAR + a, b, c, m, n, w, i, temp : CARDINAL; +BEGIN + w := 1; + n := 0; + FOR i := 1 TO Gr DO + m := n + w; + a := 2*m*n; + b := m*m - n*n; + c := m*m + n*n; + WriteLn; + WriteString('a = '); + WriteCard(a,2); + WriteString(', b = '); + WriteCard(b,2); + WriteString(', c = '); + WriteCard(c,2); + temp := w; + w := 3*w + 4*n; + n := 2*temp + 3*n + END +END Trojke5. +\end{lstlisting} + + +\subsection[Zadatak: Maksimalna suma susednih elemenata u +nizu]{Zadatak: Maksimalna suma proizvoljnog broja susednih elemenata u + nizu celih brojeva} + +\begin{lstlisting}[style=codeblock] +MODULE MaxNiza1; +(* Prvo resenje. Brute Force: O(n^3) *) +FROM InOut IMPORT WriteString,ReadInt, + WriteInt,WriteCard,WriteLn; +CONST + N = 10; +TYPE + Interval = [1..N]; +VAR + Max, Suma : INTEGER; + d,g,i,Ood,Doo : Interval; + X : ARRAY Interval OF INTEGER; +BEGIN + WriteString(' Unesite niz X '); + WriteLn; + FOR i := 1 TO N DO + ReadInt(X[i]); + WriteLn + END; + Max := 0; + FOR d := 1 TO N DO + FOR g := 1 TO N DO + Suma := 0; + FOR i := d TO g DO + Suma := Suma + X[i] + END; + IF Suma > Max THEN + Max := Suma; + Ood := d; + Doo := g + END + END + END; + WriteLn; + WriteString(' Maksimum je '); + WriteInt(Max,3); + WriteString(' u intervalu od '); + WriteCard(Ood,3); + WriteString(' do '); + WriteCard(Doo,3) +END MaxNiza1. + +MODULE MaxNiza2; +(* Drugo resenje: O(n^2). + Koristi se cinjenica da je suma X[d..g] + izracunljiva iz X[d..g-1]. *) +FROM InOut IMPORT WriteString,ReadInt, + WriteInt,WriteCard,WriteLn; +CONST + N = 10; +TYPE + Interval = [1..N]; +VAR + Max, Suma : INTEGER; + d,g,i,Ood,Doo : Interval; + X : ARRAY Interval OF INTEGER; +BEGIN + WriteString(' Unesite niz X '); + WriteLn; + FOR i := 1 TO N DO + ReadInt(X[i]); + WriteLn + END; + Max := 0; + FOR d := 1 TO N DO + Suma := 0; + FOR g := d TO N DO + Suma := Suma + X[g]; + IF Suma > Max THEN + Max := Suma; + Ood := d; + Doo := g + END + END + END; + WriteLn; + WriteString(' Maksimum je '); + WriteInt(Max,3); + WriteString(' u intervalu od '); + WriteCard(Ood,3); + WriteString(' do '); + WriteCard(Doo,3) +END MaxNiza2. +\end{lstlisting} + +\begin{codeblock} +MODULE MaxNiza3; +(* Trece resenje: O(n^2). + Koristi pomocni niz u kome je na i-tom mestu + suma podniza x[1..i] *) +FROM InOut IMPORT WriteString,ReadInt, + WriteInt,WriteCard,WriteLn; +CONST + N = 10; +TYPE + Interval = [1..N]; +VAR + Max, Suma : INTEGER; + d,g,i,Ood,Doo : Interval; + X : ARRAY Interval OF INTEGER; + Pom : ARRAY [0..N] OF INTEGER; +BEGIN + WriteString(' Unesite niz X '); + WriteLn; + FOR i := 1 TO N DO + ReadInt(X[i]); + WriteLn + END; + Pom[0] := 0; + FOR i := 1 TO N DO + Pom[i] := Pom[i-1] + X[i] + END; + Max := 0; + FOR d := 1 TO N DO + FOR g := d TO N DO + Suma := Pom[g] - Pom[d-1]; + IF Suma > Max THEN + Max := Suma; + Ood := d; + Doo := g + END + END + END; + WriteLn; + WriteString(' Maksimum je '); + WriteInt(Max,3); + WriteString(' u intervalu od '); + WriteCard(Ood,3); + WriteString(' do '); + WriteCard(Doo,3) +END MaxNiza3. +\end{codeblock} + +\begin{codeblock} +MODULE MaxNiza4; +(* Cetvrto resenje. Najbolje moguce: O(n) *) +FROM InOut IMPORT WriteString,ReadInt, + WriteInt,WriteCard,WriteLn; +CONST + N = 10; +TYPE + Interval = [1..N]; +VAR + Max, MaxDovde : INTEGER; + i,d,Ood,Doo : Interval; + X : ARRAY Interval OF INTEGER; +BEGIN + WriteString(' Unesite niz X '); + WriteLn; + FOR i := 1 TO N DO + ReadInt(X[i]); + WriteLn + END; + Max := 0; + MaxDovde := 0; + FOR i := 1 TO N DO + IF MaxDovde = 0 THEN + d := i + END; + MaxDovde := MaxDovde + X[i]; + IF MaxDovde < 0 THEN + MaxDovde := 0 + END; + IF MaxDovde > Max THEN + Ood := d; + Doo := i; + Max := MaxDovde + END + END; + WriteLn; + WriteString(' Maksimum je '); + WriteInt(Max,3); + WriteString(' u intervalu od '); + WriteCard(Ood,3); + WriteString(' do '); + WriteCard(Doo,3) +END MaxNiza4. +\end{codeblock} + +\section{Rad sa fajlovima} + +\subsection{Modul FIO} + +U ovom modulu je definisan tip \kod{File}, koji predstavlja jedan fajl +sa kojim radimo. + +U primerima se pretpostavlja da je „f“ tipa \kod{File}, „str“ niz +znakova, „i“ tipa \kod{INTEGER}, „c“ tipa \kod{CARDINAL} i „ch“ tipa +\kod{CHAR}. Dodatna promenljiva „n“ tipa \kod{INTEGER} služi za +formatiranje slično kao u modulu \kod{InOut}. + +Promenljiva tipa \kod{File} se mora vezati za neki fajl +jednom od sledećih komandi:\\ +\kod{f := Open(str);} -- otvara se postojeci fajl za čitanje\\ +\kod{f := Create(str);} -- kreira se fajl za pisanje\\ +\kod{f := Append(str);} -- otvara se postojeći za dopisivanje na kraj + +\kod{Close(f);} -- po završetku rada fajl se mora zatvoriti + +Procedure za čitanje i pisanje imaju parametar „\kod{f}“ koji označava + fajl sa kojim se radi.\\ +\kod{RdStr(f,str)} -- učitava ceo red u string str\\ +\kod{RdItem(f,str)} -- učitava jednu reč u string str (učitava znakove iz fajla dok ne naiđe na separator)\\ +\kod{i:= RdInt(f); c:= RdCard(f)} -- učitava broj, koji se dobija kao rezultat procedure\\ +\kod{ch:= RdChar(f)} -- vraća jedan znak iz fajla + +Procedure za pisanje različitih tipova u fajl: +\kod{WrStr(f,str); WrInt(f,i,n); WrCard(f,c,n);WrChar(f,ch);} + +\kod{WrLn(f);} -- upisuje prelom reda u fajl + +\kod{EOF} -- logička promenljiva, označava da li smo poslednjom +operacijom čitanja stigli do kraja fajla. Ne menja joj se vrednost +pri operacijama otvaranja i zatvaranja fajlova, odnosno neće se pri +tome resetovati na \kod{FALSE}. + + +\subsection{Zadatak: ispis sadržaja fajla na ekran} + +Potrebno je sve redove iz fajla učitati i ispisati ih na ekran. + +\begin{lstlisting}[style=codeblock] +MODULE ispis; +FROM FIO IMPORT File, Open, Close, EOF, RdStr; +FROM InOut IMPORT WriteString, WriteLn, ReadString; + +PROCEDURE ispisF(ime: ARRAY OF CHAR); +VAR + f:File; + s : ARRAY[1..100] OF CHAR; +BEGIN + f:=Open(ime); + EOF := FALSE; + WHILE NOT EOF DO + RdStr(f,s); + WriteString(s); + WriteLn; + END; + Close(f); +END ispisF; + +VAR + ime: ARRAY[1..100] OF CHAR; +BEGIN + WriteString("unesite ime fajla:"); + ReadString(ime); + ispisF(ime); +END ispis. +\end{lstlisting} + +\subsection{Zadatak: spisak studenata} + +Napraviti program koji iz fajla učitava podatke o studentima, dodaje +novog studenta u spisak i snima fajl. U fajlu se u svakom redu nalazi +podatak o jednom studentu, redom prezime, ime i godina rođenja, +razdvojeni razmacima. + +\begin{lstlisting}[style=codeblock] +MODULE nizslog; +FROM InOut IMPORT WriteString, WriteLn, + WriteCard, ReadCard, ReadString; +FROM FIO IMPORT File, Open, Create, Close, EOF, + RdItem, RdCard, WrStr, WrCard, WrLn; +FROM Str IMPORT Compare; + +CONST + MaxStud = 100; +TYPE + String = ARRAY[1..30] OF CHAR; + Student = RECORD + ime, prez: String; + god: CARDINAL; + END; + Studenti = ARRAY[1..MaxStud] OF Student; + +PROCEDURE UcitajF(fajl:String; + VAR spisak: Studenti; VAR n:CARDINAL); +VAR + f:File; +BEGIN + n:=0; + f:= Open(fajl); + EOF := FALSE; + WHILE NOT EOF DO + INC(n); + RdItem(f, spisak[n].prez); + RdItem(f, spisak[n].ime); + spisak[n].god := RdCard(f); + END; + Close(f); +END UcitajF; + +PROCEDURE Ispisi(spisak:Studenti; n:CARDINAL); +VAR + i: CARDINAL; +BEGIN + FOR i:=1 TO n DO + WriteString(spisak[i].prez); + WriteString(" "); + WriteString(spisak[i].ime); + WriteString(" "); + WriteCard(spisak[i].god,1); + WriteLn; + END; +END Ispisi; + +PROCEDURE IspisiF(fajl:String; + spisak:Studenti; n:CARDINAL); +VAR + f:File; + i: CARDINAL; +BEGIN + IF (n>0) AND (n<=MaxStud) THEN + f:=Create(fajl); + (* pravimo takav fajl da ne + postoji zadnji prazan red *) + FOR i:=1 TO n-1 DO + WrStr(f,spisak[i].prez); + WrStr(f," "); + WrStr(f,spisak[i].ime); + WrStr(f," "); + WrCard(f,spisak[i].god,1); + WrLn(f); + END; + WrStr(f,spisak[n].prez); + WrStr(f," "); + WrStr(f,spisak[n].ime); + WrStr(f," "); + WrCard(f,spisak[n].god,1); + Close(f); + END; +END IspisiF; + +PROCEDURE NoviStudent(VAR spisak:Studenti; + VAR n:CARDINAL); +VAR + stud,temp:Student; + i:CARDINAL; + dodaj:BOOLEAN; +BEGIN + IF n=br) THEN + (*prazna lista ili na pocetak*) + temp^.veza:=lista; + lista := temp; + ELSE + (*negde u listi*) + tekuci:= lista; + WHILE (tekuci^.veza # NIL) AND + (tekuci^.veza^.info<=br) DO + tekuci:=tekuci^.veza; + END; + temp^.veza := tekuci^.veza; + tekuci^.veza:=temp; + END; +END DodajSort; +\end{lstlisting} + +\subsection{Zadatak: Prikaz osnovih operacija nad listama} + +\begin{lstlisting}[style=codeblock] +MODULE liste2; +FROM InOut IMPORT WriteString, WriteLn, + WriteCard, ReadCard; +FROM IO IMPORT RdKey; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; +TYPE + skupZn = SET OF CHAR; + brojevi = POINTER TO brojSlog; + brojSlog = RECORD + info:CARDINAL; + veza:brojevi; + END; +VAR + lista : brojevi; + menu,prazno:CHAR; + +PROCEDURE DodajPoc(VAR lista:brojevi; br:INTEGER); +(* dodaje broj pom na pocetak liste *) +VAR + temp:brojevi; +BEGIN + (* kreiramo novi element *) + NEW(temp); + temp^.info := br; + (* treba da pokazuje na ostatak liste *) + temp^.veza := lista; + (* pocetak liste je novi element *) + lista := temp; +END DodajPoc; + +PROCEDURE Unos(VAR lista:brojevi); +(* dodaje n brojeva u listu *) +VAR + n,i,br:CARDINAL; +BEGIN + WriteString('unesite n (broj brojeva): '); + ReadCard(n); + FOR i:= 1 TO n DO + WriteString("unesite broj "); + WriteCard(i,0); + WriteString(": "); + ReadCard(br); + DodajPoc(lista,br); + END; +END Unos; + +(* -- procedure za stampu -- *) + +PROCEDURE Stampaj(lista:brojevi); +(* stampa sadrzaj liste na ekran *) +VAR + temp:brojevi; +BEGIN + WriteLn; + WriteString("Sadrzaj liste:"); + WriteLn; + temp:=lista; + WHILE temp # NIL DO + WriteCard(temp^.info,0); + WriteLn; + temp := temp^.veza; + END; +END Stampaj; + +PROCEDURE StampajK(VAR lista:brojevi); +(* stampa k-ti element (k unosi korisnik) *) +VAR + temp:brojevi; + k,brojac:CARDINAL; +BEGIN + WriteString("unesite redni broj elementa:"); + ReadCard(k); + temp:=lista; + brojac := 1; + WHILE (temp# NIL) AND (k>brojac) DO + temp:=temp^.veza; + INC(brojac); + END; + IF (temp#NIL) THEN + WriteCard(temp^.info,2); + ELSE + WriteString("greska! - ne postoji element"); + WriteString(" u listi sa rednim brojem "); + WriteCard(k,2); + END; + WriteLn(); +END StampajK; + +PROCEDURE StampajMinimum(VAR lista:brojevi); +(* nalazi i stampa minimalni element liste *) +VAR + temp:brojevi; + min:CARDINAL; +BEGIN + IF (lista=NIL) THEN + WriteString("prazna lista!"); + ELSE + min:=lista^.info; + temp:=lista^.veza; + WHILE temp # NIL DO + IF temp^.info < min THEN + min := temp^.info; + END; + temp := temp^.veza; + END; + WriteString("Minimalni element liste je "); + WriteCard(min,0); + END; + WriteLn; +END StampajMinimum; + +(* -- pomocne procedure, bez ispisa -- *) + +PROCEDURE UListi(lista:brojevi; + br: CARDINAL):BOOLEAN; +(* vraca da li se 'br' nalazi u listi 'lista' *) +VAR + temp:brojevi; +BEGIN + temp:=lista; + WHILE (temp # NIL) AND (temp^.info # br) DO + (* dok ne dodjemo do kraja liste + ili ne nadjemo broj *) + temp := temp^.veza; + END; + IF temp#NIL THEN + (* znaci da nismo na kraju liste, + tj da je nadjen broj *) + RETURN TRUE; + ELSE (* temp = NIL *) + RETURN FALSE; + END; +END UListi; + +PROCEDURE IzbaciIzListe(VAR lista:brojevi; + br: CARDINAL):BOOLEAN; +(* izbacuje broj 'br' iz liste, naravno ako + postoji i vraca da li je operacija uspesno + obavljena *) +VAR + temp,prethodni:brojevi; +BEGIN + (* proverimo da li je prvi element *) + IF (lista # NIL) AND (lista^.info = br) THEN + temp:=lista; + lista :=lista^.veza; + DISPOSE(temp); + RETURN TRUE; + ELSE + (* trazimo u ostatku liste *) + temp:=lista; + prethodni:=NIL; + WHILE (temp # NIL) AND (temp^.info # br) DO + (* dok ne dodjemo do kraja liste + ili ne nadjemo broj *) + prethodni:=temp; + temp := temp^.veza; + END; + IF temp#NIL THEN + (* znaci da nismo na kraju liste, + odnosno da smo nasli broj *) + (* prevezemo listu oko elementa *) + prethodni^.veza:=temp^.veza; + DISPOSE(temp); + RETURN TRUE; + ELSE + RETURN FALSE; + END; + END; +END IzbaciIzListe; + +(* - procedure sa interakcijom sa korisnikom - *) + +PROCEDURE IzbacivanjeEl(VAR lista:brojevi); +(* izbacuje uneti broj iz liste koristeci proceduru IzbaciIzListe *) +VAR + br:CARDINAL; +BEGIN + WriteString("unesite broj za izbacivanje: "); + ReadCard(br); + IF IzbaciIzListe(lista,br) THEN + WriteString("broj je izbacen iz liste"); + ELSE + WriteString("greska! - broj ne postoji"); + END; + WriteLn; +END IzbacivanjeEl; + +PROCEDURE IzbacivanjeK(VAR lista:brojevi); +(* izbacuje k-ti element iz liste *) +VAR + temp,tekuci:brojevi; + k,brojac:CARDINAL; +BEGIN + IF lista=NIL THEN + WriteString("lista je prazna, nema "); + WriteString("elemenata za izbacivanje"); + ELSE + WriteString("unesite redni broj elementa"); + WriteString(" koji zelite izbaciti:"); + ReadCard(k); + IF k=1 THEN (*izbacivanje prvog *) + temp:=lista; + lista := lista^.veza; + DISPOSE(temp); + ELSE + tekuci := lista; + brojac := 2; (*gledamo jedan unapred*) + WHILE (tekuci^.veza# NIL) AND (k>brojac) DO + (* idemo kroz listu do k-tog el *) + tekuci:=tekuci^.veza; + INC(brojac); + END; + IF (tekuci^.veza#NIL) THEN + (* pamtimo element za brisanje *) + temp:=tekuci^.veza; + (* prevezujemo listu oko njega*) + tekuci^.veza:=tekuci^.veza^.veza; + DISPOSE(temp); + ELSE + WriteString("greska! - ne postoji el "); + WriteString("u listi sa rednim brojem "); + WriteCard(k,2); + END; + WriteLn(); + END; + END; +END IzbacivanjeK; + +PROCEDURE Pretraga(lista:brojevi); +(* provera da li se uneti broj nalazi u listi *) +VAR + br:CARDINAL; +BEGIN + WriteString("unesite trazeni broj"); + ReadCard(br); + IF UListi(lista,br) THEN + WriteString("broj postoji u listi"); + ELSE + WriteString("broj ne postoji u listi"); + END; + WriteLn; +END Pretraga; + +(* -- oslobadjanje memorije -- *) + +PROCEDURE Unisti(VAR lista:brojevi); +VAR + temp:brojevi; +BEGIN + temp:=lista; + WHILE temp # NIL DO + lista:=lista^.veza; + DISPOSE(temp); + temp:=lista; + END; +END Unisti; + +BEGIN + (* pocinjemo od prazne liste *) + lista := NIL; + REPEAT + WriteLn; + WriteString("Ilustracija rada sa"); + WriteString(" listama brojeva"); + WriteLn; + WriteString("============================="); + WriteLn; + WriteString("s - stampa");WriteLn; + WriteString("u - unos");WriteLn; + WriteString("i - izbacivanje br iz liste"); + WriteLn; + WriteString("e - izbacivanje k-tog el."); + WriteLn; + WriteString("k - stampanje k-tog elementa"); + WriteLn; + WriteString("m - minimalni broj u listi"); + WriteLn; + WriteString("p - pretraga el. u listi"); + WriteLn; + WriteLn; + WriteString("q - kraj rada (quit)");WriteLn; + REPEAT + menu := CAP(RdKey()); + UNTIL menu IN skupZn{'S','U','E','I', + 'M','K','P','Q'}; + IF menu#'Q' THEN + CASE menu OF + 'S' : Stampaj(lista);| + 'U' : Unos(lista);| + 'I' : IzbacivanjeEl(lista);| + 'E' : IzbacivanjeK(lista);| + 'K' : StampajK(lista); | + 'M' : StampajMinimum(lista); | + 'P' : Pretraga(lista);| + END; + WriteLn; + WriteString("--- pritisnite bilo koji "); + WriteString("taster za povratak u meni"); + prazno:=RdKey(); + ELSE + WriteString("Kraj rada") + END; + WriteLn; + UNTIL menu='Q'; + Unisti(lista); +END liste2. +\end{lstlisting} + + +\subsection{Zadatak: Prikaz operacija nad listama sa jedinstvenim ključem} + +\begin{lstlisting}[style=codeblock] +MODULE Radnici; + +FROM InOut IMPORT WriteString, ReadString, + WriteLn, WriteCard, ReadCard, Done; +FROM IO IMPORT RdKey; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; + +TYPE + skupZn = SET OF CHAR; + str = ARRAY [1..20] OF CHAR; + radnici = POINTER TO slog; + slog = RECORD + ime, prez : str; + broj : CARDINAL; + sled : radnici + END; +VAR + meni, pom : CHAR; + rad : radnici; + + PROCEDURE Clear(); + VAR + br: CARDINAL; + BEGIN + FOR br:=1 TO 100 DO + WriteLn; + END; + END Clear; + + PROCEDURE Spisak(rad : radnici); + BEGIN + WHILE rad # NIL DO + WriteString(rad^.ime); + WriteString(' '); + WriteString(rad^.prez); + WriteCard(rad^.broj, 8); + WriteLn; + rad := rad^.sled + END + END Spisak; + + PROCEDURE Zaposli(VAR rad : radnici); + VAR + novi, tek : radnici; + nadjen : BOOLEAN; + BEGIN + NEW(novi); + REPEAT + WriteString('Ime, prezime i jedinstveni'); + WriteString(' broj novog radnika: '); + WriteLn; + ReadString(novi^.ime); + ReadString(novi^.prez); + ReadCard(novi^.broj); + nadjen := FALSE; + tek := rad; + WHILE NOT nadjen AND (tek # NIL) AND + (tek^.broj <= novi^.broj) DO + IF novi^.broj = tek^.broj THEN + nadjen := TRUE + ELSE + tek := tek^.sled + END + END + UNTIL Done AND NOT nadjen; + IF (rad = NIL) OR (novi^.broj br) THEN + WriteString('Greska.') + ELSE + pom := tek^.sled; + tek^.sled := tek^.sled^.sled; + DISPOSE(pom) + END + END + END Otpusti; + + PROCEDURE Inform(rad : radnici); + VAR + br : CARDINAL; + BEGIN + REPEAT + WriteLn; + WriteString('Unesite redni broj radnika:'); + ReadCard(br) + UNTIL Done; + WriteLn; + WHILE (rad # NIL) AND (rad^.broj < br) DO + rad := rad^.sled + END; + IF (rad = NIL) OR (rad^.broj # br) THEN + WriteString('Greska.') + ELSE + WriteString(rad^.ime); + WriteString(' '); + WriteString(rad^.prez) + END + END Inform; + + PROCEDURE Bankrot(VAR rad : radnici); + VAR + pom : radnici; + BEGIN + WHILE rad # NIL DO + pom := rad; + rad := rad^.sled; + DISPOSE(pom) + END + END Bankrot; + +BEGIN + rad := NIL; + REPEAT + Clear; + WriteString('s - spisak svih zaposlenih'); + WriteLn; + WriteString('z - zaposljavanje radnika'); + WriteLn; + WriteString('o - otpustanje radnika'); + WriteLn; + WriteString('i - informacije o radniku'); + WriteLn; + WriteString('b - bankrot firme'); + WriteLn; + WriteString('k - kraj rada'); + WriteLn; + REPEAT + meni := RdKey(); + UNTIL CAP(meni) IN skupZn{'S', 'Z', 'O', + 'I', 'B', 'K'}; + Clear; + IF CAP(meni) # 'K' THEN + CASE CAP(meni) OF + 'S' : Spisak(rad)| + 'Z' : Zaposli(rad)| + 'O' : Otpusti(rad)| + 'I' : Inform(rad)| + 'B' : Bankrot(rad) + END; + WriteLn; + WriteString('-- pritisnite bilo koji '); + WriteString('taster za nastavak --'); + pom := RdKey() + END + UNTIL CAP(meni) = 'K' +END Radnici. +\end{lstlisting} + +Procedura \kod{Spisak} se može realizovati i u rekurzivnoj verziji: + +\begin{lstlisting}[style=codeblock] + PROCEDURE Spisak(rad : radnici); + BEGIN + IF rad # NIL THEN + WriteString(rad^.ime); + WriteString(' '); + WriteString(rad^.prez); + WriteCard(rad^.broj, 8); + WriteLn; + Spisak(rad^.sled) + END + END Spisak; +\end{lstlisting} + +\subsection[Zadatak: Dve liste osoba sa istim sadržajem]{Zadatak: Dve + liste osoba koje dele sadržaj, jedna sortirana po visini, druga po + težini} + +Sa tastature ucitavati po dva broja koji opisiuju osobu (visina i +tezina) i smestati ih u povezane listu, tako da postoji neopadajuce +uredjenje i po visini i po tezini. + +\begin{lstlisting}[style=codeblock] +MODULE VisTez; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; +FROM IO IMPORT WrLn, WrStr, RdCard, WrCard; +FROM SYSTEM IMPORT TSIZE; +TYPE + pok = POINTER TO element; + element = RECORD + visina, tezina : CARDINAL; + Vveza, Tveza : pok + END; +VAR + pocV, pocT : pok; + vis, tez : CARDINAL; +PROCEDURE Ispisi(pocV, pocT : pok); +VAR + tek : pok; +BEGIN + tek := pocV; + WrStr('Po visini:'); + WrLn; + WHILE tek # NIL DO + WrCard(tek^.visina, 6); + tek := tek^.Vveza + END; + WrLn; + tek := pocT; + WrStr('Po tezini:'); + WrLn; + WHILE tek # NIL DO + WrCard(tek^.tezina,6); + tek := tek^.Tveza + END +END Ispisi; + +PROCEDURE Ubaci(VAR pocV, pocT : pok; + vis, tez : CARDINAL); +VAR + novi, tek, iza : pok; + nadjen : BOOLEAN; +BEGIN + IF pocV = NIL THEN + ALLOCATE(pocV, TSIZE(element)); + pocV^.visina := vis; + pocV^.tezina := tez; + pocV^.Vveza := NIL; + pocV^.Tveza := NIL; + pocT := pocV + ELSE + ALLOCATE(novi, TSIZE(element)); + novi^.visina := vis; + novi^.tezina := tez; + tek := pocV; + nadjen := FALSE; + WHILE (tek # NIL) AND NOT nadjen DO + nadjen := vis <= tek^.visina; + IF NOT nadjen THEN + iza := tek; + tek := tek^.Vveza + END + END; + novi^.Vveza := tek; + IF tek = pocV THEN + pocV := novi + ELSE + iza^.Vveza := novi + END; + tek := pocT; + nadjen := FALSE; + WHILE (tek # NIL) AND NOT nadjen DO + nadjen := tez <= tek^.tezina; + IF NOT nadjen THEN + iza := tek; + tek := tek^.Tveza + END + END; + novi^.Tveza := tek; + IF tek = pocT THEN + pocT := novi + ELSE + iza^.Tveza := novi + END + END +END Ubaci; + +BEGIN + pocV := NIL; + pocT := NIL; + WrStr('Unesite visinu ---- '); + vis := RdCard(); + WHILE vis > 0 DO + WrStr('Unesite tezinu ---- '); + tez := RdCard(); + Ubaci(pocV, pocT, vis, tez); + WrLn; + WrStr('Unesite visinu ---- '); + vis := RdCard() + END; + WrLn; + Ispisi(pocV, pocT) +END VisTez. +\end{lstlisting} + +\section{Polinomi preko listi} + +\subsection{Moduli} + +Polinomi su predstavljeni pomoću pokazivača. Apstraktni tip podataka +\kod{Polinom} je definisan u globalnom modulu. + +\begin{lstlisting}[style=codeblock] +DEFINITION MODULE PolinomL; +TYPE + Polinom = POINTER TO Monom; + Monom = RECORD + k : REAL; + st : CARDINAL; + veza : Polinom + END; + +PROCEDURE Anuliraj(VAR p: Polinom); +PROCEDURE Unos(VAR p: Polinom); +PROCEDURE Stampaj(p: Polinom; d: CARDINAL); +PROCEDURE Kopiraj(p: Polinom; + VAR kopija: Polinom); +PROCEDURE UbaciMonom(mon:Polinom; + VAR p: Polinom); +PROCEDURE PromeniZnak(VAR p: Polinom); +PROCEDURE Saberi(p1, p2: Polinom; + VAR zbir: Polinom); +PROCEDURE SaberiNa(p: Polinom; VAR rez: Polinom); +PROCEDURE Oduzmi(p1,p2: Polinom; + VAR razlika: Polinom); +PROCEDURE MonomPuta(p, mon: Polinom; + VAR mp : Polinom); +PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom); +PROCEDURE Kolicnik(p1, p2: Polinom; + VAR kol, ost: Polinom; + VAR ok : BOOLEAN); +PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL; + VAR rez: Polinom); +PROCEDURE DisposePolinom(VAR p: Polinom); + +END PolinomL. +(* --- kraj definicionog modula --- *) + +IMPLEMENTATION MODULE PolinomL; +FROM InOut IMPORT Write, WriteString, WriteLn, + WriteCard, ReadCard, Done; +FROM RealInOut IMPORT WriteReal, ReadReal; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; + +PROCEDURE Anuliraj(VAR p: Polinom); +BEGIN + IF p # NIL THEN + DisposePolinom(p); + END; +END Anuliraj; + +PROCEDURE Kopiraj(p: Polinom; + VAR kopija: Polinom); +VAR + pomocni: Polinom; +BEGIN + IF p = NIL THEN + kopija := NIL + ELSE + NEW(kopija); + kopija^ := p^; + p := p^.veza; + pomocni := kopija; + WHILE p <> NIL DO + NEW(pomocni^.veza); + pomocni := pomocni^.veza; + pomocni^ := p^; + p := p^.veza + END + END +END Kopiraj; + +PROCEDURE Stampaj(p: Polinom; d: CARDINAL); + + PROCEDURE StampajMonom(m : Polinom); + BEGIN + WITH m^ DO + IF st <> 0 THEN + IF ABS(k) <> 1.0 THEN + WriteReal(ABS(k), d) + END; + Write('x'); + IF st <> 1 THEN + Write('^'); + WriteCard(st, 1) + END + ELSE + WriteReal(ABS(k), d) + END + END + END StampajMonom; + +BEGIN + IF p = NIL THEN + WriteReal(0., d) + ELSE + IF p^.k < 0.0 THEN + WriteString(' - ') + END; + StampajMonom(p); + p := p^.veza; + WHILE p <> NIL DO + IF p^.k > 0.0 THEN + WriteString(' + ') + ELSE + WriteString(' - ') + END; + StampajMonom(p); + p := p^.veza + END + END +END Stampaj; + +PROCEDURE UbaciMonom(mon :Polinom; + VAR p: Polinom); +VAR + stari, tekuci, kopija: Polinom; +BEGIN + IF mon # NIL THEN + NEW(kopija); + kopija^ := mon^; + tekuci := p; + stari := NIL; + WHILE (tekuci#NIL) AND (tekuci^.st>kopija^.st) DO + stari := tekuci; + tekuci := tekuci^.veza + END; + kopija^.veza := tekuci; + IF tekuci = p THEN + p := kopija + ELSE + stari^.veza := kopija + END; + IF (tekuci#NIL) AND + (kopija^.st = tekuci^.st) THEN + kopija^.k := kopija^.k + tekuci^.k; + kopija^.veza := tekuci^.veza; + DISPOSE(tekuci); + IF kopija^.k = 0.0 THEN + IF p = kopija THEN + p := kopija^.veza + ELSE + stari^.veza := kopija^.veza + END; + DISPOSE(kopija) + END + END + END +END UbaciMonom; + +PROCEDURE Unos(VAR p : Polinom); +VAR + i, n: CARDINAL; + novi: Polinom; +BEGIN + Anuliraj(p); + REPEAT + WriteLn; + WriteString('Unesite broj monoma n (n>=0) '); + ReadCard(n); + UNTIL Done; + WriteLn; + FOR i := 1 TO n DO + NEW(novi); + WITH novi^ DO + REPEAT + WriteString('koeficijent monoma br.'); + WriteCard(i, 1); + WriteString(' (<> 0):'); + ReadReal(k); + WriteLn + UNTIL k <> 0.0; + REPEAT + WriteLn; + WriteString('eksponent monoma br.'); + WriteCard(i, 1); + WriteString(' (>= 0): '); + ReadCard(st); + UNTIL Done; + WriteLn; + END; + UbaciMonom(novi, p); + DISPOSE(novi); + END +END Unos; + +PROCEDURE Saberi(p1, p2: Polinom; + VAR zbir: Polinom); +BEGIN + Kopiraj(p1, zbir); + WHILE p2 <> NIL DO + UbaciMonom(p2, zbir); + p2 := p2^.veza + END +END Saberi; + +PROCEDURE SaberiNa(p: Polinom; + VAR rez: Polinom); +BEGIN + WHILE p <> NIL DO + UbaciMonom(p,rez); + p := p^.veza; + END; +END SaberiNa; + +PROCEDURE PromeniZnak(VAR p: Polinom); +VAR + t: Polinom; +BEGIN + t := p; + WHILE t <> NIL DO + t^.k := - t^.k; + t := t^.veza + END +END PromeniZnak; + +PROCEDURE Oduzmi(p1,p2: Polinom; + VAR razlika: Polinom); +BEGIN + Kopiraj(p2, razlika); + PromeniZnak(razlika); + WHILE p1 <> NIL DO + UbaciMonom(p1, razlika); + p1 := p1^.veza + END +END Oduzmi; + +PROCEDURE MonomPuta(p, mon: Polinom; + VAR mp: Polinom); +VAR + tekuci: Polinom; +BEGIN + Anuliraj(mp); + IF (mon <> NIL) AND (p <> NIL) THEN + NEW(mp); + mp^.k := p^.k * mon^.k; + mp^.st := p^.st + mon^.st; + p := p^.veza; + tekuci := mp; + WHILE p <> NIL DO + NEW(tekuci^.veza); + tekuci := tekuci^.veza; + tekuci^.k := p^.k * mon^.k; + tekuci^.st := p^.st + mon^.st; + p := p^.veza + END; + tekuci^.veza := NIL + END +END MonomPuta; + +PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom); +VAR + pomocni: Polinom; +BEGIN + Anuliraj(pr); + IF (p1 <> NIL) AND (p2 <> NIL) THEN + MonomPuta(p1, p2, pr); + p2 := p2^.veza; + WHILE p2 <> NIL DO + MonomPuta(p1, p2, pomocni); + REPEAT + UbaciMonom(pomocni, pr); + pomocni := pomocni^.veza + UNTIL pomocni = NIL; + p2 := p2^.veza + END + END +END Puta; + +PROCEDURE Kolicnik(p1, p2: Polinom; + VAR kol, ost: Polinom; + VAR ok: BOOLEAN); + + PROCEDURE Deli(VAR kol, ost: Polinom); + VAR + novi, pomocni: Polinom; + BEGIN + IF ost <> NIL THEN + IF ost^.st >= p2^.st THEN + NEW(novi); + novi^.k := - ost^.k / p2^.k; + novi^.st := ost^.st - p2^.st; + MonomPuta(p2, novi, pomocni); + Saberi(ost, pomocni, ost); + novi^.k := - novi^.k; + UbaciMonom(novi, kol); + DISPOSE(novi); + Deli(kol, ost) + END + END + END Deli; + +BEGIN (* Kolicnik *) + ok := TRUE; + Anuliraj(kol); + IF p2 = NIL THEN + ok := FALSE + ELSE + Kopiraj(p1, ost); + Deli(kol, ost) + END +END Kolicnik; + +PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL; + VAR rez: Polinom); +VAR + i: CARDINAL; +BEGIN + IF n = 0 THEN + NEW(rez); + rez^.k := 1.0; + rez^.st := 0; + rez^.veza := NIL; + ELSIF n = 1 THEN + Kopiraj( rez, p ); + ELSE + rez := p; + FOR i := 2 TO n DO + Puta(rez, p, rez) + END + END; +END PolinomNaN; + +PROCEDURE DisposePolinom(VAR p: Polinom); +VAR + pomocni: Polinom; +BEGIN + pomocni := p; + WHILE pomocni # NIL DO + p := p^.veza; + DISPOSE(pomocni); + pomocni := p + END +END DisposePolinom; + +END PolinomL. +\end{lstlisting} + + +\subsection{Zadatak: Sabiranje sa unapred određenim polinomom} + +Želimo da ispišemo uneti polinom uvećan za\\ $x^5 - 3x^4 + 4x + 7$. + +\begin{lstlisting}[style=codeblock] +MODULE polinom; +FROM PolinomL IMPORT Polinom, Stampaj, Anuliraj, DisposePolinom, UbaciMonom, Unos, Saberi; +FROM InOut IMPORT WriteString, WriteLn; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; + +VAR + p,q,rez,pom : Polinom; + +BEGIN + (* korisnik unosi prvi polinom *) + WriteString("Unesite polinom:"); + WriteLn; + Unos(p); + (* drugi polinom kreiramo mi, + monom po monom *) + Anuliraj(q); (* isto sto i q:=NIL; *) + (* formiramo monom x^5 *) + NEW(pom); + pom^.st:=5; + pom^.k:=1.0; + (* dodajemo ga u polinom *) + UbaciMonom(pom,q); + DISPOSE(pom); + (* -3 x^4 *) + NEW(pom); + pom^.st := 4; + pom^.k := -3.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 4 x *) + NEW(pom); + pom^.st := 1; + pom^.k := 4.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* 7 (x^0) *) + NEW(pom); + pom^.st := 0; + pom^.k := 7.0; + UbaciMonom(pom,q); + DISPOSE(pom); + (* saberemo polinome *) + Saberi(p, q, rez); + (* odstampamo rezultat *) + Stampaj(rez,0); + WriteLn; + (* oslobadjanje zauzete memorije *) + DisposePolinom(p); + DisposePolinom(q); + DisposePolinom(rez); +END polinom. +\end{lstlisting} + +\subsection{Zadatak: Suma k polinoma} + +Napisati program koji ucitava broj k (1<=k<=50) i k polinoma, a nakon +toga izracunava njihovu sumu + +\begin{lstlisting}[style=codeblock] +MODULE PolSuma; + +FROM PolinomL IMPORT Polinom, Anuliraj, DisposePolinom, Unos, Stampaj, SaberiNa; +FROM InOut IMPORT WriteLn, WriteString, ReadCard, WriteCard; +CONST + maxk = 50; +TYPE + nizPol = ARRAY [1..maxk] OF Polinom; +VAR + i, k: CARDINAL; + suma : Polinom; + p : nizPol; +BEGIN + REPEAT + WriteString('Unesite broj k (1 <= k <= '); + WriteCard(maxk, 1); + WriteString(') '); + ReadCard(k); + WriteLn; + UNTIL (1 <= k) AND (k <= maxk); + FOR i := 1 TO k DO + WriteLn; + WriteString('Unos '); + WriteCard(i, 1); + WriteString('. polinoma.'); + WriteLn; + Unos(p[i]) + END; + Anuliraj(suma); + FOR i := 1 TO k DO + SaberiNa(suma, p[i]) + END; + WriteLn; + WriteString('Njihova suma je:'); + WriteLn; + Stampaj(suma, 4); + DisposePolinom(suma); + FOR i := 1 TO k DO + DisposePolinom(p[i]); + END; +END PolSuma. +\end{lstlisting} + +\section{Stek i red opsluživanja} + +\subsection{Zadatak: Ilustracija pisanja u fajl uz pomoć bafera} + +\begin{lstlisting}[style=codeblock] +DEFINITION MODULE QueueInfo; +CONST + Maxqueue = 100; +TYPE + InfoTip = CHAR; + +END QueueInfo. + +IMPLEMENTATION MODULE QueueInfo; +END QueueInfo. + +DEFINITION MODULE RedOpsl1; +FROM QueueInfo IMPORT InfoTip,Maxqueue; +TYPE + Niz = ARRAY[1..Maxqueue] OF InfoTip; + RedOpslTip = RECORD + Prvi, Zadnji : CARDINAL; + Element : Niz + END; + +PROCEDURE MakeNull(VAR q : RedOpslTip); +PROCEDURE Empty(VAR q : RedOpslTip) : BOOLEAN; +PROCEDURE First(VAR q : RedOpslTip; + VAR x : InfoTip; + VAR ok : BOOLEAN); +PROCEDURE PopFirst(VAR q : RedOpslTip; + VAR ok : BOOLEAN); +PROCEDURE AddRear(VAR q : RedOpslTip; + x : InfoTip; + VAR ok : BOOLEAN); + +END RedOpsl1. + +IMPLEMENTATION MODULE RedOpsl1; +FROM QueueInfo IMPORT Maxqueue,InfoTip; + +PROCEDURE MakeNull(VAR q : RedOpslTip); +BEGIN + WITH q DO + Prvi := 0; + Zadnji := 0 + END +END MakeNull; + +PROCEDURE Empty(VAR q : RedOpslTip) : BOOLEAN; +BEGIN + RETURN q.Zadnji = 0 +END Empty; + + +PROCEDURE First(VAR q : RedOpslTip; + VAR x : InfoTip; + VAR ok : BOOLEAN); +BEGIN + IF Empty(q) THEN + ok := FALSE + ELSE + ok := TRUE; + WITH q DO + x := Element[Prvi] + END + END +END First; + +PROCEDURE AddOne(i : CARDINAL) : CARDINAL; +BEGIN + IF i = Maxqueue THEN + RETURN 1 + ELSE + RETURN i+1 + END +END AddOne; + +PROCEDURE PopFirst(VAR q : RedOpslTip; + VAR ok : BOOLEAN); +BEGIN + IF Empty(q) THEN + ok := FALSE + ELSE + ok := TRUE; + WITH q DO + IF Prvi = Zadnji THEN + MakeNull(q) + ELSE + Prvi := AddOne(Prvi) + END + END + END +END PopFirst; + +PROCEDURE AddRear(VAR q : RedOpslTip; + x : InfoTip; + VAR ok : BOOLEAN); +BEGIN + WITH q DO + IF AddOne(Zadnji) = Prvi THEN + ok := FALSE + ELSE + ok := TRUE; + IF Empty(q) THEN + Prvi := 1; + Zadnji := 1 + ELSE + Zadnji := AddOne(Zadnji) + END; + Element[Zadnji] := x + END + END +END AddRear; + +END RedOpsl1. + +MODULE Bafer; +FROM RedOpsl1 IMPORT RedOpslTip, MakeNull, Empty, First, PopFirst, AddRear; +FROM FIO IMPORT File,WrChar, Create, Close; +IMPORT IO; + +CONST + ImeIzlaza = 'izlaz.txt'; + +VAR + izlaz : File; + znak : CHAR; + buffer : RedOpslTip; + +PROCEDURE IsprazniBafer(VAR dat : File; + VAR buf : RedOpslTip); +VAR + znak : CHAR; + ok : BOOLEAN; +BEGIN + WHILE NOT Empty(buf) DO + First(buf, znak, ok); + PopFirst(buf, ok); + WrChar(dat, znak) + END +END IsprazniBafer; + +PROCEDURE BaferWrite(VAR dat : File; + VAR buf : RedOpslTip; + znak : CHAR); +VAR + ok : BOOLEAN; +BEGIN + AddRear(buf, znak, ok); + IF NOT ok THEN + IsprazniBafer(dat, buf); + AddRear(buf, znak, ok) + END +END BaferWrite; + +BEGIN + izlaz := Create(ImeIzlaza); + MakeNull(buffer); + IO.WrStr('Unesite tekst, koji treba da se unese u datoteku '); + IO.WrStr(ImeIzlaza); + IO.WrChar('.'); + IO.WrLn; + IO.WrStr('Unos zavrsite tackom.'); + IO.WrLn; + znak := IO.RdChar(); + WHILE znak # '.' DO + BaferWrite(izlaz, buffer, znak); + znak := IO.RdChar(); + END; + IsprazniBafer(izlaz, buffer); + Close(izlaz) +END Bafer. +\end{lstlisting} + +\subsection% +{Zadatak: Ispitivanje da li reč pripada gramatici wcw$^+$} + +Reč pripada ovoj gramatici ako joj se prvi deo (w) sastoji samo od +slova 'a' i 'b', sledi slovo 'c' a nakon njega obrnuta reč reči w. + +\begin{lstlisting}[style=codeblock] +DEFINITION MODULE Stek; +CONST + Maxstack = 100; +TYPE + Niz = ARRAY [1..Maxstack] OF CHAR; + StekTip = RECORD + Top : CARDINAL; + Element : Niz + END; +PROCEDURE MakeNull(VAR s : StekTip); +PROCEDURE Empty(VAR s : StekTip) : BOOLEAN; + +PROCEDURE Top(VAR s : StekTip; + VAR x : CHAR; + VAR ok : BOOLEAN); +PROCEDURE Pop(VAR s : StekTip; + VAR ok : BOOLEAN); +PROCEDURE Push(VAR s : StekTip; + x : CHAR; + VAR ok : BOOLEAN); +END Stek. + + +IMPLEMENTATION MODULE Stek; + +PROCEDURE MakeNull(VAR s : StekTip); +BEGIN + s.Top := 0 +END MakeNull; + +PROCEDURE Empty(VAR s : StekTip) : BOOLEAN; +BEGIN + RETURN s.Top = 0 +END Empty; + +PROCEDURE Top(VAR s : StekTip; + VAR x : CHAR; + VAR ok : BOOLEAN); +BEGIN + IF Empty(s) THEN + ok := FALSE + ELSE + ok := TRUE; + WITH s DO + x := Element[Top] + END + END +END Top; + +PROCEDURE Pop(VAR s : StekTip; + VAR ok : BOOLEAN); +BEGIN + IF Empty(s) THEN + ok := FALSE + ELSE + ok := TRUE; + DEC(s.Top) + END +END Pop; + +PROCEDURE Push(VAR s : StekTip; + x : CHAR; + VAR ok : BOOLEAN); +BEGIN + WITH s DO + IF Top = Maxstack THEN + ok := FALSE + ELSE + ok := TRUE; + INC(Top); + Element[Top] := x + END + END +END Push; +END Stek. + +MODULE wcw; +(* Da li rec pripada gramatici wcw+. *) +FROM Stek IMPORT StekTip, MakeNull, Empty, + Top, Pop, Push; +FROM InOut IMPORT Read, Write, WriteString, EOL; +TYPE + slova = SET OF CHAR; +VAR + S : StekTip; + Ch, C : CHAR; + ok : BOOLEAN; +BEGIN + MakeNull(S); + Read(Ch); + ok := TRUE; + WHILE ok AND (Ch IN slova{'a', 'b'}) DO + Push(S, Ch, ok); + Read(Ch); + END; + IF NOT ok THEN + WriteString('Greska - mali stek') + ELSIF Ch # 'c' THEN + WriteString('Pogresan string') + ELSE + Read(Ch); + WHILE ok AND (Ch # EOL) DO + Top(S, C, ok); + ok := ok AND (C = Ch); + IF ok THEN + Pop(S, ok); + Read(Ch); + END + END; + IF NOT (ok AND Empty(S)) THEN + WriteString('Pogresan string') + ELSE + WriteString('String pripada jeziku L') + END + END +END wcw. +\end{lstlisting} + +\subsection{Zadatak: Kalkulator za izračunavanje postfiksnih izraza} + + +Napraviti kalkulator za izračunavanje postfiksnih izraza. Svi brojevi +koji figurišu u izrazu su jednocifreni. + +\begin{lstlisting}[style=codeblock] +MODULE PostFix; + +FROM StekI IMPORT StekTip, MakeNull, Empty, Top, Pop, Push; +FROM InOut IMPORT Read, Write, WriteInt, EOL; +TYPE + slova = SET OF CHAR; +VAR + S : StekTip; + Ch : CHAR; + Op1, Op2 : INTEGER; + ok : BOOLEAN; +PROCEDURE Conv(Ch : CHAR) : INTEGER; +BEGIN + RETURN ORD(Ch) - ORD('0') +END Conv; + +BEGIN + MakeNull(S); + Read(Ch); + WHILE Ch # EOL DO + IF Ch IN slova{'+', '-', '/', '*', '%'} THEN + Top(S, Op2, ok); + Pop(S, ok); + Top(S, Op1, ok); + Pop(S, ok); + CASE Ch OF + '+' : Op1 := Op1 + Op2 | + '-' : Op1 := Op1 - Op2 | + '*' : Op1 := Op1 * Op2 | + '/' : Op1 := Op1 DIV Op2 | + '%' : Op1 := Op1 MOD Op2 + END; + Push(S, Op1, ok) + ELSE + Push(S, Conv(Ch), ok) + END; + Read(Ch); + END; + Top(S, Op1, ok); + Write('='); + WriteInt(Op1,5) +END PostFix. +\end{lstlisting} + + +\section{Simulacija rekurzije} + + +Na početku označiti sve rekurzivne pozive u originalnoj proceduri +adresama (npr. 1,2,3... ili konstante nabrojivog tipa podataka). + +Na steku se čuvaju lokalne promenljive, parametri procedure i adresa +mesta poziva, a u skladu sa tim se kreira InfoTip. + +Trivijalnim pozivom se smatra onaj koji se izračunava bez dodatnih +rekurzivnih poziva. + +U kodu ispod, \kod{treba\_rekurzija} znači da je poziv netrivijalan, +odnosno treba naći uslove pod kojima se sigurno dešavaju rekurzivni +pozivi. + +\begin{lstlisting} +MakeNull(S); +REPEAT + WHILE treba_rekurzija DO + -prepisati sve od pocetka originalne + procedure do prvog rekurzivnog poziva + -staviti na stek potrebne + lokalne promenljive, parametre procedure i + adresu mesta poziva + -podesiti vrednosti parametara da budu + kao u rekurzivnom pozivu procedure + END; + trivijalan poziv + umesto RETURN x pisati rez := x + jos := TRUE; + WHILE jos AND NOT Empty(S) DO + Top(S, el, ok); + Pop(S, ok); + -restauriramo vrednosti sa steka + -u zavisnosti od adrese poziva nastavimo + prepisivanje originalne procedure sa + tog mesta + -ako se dodje do novog rek. poziva tada: + -sacuvati na steku vrednosti + -podesiti vrednosti parametara da budu + kao u rekurzivnom pozivu procedure + -ici na pocetak koda + (ovo se postize sa jos := FALSE) + -inace + ako se naidje na RETURN x pisati rez := x + END +UNTIL Empty(S); +\end{lstlisting} + +Ako je procedura funkcijska tada se na kraj dodaje \kod{RETURN rez}. + +\subsection*{ZADACI} + +Simulirati ponašanje sledećih rekurzivnih procedura (funkcija) upotrebom steka: + +\subsection{Primer 1 -- faktorijel} + + +\begin{lstlisting}[style=codeblock] +MODULE Fakto; +(* InfoTip = CARDINAL; *) + +FROM IO IMPORT WrStr, WrLn, WrCard, RdCard; +FROM StekC IMPORT StekTip, MakeNull, Empty, + Top, Pop, Push; +VAR + n : CARDINAL; +PROCEDURE RFakto(n : CARDINAL) : CARDINAL; +BEGIN + IF n <= 1 THEN + RETURN 1 + ELSE + RETURN n * RFakto(n-1) + END +END RFakto; + + +PROCEDURE SFakto(n : CARDINAL) : CARDINAL; +VAR + s : StekTip; + rez : CARDINAL; + OK : BOOLEAN; +BEGIN + MakeNull(s); + WHILE n > 1 DO + Push(s,n,OK); + DEC(n) + END; + rez := 1; + WHILE NOT Empty(s) DO + Top(s, n, OK); + Pop(s, OK); + rez := n * rez + END; + RETURN rez +END SFakto; + +BEGIN + WrStr('n = '); + n := RdCard(); + WrLn + WrStr('n! = '); + WrCard(RFakto(n), 1); + WrStr(' = '); + WrCard(SFakto(n), 1) +END Fakto. +\end{lstlisting} + +\subsection{Primer 2 -- stepenovanje} + +\begin{lstlisting}[style=codeblock] +MODULE Step; +(* InfoTip = RECORD + x : REAL; + n : CARDINAL; + adr : (par, nepar) + END; +*) + +FROM IO IMPORT WrStr, WrLn, WrReal, + RdReal, RdCard; +FROM StekStep IMPORT StekTip, MakeNull, Empty, + Top, Pop, Push, InfoTip, AdrTip; + +VAR + n : CARDINAL; + x : REAL; + +PROCEDURE Sqr(y : REAL) : REAL; +BEGIN + RETURN y * y +END Sqr; + +PROCEDURE RStep(x : REAL; + n : CARDINAL) : REAL; +BEGIN + IF n = 0 THEN + RETURN 1. + ELSIF ODD(n) THEN + RETURN x * Sqr( RStep(x, n DIV 2) ) + ELSE + RETURN Sqr( RStep(x, n DIV 2) ) + END +END RStep; + +PROCEDURE SStep(x : REAL; + n : CARDINAL ) : REAL; +VAR + s : StekTip; + OK : BOOLEAN; + rez : REAL; + el : InfoTip; +BEGIN + MakeNull(s); + WHILE n > 0 DO + el.x := x; + el.n := n; + IF ODD(n) THEN + el.adr := nepar; + ELSE + el.adr := par + END; + Push(s,el,OK); + n := n DIV 2 + END; + rez := 1.; + WHILE NOT Empty(s) DO + Top(s, el, OK); + Pop(s, OK); + x := el.x; + n := el.n; + IF el.adr = nepar THEN + rez := x * Sqr(rez) + ELSE + rez := Sqr(rez) + END + END; + RETURN rez +END SStep; + +BEGIN + WrStr('x =? '); + x := RdReal(); + WrLn; + WrStr('n =? '); + n := RdCard(); + WrStr('x^n = '); + WrReal(RStep(x, n), 10, 1); + WrStr(' = '); + WrReal(SStep(x, n), 10, 1) +END Step. +\end{lstlisting} + +\subsection{Primer 3 -- Fibonači} + +\begin{lstlisting}[style=codeblock] +MODULE Fib; +(* InfoTip = RECORD + n : CARDINAL; + PrviSab : CARDINAL; + adr : (prvi, drugi) + END; +*) + +FROM IO IMPORT WrStr, WrLn, WrCard, RdCard; +FROM StekFib IMPORT StekTip, MakeNull, Empty, + Top, Pop, Push, InfoTip, AdrTip; +VAR + n : CARDINAL; + +PROCEDURE RFib(n : CARDINAL) : CARDINAL; +BEGIN + IF n <= 1 THEN + RETURN n + ELSE + RETURN RFib(n-1) + RFib(n-2) + END +END RFib; + +PROCEDURE SFib(n : CARDINAL ) : CARDINAL; +VAR + s : StekTip; + OK, jos : BOOLEAN; + rez, PrviSab : CARDINAL; + el : InfoTip; +BEGIN + MakeNull(s); + REPEAT + WHILE n > 1 DO + el.n := n; + el.adr := prvi; + Push(s,el,OK); + DEC(n) + END; + rez := (n); + jos := TRUE; + WHILE (NOT Empty(s)) AND jos DO + Top(s, el, OK); + Pop(s, OK); + n := el.n; + IF el.adr = prvi THEN + PrviSab := rez; + el.n := n; + el.adr := drugi; + el.PrviSab := PrviSab; + Push(s, el, OK); + DEC(n, 2); + jos := FALSE + ELSE + PrviSab := el.PrviSab; + rez := PrviSab + rez + END + END + UNTIL Empty(s); + RETURN rez +END SFib; + +BEGIN + WrStr('n =? '); + n := RdCard(); + WrStr('F(n) = '); + WrCard(RFib(n), 1); + WrStr(' = '); + WrCard(SFib(n), 1) +END Fib. +\end{lstlisting} + +\subsection{Primer 4 -- faktorijel 2} + + +\begin{lstlisting}[style=codeblock] +MODULE Faktor; +(* InfoTip = CARDINAL; *) +FROM IO IMPORT WrStr, WrLn, WrCard, RdCard; +FROM StekC IMPORT StekTip, MakeNull, Empty, + Top, Pop, Push; + +VAR + n,rez : CARDINAL; + +PROCEDURE RFakto(n : CARDINAL; + VAR rez : CARDINAL); +BEGIN + IF n = 0 THEN + rez := 1 + ELSE + RFakto(n-1, rez); + rez := n * rez + END +END RFakto; + +PROCEDURE SFakto(n : CARDINAL; + VAR rez : CARDINAL); +VAR + s : StekTip; + OK : BOOLEAN; +BEGIN + MakeNull(s); + WHILE n > 0 DO + Push(s,n,OK); + DEC(n) + END; + rez := 1; + WHILE NOT Empty(s) DO + Top(s, n, OK); + Pop(s, OK); + rez := n * rez + END +END SFakto; + +BEGIN + WrStr('n =? '); + n := RdCard(); + WrLn; + WrStr('n! = '); + RFakto(n, rez); + WrCard(rez, 1); + WrStr(' = '); + SFakto(n, rez); + WrCard(rez, 1) +END Faktor. +\end{lstlisting} + +\subsection{Primer 5 (ispitni)} + + +\begin{lstlisting}[style=codeblock] +MODULE Rek1; +(* InfoTip = RECORD + d, g, m1, m2 : INTEGER; + adr : (prvi, drugi) + END; +*) +FROM Stek1 IMPORT StekTip, adresa, InfoTip, + MakeNull, Empty, Top, Pop, Push; +IMPORT IO; +VAR + X : ARRAY [1..20] OF INTEGER; + +PROCEDURE Max(d, g: INTEGER) : INTEGER; +VAR + m1, m2 : INTEGER; +BEGIN + IF d>g THEN + RETURN MIN(INTEGER) + ELSIF d=g THEN + RETURN X[d] + ELSE + m1 := Max(d, (d+g) DIV 2); + m2 := Max((d+g) DIV 2 +1, g); + IF m1 > m2 THEN + RETURN m1 + ELSE + RETURN m2 + END + END +END Max; + +PROCEDURE SMax(d, g: INTEGER) : INTEGER; +VAR + S : StekTip; + el : InfoTip; + ok, jos : BOOLEAN; + m1, m2, rez : INTEGER; +BEGIN + MakeNull(S); + REPEAT + WHILE dg THEN + rez := MIN(INTEGER) + ELSE (* d=g *) + rez := X[d] + END; + jos := TRUE; + WHILE jos AND NOT Empty(S) DO + Top(S, el, ok); + Pop(S, ok); + d := el.d; + g := el.g; + m1 := el.m1; + IF el.adr = prvi THEN + m1 := rez; + el.m1 := m1; + el.adr := drugi; + Push(S, el, ok); + d := (d+g) DIV 2 + 1; + jos := FALSE + ELSE (*el.adr = drugi*) + m2 := rez; + IF m1 > m2 THEN + rez := m1 + ELSE + rez := m2 + END + END + END + UNTIL Empty(S); + RETURN rez +END SMax; + +BEGIN (* glavni program *) + X[1] := 3; + X[2] := 2; + X[3] := 5; + X[4] := -7; + X[5] := 0; + IO.WrCard(Max(1, 5), 3); + IO.WrLn; + IO.WrCard(SMax(1, 5), 3); + IO.WrLn +END Rek1. +\end{lstlisting} + +\subsection{Primer 6 (ispitni)} + + +\begin{lstlisting}[style=codeblock] +MODULE Rek2; +(* InfoTip = RECORD + x, y, n : CARDINAL; + adr : (prvi, drugi, treci, cetvrti) + END; +*) +FROM Stek2 IMPORT StekTip, adresa, InfoTip, + MakeNull, Empty, Top, Pop, Push; +IMPORT IO; + +PROCEDURE g(x : CARDINAL; y : CARDINAL; + n : CARDINAL) : CARDINAL; +BEGIN + IF n < 3 THEN + RETURN x + y + ELSIF ODD(n) THEN + RETURN g(g(x+1, y, n-2), y, n-3) + ELSE + RETURN g(x, g(x, y+1, n-2), n-3) + END +END g; + +PROCEDURE Sg(x : CARDINAL; y : CARDINAL; + n : CARDINAL) : CARDINAL; +VAR + S : StekTip; + el : InfoTip; + ok, jos : BOOLEAN; + rez : CARDINAL; +BEGIN + MakeNull(S); + REPEAT + WHILE n >= 3 DO + IF ODD(n) THEN + el.x := x; + el.y := y; + el.n := n; + el.adr := prvi; + Push(S, el, ok); + INC(x); + DEC(n, 2) + ELSE + el.x := x; + el.y := y; + el.n := n; + el.adr := treci; + Push(S, el, ok); + INC(y); + DEC(n, 2) + END + END; + rez := x+y; + jos := TRUE; + WHILE jos AND NOT Empty(S) DO + Top(S, el, ok); + Pop(S, ok); + x := el.x; + y := el.y; + n := el.n; + IF el.adr = prvi THEN + el.adr := drugi; + Push(S, el, ok); + x := rez; + DEC(n, 3); + jos := FALSE + ELSIF el.adr = treci THEN + el.adr := cetvrti; + Push(S, el, ok); + y := rez; + DEC(n, 3); + jos := FALSE + END + END + UNTIL Empty(S); + RETURN rez +END Sg; + +BEGIN (* glavni program *) + IO.WrCard(g(2, 3, 10), 3); + IO.WrCard(Sg(2, 3, 10), 3); +END Rek2. +\end{lstlisting} + +%\columnbreak + +\appendix + +\section{Native XDS Modula 2 -- kratko uputstvo} + + +Ovo uputstvo ukratko pokriva kako se može nabaviti XDS Modula 2 za Windows +sistem, njenu instalaciju, te kako napraviti i pokretnuti jednostavan program. + +\subsection*{Dobavljanje instalacije} + + +Native XDS Modula 2 se može besplatno skinuti sa sajta proizvođača, +\url{http://www.excelsior-usa.com/}, tačnije na adresi: + +\url{http://www.excelsior-usa.com/xdsdl.html} + +Prvo se prikazuje ugovor o korišćenju koji na dnu treba potvrditi da ste +razumeli i da ćete ga se pridržavati. + +Na stranici koja se potom otvara je potrebno odabrati sledeće pakete za +download: + +* Native XDS-x86 2.51 for Windows (6.5MB) +\url{http://www.excelsior-usa.com/download/xds25x/xds-x86-251-enduser-win32.exe} + +* TSCP add-on (2.4MB) +\url{http://www.excelsior-usa.com/download/xds25x/tscp-x86-251-enduser-win32.exe} + +\subsection*{Instalacija okruženja} + +Prvo treba instalirati osnovno okruženje (xds-x86...), a potom i Top +Speed Compatibility Pack (tscp-x86...), koji je potreban za neke +module koji se koriste. + +\emph{Korisnicima Windows-a 7 preporučujemo da pokrenu instalacione + pakete pomoću opcije ``Run as administrator'' do koje se stiže desnim + klikom miša.} + +Pretpostavićemo u daljem tekstu da je program instaliran u +\kod{C:/XDS/} + +\subsection*{Pokretanje okruženja} + +Po uspešnoj instalaciji bi trebalo da postoji ikonica na desktopu, kao +i grupa sa programom u start meniju. + +Ukoliko iz bilo kakvog razloga ne postoje odgovarajuće prečice, +okruženje se može pokrenuti uz pomoć izvršnog fajla +\kod{C:/XDS/BIN/xds.exe} (ako je instalirano na podrazumevanoj +lokaciji). + +\subsection*{Prvi projekat} + +Da bismo mogli da pišemo i pokrećemo svoj program, potrebno je prvo +napraviti projekat za njega, što se radi na sledeći način: + +\begin{itemize} + +\item + Iz menija se odabere Project->New. +\item U dijalogu se klikne na gornje dugme ``Browse'', odabere se putanja gde + će se kreirati projekat i ukuca se ime novog projekta. + +\item U drugom polju ``Template'' ne treba da piše ništa. Ukoliko + postoji neki tekst, obrisati ga. + +\item Kliknuti na ``OK'' + +\item Iskočiće dijalog na kome piše da ne postoji fajl za editovanje, + kliknuti na ``OK'' da se on napravi. + +\item Pojavljuje se forma za kucanje programa, ukucati (na primer): + +\begin{minipage}{\columnwidth} +\begin{lstlisting}[style=codeblock] + MODULE Hello; + FROM InOut IMPORT WriteString,WriteLn; + BEGIN + WriteString("Hello World"); + WriteLn; + END Hello. +\end{lstlisting} +\end{minipage} + +\item Program se može pokrenuti na različite načine, pri čemu se + automatski prevodi: + + \begin{itemize} + + \item Klik na ``Run'' ikonicu u toolbaru (plavi čovečuljak koji trči) + + \item Meni Debug->Run + + \item Prečica Ctrl+F9 na tastaturi + + \end{itemize} + +\item Ako je sve u redu sa programom, treba da se pojavi novi terminal + u kome se ispisuje rezultat izvršavanja programa, u našem slučaju + jednostavna pozdravna poruka. +\end{itemize} + +Naravno moguće je i samo prevesti (kompajlirati) program, tako da se +samo prikažu greške (ako ih ima) i bez pokretanja programa: +\begin{itemize} +\item Klik na ``Compile'' ikonicu u toolbaru +\item Meni Tools->Compile +\item Prečica F9 na tastaturi +\end{itemize} + +Ukoliko u programu postoje greške, on neće biti pokrenut, već će se +dobiti lista grešaka u donjem delu prozora. Na primer ako obrišemo ``S'' +u četvrtom redu i probamo da pokrenemo program, taj red će biti +označen svetlo plavom bojom i dobićemo poruku: + +\kod{- Error in pro1.mod [4:5]: Undeclared identifier "Writeting"} + +Što znači da u četvrtom redu, kod petog karatkera postoji problem, da +identifikator nije deklarisan, što najčešće znači da ga nismo uvezli, +ili, kao u našem slučaju, da smo napravili grešku u kucanju. + +Stvar na koju isto treba obratiti pažnju je da se nekad greška +prijavljue nešto kasnije u tekstu nego što je napravljena. Na primer, +ako obrišemo ``;'' na kraju četvrtog reda i probamo da pokrenemo +program, peti red će biti označen svetlo plavom bojom i dobićemo +poruku: + +\kod{- Error in pro1.mod [5:5]: Expected symbol ";" } + +Ovo se desilo jer nedostaje tačka zarez na kraju četvrtog reda, ali će +kompajler probati da je traži i dalje, pa će tek na početku petog reda +prijaviti grešku. + +U spisku se takođe pojavljuje i upozorenje (Warning) o tome da se +uvezena komanda WriteString ne koristi nigde u programu. Često se +upozorenja mogu ignorisati, a pažnju uglavnom treba obraćati na +greške, odnosno poruke koje počinju sa ``Error''. + +Takođe se često dešava da su druge prijavljene greške posledica prve, +te je poželjno ponovo kompajlirati (ili pokretati) program posle svake +ispravljene greške. + +\paragraph{Napomena o template-ovima pri kreiranju projekta:} +Moguće je namestiti da u dijalogu za novi projekat drugo polje ``Template'' + uvek bude prazno. Potrebno je u tom istom dijalogu kliknuti na + ``Configure'', a potom isprazniti polje ``default template''. +\end{multicols} + +\end{document} diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..59e0615 --- /dev/null +++ b/todo.txt @@ -0,0 +1,203 @@ +-------------------------------------------------- +Aleksandar Sarac +mail1: +Starija verzija procedure Anuliraj bi mogla da ostane, ako bi se napravile +promene u Puta i PolinomNaN. +Na primer, ovo je kod mene radilo: + +PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom); +VAR + pomocni: Polinom; +BEGIN + Anuliraj(pr); + pomocni := NIL; + IF (p1 <> NIL) AND (p2 <> NIL) THEN + +Linija "pomocni := NIL;": bez nje je promenljiva "pomocni" imala neku +neobičnu vrednost s kojom se +procedura DisposePolinom bezveze prošetala memorijom, saplela se i oborila +program. + +Ovakva procedura PolinomNaN mi je radila: +PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL; + VAR rez: Polinom); +VAR + i: CARDINAL; + pom : Polinom; +BEGIN + IF n = 0 THEN + NEW(rez); + rez^.k := 1.0; + rez^.st := 0; + rez^.veza := NIL; +(* ELSIF n = 1 THEN + Kopiraj( p, rez );*) + ELSE + (*rez := p;*) + Kopiraj(p, rez); (* za n = 1 *) + FOR i := 2 TO n DO + Kopiraj(rez, pom); + (*Puta(rez, p, rez)*) + Puta(pom, p, rez); + Anuliraj(pom) + END + END +END PolinomNaN; + +mail2: +U proceduri Puta je deklarisana promenljiva pomocni, koja, izgleda, dobije +vrednost koja god se našla u memoriji u tom trenutku. Zatim se +pozove MonomPuta(p1, p2, pomocni); i na samom početku te procedure se +poziva Anuliraj. Ako se u memoriji našlo nešto, pa pomocni nije NIL, +DisposePolinom pokuša da oslobodi memoriju s ko zna kakvim vrednostima +pokazivača i padne program. Mislim da je to problem jer procedura "proradi" +čim se na samom početku izvrši pomocni := NIL. Čini mi se da je glavni +problem to što kompajler dozvoljava upotrebu neinicijalizovanih promenljiva. + +Isto, u proceduri Puta: poziva se MonomPuta(p1, p2, pomocni); u kojoj se +napravi novi polinom na koji pokazuje pomocni, pa se ubacuju monomi, ali se +ne oslobađa memorija. + +REPEAT + UbaciMonom(pomocni, pr); + pomocni := pomocni^.veza +UNTIL pomocni = NIL; + +Možda bi moglo, na primer, da se napiše procedura koja bi radila isto što +i pomocni := pomocni^.veza, ali bi i oslobađala memoriju: + +PROCEDURE AnulirajPrvi(VAR p : Polinom); +VAR + pom : Polinom; +BEGIN + IF p # NIL THEN + pom := p; + p := p^.veza; + DISPOSE(pom) + END +END AnulirajPrvi; + +pa bi kod ubacivanja monoma moglo da stoji: + +REPEAT + UbaciMonom(pomocni, pr); + (*pomocni := pomocni^.veza*) + AnulirajPrvi(pomocni) +UNTIL pomocni = NIL; + +doni: +zapravo bolje ovo poslednje sa SaberiNa i DisposePolinom +-------------------------------------------------- + +doni:srediti polinome jos malo + +doni: liste - dodati nesto gde se brise vise elemenata u istom +prolazu. + +vlada:dodati teoremu o pitagorinim trojkama i mozda jos +neka objasnjenja + +doni:ubaciti negde primer kako radi Compare za stringove + +---------------------------- +mils:mozda bi to dodatu funkciju SaberiNa +trebalo inkorporirati u zadatak 4.2 (jedan polinom manje sto se potrosnje +memorije tice i jedan Dispose manje sto se procesora tice). + +---------------------------- +da li dodati i druge slicne procedure osim SaberiNa? + +doni:diskuijom zakljuceno da je ovo valjda i dosta, tj da je dovoljno +za demonstraciju. +--------------------------- +StekTip i RedOpslTip umesto Stack i Queue + +doni:uradjeno +---------------------------- +Polinomi - redosled parametara jos malo unormaliti? kopija je nekako kontra? +optimizacije u vezi oslobadjanja memorije - Anuliraj bi mogao zvati Dispose +za svaki slucaj. Saberi i slicno bi isto mogli biti izmenjeni. +Mozda cak da bude SaberiNa(sab:Polinom; VAR rez:Polinom) pa da +sve bude u tom jednom, da se ne bi bacala memorija kad je sab(rez,sab,rez). + +doni:uradjeno + +---------------------- +Radacha: +- na vise mesta imamo niz naredbi: +Read(ch); +Write(ch); +Sve Write-ove treba pobrisati da bi kod imao smisla na XDS Moduli. + +- ponegde se javlja tip LONGCARD, pa se jos mixuje sa CARDINAL tako +sto se radi cast oblika LONGCARD(x), sto na XDS Moduli ne moze. +Valjalo bi sve LONGCARD-e izbaciti, posto su na XDS-u ionako isti +kao CARDINAL. + +doni:ovo je sredjeno +------------------------ +Igor Sarcevic - bug submit: (patched) +-------------- +Pozivom *PolinomNaN( p, 1 , rez )* procedura vraca *rez* koji je pokazivac +na strukturu na koju pokazuje *p* +* +* +greshka se nalazi u 12. redu poshto u sluchaju da je n = 1 for petlja ne +izvrshi ni jednom pa se stim ni ne kopira p u rez + +PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL; + VAR rez: Polinom); +VAR + i: CARDINAL; +BEGIN + IF n = 0 THEN + NEW(rez); + rez^.k := 1.0; + rez^.st := 0; + rez^.veza := NIL; + ELSE + *rez := p;* + FOR i := 2 TO n DO + Puta(rez, p, rez) + END + END; +END PolinomNaN; + + +jednostavan patch : + +PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL; + VAR rez: Polinom); +VAR + i: CARDINAL; +BEGIN + IF n = 0 THEN + NEW(rez); + rez^.k := 1.0; + rez^.st := 0; + rez^.veza := NIL; +* ELSIF n = 1 THEN* +* Kopiraj( rez, p );* + ELSE + rez := p; + FOR i := 2 TO n DO + Puta(rez, p, rez) + END + END; +END PolinomNaN; + + +mozda u sushtini nema smisla stepenovati na stepen 1 , ali recimo u +izvodjenju procedure kompozicija ima ( inache pochne program da brljavi kao +meni na vezbama ) + +doni:patchovano + +----------------------- +Radacha2: + +evo necega za PolinomL: u procedurama Unos i Deli posle poziva +procedure UbaciMonom treba ubaciti DISPOSE(novi), da ne curi memorija. + +doni:patchovano +----------------------- -- 2.17.1