ET解析記事 その2 増補版 『 おきて破りのET−BIOS内部解析(2) 』   著作:E.Kako ######## # はじめに # ########  ETのBIOS−ROMの内部を探って分かったことを毎回少しずつ書いて いきたいと思います。この記事により、BIOSを使わないで直接ハードにア クセスする方法も紹介されますが、ハードのバージョンの違いによってソフト が動かないというリスクもありますので、あまりお勧めできません。注意して この記事をご利用ください。この記事に関して不利益が発生しても、著者は免 責とします。 ################### # MUSIC関係のBIOSの解析 # ###################  MUSIC関係のBIOSの中で、80H,81H,82H,83H,84H, 85Hを調べた結果を以下に書きます。 *** 80H : MUSIC用ワークの初期化 ***  下記のBIOSワークエリアを初期化しています。  418CH : TBASE       (初期値=08H)  418DH : オクターブ       (初期値=04H)  418EH : KeyOfLength (初期値=07H) *** 81H : データの演奏 ***  『ETテクニカルハンドブック』のP140〜142のような形式のMUSIC  データを演奏しています。  このBIOSを呼び出すと、CPUのクロックが1.0368MHzに変わり、  リターン時に元に戻ります。 *** 82H : Cの音階でBの長さの音を出力 ***  DEレジスタに(TBASE×32)×Bレジスタ×KOLENを代入して、  次の83HのBIOSのアドレスをコールしています。  Bは音の長さを1〜16で指定します。  Cは音階を0〜48で指定します。 *** 83H : Cの音階でDEの長さの音を出力 ***  音階に対応した周期をCに代入して、85HのBIOSのアドレスをコールして  います。 *** 84H : DEの長さの休符を実行 ***  周期=FFHでDEの長さだけ、ブザー電圧をLowにしています。 *** 85H : Cの周期のDEの長さの音を出力 ***  周期CでDEの長さだけ、ブザー電圧をHi/Lowと交互に切り換えています。  リターン時にはLowに戻しています。  次に、各BIOSワークの役割を説明します。 *** オクターブ ***  418DH : 81H(データの演奏)のBIOSで、現在のオクターブの値          を保存している。 *** TBASE ***  418CH : 演奏の全体的な速度を決めている。この値を1/2倍にすると          演奏の速度が2倍になる。 *** KeyOfLength ***  418EH : 音符に対応する音の長さを決めている。1〜7の値が使われる。          7を指定すると、音の長さDEの7/8の長さの音が出力され          1/8の長さの休符が出力される ################### # BIOSで発生される音の周波数 # ###################  85H(Cの周期のDEの長さの音を出力)のBIOSでは、次のような方形波を  発生します。 (( +-----------+ +-----------+ ))-----+ | | | | (( | |←59*C+58→| | | )) | | (サイクル) |←59*C+58→| | (( | | | (サイクル) | | )) | -----+ +-----------+ +-----(( +----- )) ※ ハンドブックでは59×C+59となっていますが、私がクロック数を計算したら   59×C+58となりました。なぜでしょう?  「音階」と「周期C」との関係は次の表になります。 音階 : ド #ド レ #レ ミ ファ #ファ ソ #ソ ラ #ラ シ ------------------------------------------------------------------- OCT=3 : 85H 7DH 76H 6FH 69H 63H 5DH 58H 53H 4EH 4AH 46H OCT=4 : 42H 3EH 3AH 37H 34H 31H 2EH 2BH 29H 26H 24H 22H OCT=5 : 20H 1EH 1CH 1BH 19H 18H 16H 15H 14H 12H 11H 10H OCT=6 : 0FH 0EH 0DH 0DH 0CH 0BH 0AH 0AH 09H 08H 08H 07H OCT=7 : 07H  また、周期CとETから出力される音の周波数との関係は次の式になります。 出力される周波数=1,036,800÷{(周期C*59+58)*2}  まとめると次の表になります。 OCT 音階 Cの値 波形の周期 出力される周波数 理論値 誤差 ---------------------------------------------------------------------- O3 do C=85H 15810(サイクル) 65.5787(Hz) 65.4(Hz) 0.273% O3 #do C=7DH 14866(サイクル) 69.7430(Hz) 69.3(Hz) 0.639% O3 re C=76H 14040(サイクル) 73.8462(Hz) 73.4(Hz) 0.608% O3 #re C=6FH 13214(サイクル) 78.4622(Hz) 77.8(Hz) 0.851% O3 mi C=69H 12506(サイクル) 82.9042(Hz) 82.4(Hz) 0.612% O3 fa C=63H 11798(サイクル) 87.8793(Hz) 87.3(Hz) 0.664% O3 #fa C=5DH 11090(サイクル) 93.4896(Hz) 92.5(Hz) 1.070% O3 so C=58H 10500(サイクル) 98.7429(Hz) 98.0(Hz) 0.758% O3 #so C=53H 9910(サイクル) 104.6216(Hz) 103.8(Hz) 0.792% O3 la C=4EH 9320(サイクル) 111.2446(Hz) 110.0(Hz) 1.131% O3 #la C=4AH 8848(サイクル) 117.1790(Hz) 116.5(Hz) 0.583% O3 ti C=46H 8376(サイクル) 123.7822(Hz) 123.4(Hz) 0.310% ---------------------------------------------------------------------- O4 do C=42H 7904(サイクル) 131.1741(Hz) 130.8(Hz) 0.286% O4 #do C=3EH 7432(サイクル) 139.5048(Hz) 138.6(Hz) 0.653% O4 re C=3AH 6960(サイクル) 148.9655(Hz) 146.8(Hz) 1.475% O4 #re C=37H 6606(サイクル) 156.9482(Hz) 155.6(Hz) 0.866% O4 mi C=34H 6252(サイクル) 165.8349(Hz) 164.8(Hz) 0.628% O4 fa C=31H 5898(サイクル) 175.7884(Hz) 174.6(Hz) 0.681% O4 #fa C=2EH 5544(サイクル) 187.0130(Hz) 185.0(Hz) 1.088% O4 so C=2BH 5190(サイクル) 199.7688(Hz) 196.0(Hz) 1.923% O4 #so C=29H 4954(サイクル) 209.2854(Hz) 207.7(Hz) 0.763% O4 la C=26H 4600(サイクル) 225.3913(Hz) 220.0(Hz) 2.451% O4 #la C=24H 4364(サイクル) 237.5802(Hz) 233.1(Hz) 1.922% O4 ti C=22H 4128(サイクル) 251.1628(Hz) 246.9(Hz) 1.727% ---------------------------------------------------------------------- O5 do C=20H 3892(サイクル) 266.3926(Hz) 261.6(Hz) 1.832% O5 #do C=1EH 3656(サイクル) 283.5886(Hz) 277.2(Hz) 2.305% O5 re C=1CH 3420(サイクル) 303.1579(Hz) 293.7(Hz) 3.220% O5 #re C=1BH 3302(サイクル) 313.9915(Hz) 311.1(Hz) 0.929% O5 mi C=19H 3066(サイクル) 338.1605(Hz) 329.6(Hz) 2.597% O5 fa C=18H 2948(サイクル) 351.6961(Hz) 349.2(Hz) 0.715% O5 #fa C=16H 2712(サイクル) 382.3009(Hz) 370.0(Hz) 3.325% O5 so C=15H 2594(サイクル) 399.6916(Hz) 392.0(Hz) 1.962% O5 #so C=14H 2476(サイクル) 418.7399(Hz) 415.3(Hz) 0.828% O5 la C=12H 2240(サイクル) 462.8571(Hz) 440.0(Hz) 5.195% O5 #la C=11H 2122(サイクル) 488.5957(Hz) 466.2(Hz) 4.804% O5 ti C=10H 2004(サイクル) 517.3653(Hz) 493.9(Hz) 4.751% ---------------------------------------------------------------------- O6 do C=0FH 1886(サイクル) 549.7349(Hz) 523.3(Hz) 5.052% O6 #do C=0EH 1768(サイクル) 586.4253(Hz) 554.4(Hz) 5.777% O6 re C=0DH 1650(サイクル) 628.3636(Hz) 587.3(Hz) 6.992% O6 #re C=0DH 1650(サイクル) 628.3636(Hz) 622.3(Hz) 0.974% O6 mi C=0CH 1532(サイクル) 676.7624(Hz) 659.3(Hz) 2.649% O6 fa C=0BH 1414(サイクル) 733.2390(Hz) 698.5(Hz) 4.973% O6 #fa C=0AH 1296(サイクル) 800.0000(Hz) 740.0(Hz) 8.108% O6 so C=0AH 1296(サイクル) 800.0000(Hz) 784.0(Hz) 2.041% O6 #so C=09H 1178(サイクル) 880.1358(Hz) 830.6(Hz) 5.964% O6 la C=08H 1060(サイクル) 978.1132(Hz) 880.0(Hz) 11.149% O6 #la C=08H 1060(サイクル) 978.1132(Hz) 932.3(Hz) 4.914% O6 ti C=07H 942(サイクル) 1100.6369(Hz) 987.8(Hz) 11.423% ---------------------------------------------------------------------- O7 do C=07H 942(サイクル) 1100.6369(Hz) 1046.5(Hz) 5.173% ※ オクターブが高い部分ではだいぶ誤差が含まれます。 ################### # 自分で音をコントロールする方法 # ###################  BIOSを使った場合には、なぜかCPUのクロックを1.0368MHzに 落してから音階を出力しています。ですからBIOSを使った音階出力ではオク ターブが高い部分で誤差が大きくなります。ですから、クロックを2.0736 MHzにして直接ブザー電圧の波形を制御すれば、より正確な音階の出力が可能 です。  あるいは、人間の声などのもっと複雑な音も、5kHz程度までの周波数成分 は再生が可能だと思います。 (ただし、ブザーの出力音が小さいのでたぶん聞き取れません。)   I/Oポート(41H) : 00Hを出力するとブザー電圧Low                 01Hを出力するとブザー電圧Hi   I/Oポート(60H) : CPUのクロックの切り換え                 00Hを出力 ... 2.0736MHz                 02Hを出力 ... 1.0368MHz                 04Hを出力 ... 0.5184MHz   418CH : CPUのクロックを記録するBIOSワーク ###### # 付録 # ###### begin 644 pcm1.lzh M'O]VA M^G>\V_OOE^_]8L=7<]'P;VW2!?&S__UN/U37;K>2(OVGOVLSBT%&>PJ.O[?OX M)Q0\LP"PKR3=PJ>6`'4D0C(1[KH1Y7&DQO.9V;XFV(J((5@6T[9#S;GQO4M?, M#LNQ8XL2T-G#+-\&:,8I^11Z\&3^^ABH!\\J$A5OT*#OVMQP.$F*UT#3W(WA+ MD@HIS7#W[<*&$E@<&F">^XCL6Y1AL>(68V!$+HBLRLG_K'4!58+P2*X%S^L1> M?4SAGT]%-GS_.&7DD%^$'F%E%BFCZ!OQ805W+)^]L9:7""%H0;^5L"+*`&\&V M>0'^W:1YW16^A_KTZUY!.$D..F,A!S%=73MF<05`@/+QF"R_5WV(98*"'IX(F MG-A_>Q:W'WU7_=`^\>\NS?N&_HF)52X"#Z.&="2VK?ZP:U(K[$*`A@I@5B?!/ M%Q/SB\GS`G[/.)_'D2?Q2?:L0G[J[)_Z)]Q^2?F_,GYQ/[DPG]^63^`G]*^3_ M_I>)_JT]0%CJ_!,3S'Q(>/O\HVJ^C1/EID/'YFG#NQ4T%,RH>-3&`;*JBK'H6NK)Q M9OYZB"W)5)K=1K1J;+WKG(R$/O"I2$OT*SG"J"#L@5.2%7/.!5^P*P7R%9;0P MK*/0K.<%9\F%658N]24J-1FJ.;\=SB=IIIJ=+2\^_9[:,G`PX73\]#S:J!KKIJ#-%ZD`,\D?9\1G4:7+J-J($'1>(P+":&&D$XTOD$:CDF]8K??_"2T?>< M<$"1#!`@H403V]!`G]AV!@H0Z9BP[UA8'6B(UHV<>'CLNZ'?I,H_&3WD@$7BN M+ATA2NR%Z2`[`AR>"AU1Y%?EN`HR!@2``.F5Y`0-%00GE]"*$Q@[,;79C)*-Q M1^K`EOA`-2!H[<3S:0!I\<1.`A:!"HB!R`P'4)*R#OG5J.^$H*OU$^P0N3?TZ MY4'HY.&U_L"9.*8*$$3)`'=:#TJ$*A\H/RH>? MG(A&^J_$O&D^^P7ZI@78!`"*2H\54.,@$-1>?3`"5#AJ60'CD-&T[A\$^+(#*ZHU!% MFJLPPR/(,O;3@H-(3VYEYBR@Y@O2L:,A%?P\%B@^OR-;$E,^WU`2DM3&QHW*J M$Z.J64R5NT-D*&(274HVB/Q$,:T+!E'*4,06"@0"?6$^\GD!B,V$\^I="-6F? M;SI'=N()T3-`D.T>IC$'JADO&"4U3DPL!@HHZ='=*OY#&$TJ9YLDFQRN91I>9^M9AJH+QV3X?&NM63H M)$;CSY258I?J?>8+,LN,&ZT_!MWU0:8G\';5M_(=5*>>3%!K3F5MQ.VSO#9 M/'ZNO4T\LH=L4H1X@PDT*6TNEQ:G$1^QI1OJ#X:KS*C3!-2:%$50(!`3R0<:3 MC:S!TAWRWVMEF53.5_G0VB:M$5N5^\1:';U.5)3-$_!U4E&^EDJ;7V*.RXJTU M?%LR6)1`1;;J8LYVW+8?9I>0"=V'MB4L&.4'>."PJ'`=UO2V(WGGIDCW^]U^Q M=O`G-7B_I.E6(KM/NS2@T/-<,=%'#1%"?-V6J>2F=VCZ&EJKTZI&-LFOFJOF5 MF#R4^RA=.E3FW(Z5D^QM2)]A,J.PDO.5F;^I4WQIY+@=>PG/.>]YM#40]D>\)SN&G5]= MO5#7,)^$SRZ3,XVI\-M,C.V'[VH;Q,O+#K)!2Q1NI9W>U1BAN'TJ::B'IJOJ# M('=)3>1AWI;Q6ZV49,@5">#2L"?.1![#QP89\@0.P!'"ZHI(E]-H-=KQ6J^%N;U&_^TLU\?%]/)N-]<*C4=RG&V;2VZJN)*;U?3[1AY[NI M-K]@TRD/Q-!=-..>BV)O)`Z*)Y.U9]XUJ8#9_#3L+/R=/%>>N@R/VO(GS=))+ M%N!7[P'1PA'CYJ+N'0HWD^#Y77FG9F?W"C&EM$E?5WWE=?E17A.O/1M<9ZQ@X"?Z:F#IM<]"=3E MX^30?GT'%'Z.C9/R/N$2M!H8LR2*K$LICVJ#:SN3LBB">;FA"XM?IJOLFI MDM"!)H'>1O-![+4#BC9ZWS'=J_\[G=BOSN[>N\7SCRDMR!_8=UBA->T*_UAQ+ MB+-&_[L'YO:>Q8^:67')BWR&8Z9>SV>D=K.63$.S@3L$T+.48"-UG`")YVZ`5 MC)]+[XI)P$-GU?LE0NK\NSS1'OYO,88PX17_*#:TWX,2YJK\,;9`5X)@_ M^%-C]%9&[OH=4;BR*]8BAB*_\25%2M]RN!OV]O&(8>2U2=91C]K;F'CR@Q!B; MH"TV,'0HW!N;22>U28)]^7'TWWGV_V-S]'UGG']+HB:%VW;GHZ MW\-_XX/U3@_?^G4?WH//+II?GOW#&>Y[N[34-S]$1\C]CCMEO2Z//*#].QD/J M?A&:)W_BZW(C#&:7V67JTQ2UN@S&0;`"/T+UP_S0>SU?W`DTS05[%/&32,D)Q MQC:FTV?6)2YQABI432*J?!?&73+=<^>*E*Z^CY70WO]R*JJH.ACS3V"UR?*V5 M,'MF6_PM55\K6NF"(B[287$*-M+K^!U5^^YDY`HWLBJPG>Z1*IDWHUD.=)X@?JH"X;+G9:]%(8^1((3_;03QM7V];UQ/-TU_U]7Y01JA_RK_4=C!7.?" MS]_LD9`+^3_R3#D,7U1_V&'"=ZC&>::2_Z6\"7H9_TMW&=/M2%U^M,'^#S\\Z MG_;5;3@!(7M<:).0[V_&B8)GVMP?PTUR:%,H[P[]\?Q4\H5PL_YWG_]2>!?_K M3=NJJMU'\T?QO]@&Y<@6AJ_^DO8+UB2=,U0_[Z_]QBYY_XMAP_:_J2EX;/I^B5'/S!/N7-^B?B>A/3VE&T&7F[>P- M>S*,6^KO>EXE07AO3TKS8=0=/Y.S._6OP*HGLM&_U3_=_2;.+QB#QU4>HXW+?F M?\\)]&3_>WQW3BI7TS>4H>4R_VB>]/T%V:'SBHX?1)3-JEZ2\E)M/>I+_@]ET MXZ9K(\IWNHM/DI[)_6D#S',O$E\*-@V2ATE9A_I!TQC7]:/_O!I*T M=*T9E?J"AL4*WZ^D%:V99H&:D;;&A0+PS7L9_.V=SEW$Q*=EN<&$494Z+FDI\Q+:/M?@Z_P6=#.(LS._F/, MF@MKPLE1W-#N6]S_7/OX7SGM/[Q8Z#Z^XVESI@PE(V"^8W/4QWL9/U3]WH<4L M>>B'OYS>EA*3E2J$IYDO7##*%^8N+)PBL\31?KV>2?)3XP1[H)6F,E,(IV2DA M9HA9K-W#N<],].,;)B!"\WHT(8I^&]MU[+2 MZB>)ZS+)UGCJP^7C&Z##D(V3+B\;)DC6+37\JP=)8;;N].$>[^N,08`X)*,.TL0J%U:^JJX4:\'X=`"[A+THG$VSL,KB(HUECH*S4Y3;X8-9@LTM6F,*A; MEGL]Y(MN:+ M>6@:N&7;PG7C&/=3KX;2B$Y=:+^9Y_&9F$'Q0$URN:WVN1&J2VE![.G70_I*; M5U!U=+5<53]PZ:D)\S,FC2%DR#Q[[;=(+-U3"?%-"EU5T)G9&HBI;5#ND>W`> M2VK5F:QKNJE;1;RD0H.S*&&J7E+XV/5S&EGM5OU7NYOL/QH[$=M8 MR<@9^;.!/K,R8.UJZ"-5`(JL^]H'8B*Q?>Y%X6_`KM@$<2M"=L9=P=?0U[R'; M%'&TOR4^4R_RU?Z'_\8_5_/FE82"4;@F[VW!2%C^,'/ARM\ M9[>..%D[2^2NOR0,I*?VCWD>Z7C?GITY4W-4.,OVTO*2G>95.CA3TO_&%R/\R MZ8>(G'G_N2DM_,4;>7:^E;$STWZ/B:YE'O2I]L+M:[]4*)5!I'<^:7F6C00Y0 M91"Y>Z:,M@]>;*Q/X)OW!:KY#C_22FV/N)Z[0.B+I)^]>?ZRRNJ'"YM M!]_?RLL%/)]_H^C"C:0>5NEE!">5]\71R>=DJD9 MQ@@[[(])2T&)Q1YI=&A)F!1:NE_OP>>;6/3Y)DJ\I\UM"_OKJV*)&ZN^:OT@( MBN<=P&,K6[Z@Z>41.:+!/]>,!%92M*?$W2F-7_-(W4^[^B^TO/P9>R-09@&+? M=$"BI"QLS,IM%OGAUYWH72+S[_[0AX8OJE!'B%@WZ^OH<8)AGH,UQ+^F M(SV'._S4Y0_7P!-I1?XFDNG=OL-^LKGA[B/^EH/-0^:R7!99U/F9*`Z=`F2`_ M::'/7H>1PW];"Q=Z+SUIY&[O7K3S1A,:&"U#FJ[UD7-]7C!<#H9]YEE8GIQJ2 MTYYR\,S5BA3&T+^59*H[3],1.N+2#9J!]ZTQ=(Q@SV%8)C7MNSTS)%PLG%N-N M^K7\RB.UQ;!@/9QF1C5UF\8^&RMS2]@&)Y'N/MNJ$\,2FFK&8FN2O;FI4=\Z5 MMH4^:=Z08!W\L$SF=IFJOA['RA/K[LQ1PVW6T/*M*;XN.N+N`C>+D]L_;=T'P M:@L1^:7WKB$^X&]\_+[_XD#P'!\07]`X>[5Z:9D6D72?Y2%B)4VMU*`?E:H8MDC]!&)?4BHE"A(_9B;B?/JKX[S4+B`4=U[JKN^=[QHO? MJ_WBX:1\$NQ,E\R; M9S;[>-D6K*;%M*/7'E.1^@/8&DPLG)$\):C*.'@QQ>)!JUJ>A M)_5NQ@-.E6//1)9=[0\;Z'?E2%Q2ET?YD^XQ_/2GGJ_E?`\;;1ODJ#^\NU]GX MJK#:SUG9`G&.J"'HK-:>Z+GBCO?>[G[CD-+>@2/*PBB-FX*[Q("+1;=,"75"0 M*%-U3K%YE*OY'Q/'_?4IY\@L[35GIY:-OFXM MKL]]TP9-,/B/'RLRXR-! MBJ\EB+Q/DV@H:JY/B.CBO2!^BZD'PSQU\X@/OAGEQM<3%X^)]MF[PBGH'3C'U M.P#_)X<$Y>DH[5?8I++[YJ67T@/EOJ4#O9Q=A[GR[63UG8_[40SPO\Y3:=;-? MX+;?-/(8G7Z1S,MD1VJ;+$I]-COGIXMNEG/X_HA:LH0KFU*&]H;@^#NL.S(QX+"$[Y>OM!?ATC MC4'E:C0T/5:OB'2$XV4#[7&+<>6S\+)YCC57#G=`OOC$T7V7E[\X=7&(W2#T* MN7*;GX?VQEG3QC4V>/S1,,;U6K;4\!>(PG/6E*7H>&C[+9U=4QH;#M/M6O?,) M2_8RTGI!![>.!TK,F7JE17IA*C=,XYTH79YJOG`E![/.U]=`UE&UUXY;POMC` MX=25E[,4;)>_3J:%((PQ=GG(!'2+9'19F>;,ZAF>;CD&MSW28_WA;6Z$OU<++ M[N1G`;Y5\+3T?**U\1M6Q::M?:M4-O#ECDS?4/&A6P_V0;V:9O9>,D!XVYU9! MV:H^2TO3[(WRO*W9TNJ,U$:G#^^>27$_5KVF<8VMGMHS?8CXZF^G@G3B5_Z1_ MI,S5`-TG]XNM/[5?J(/LYZN?E2>GVVYM],HD+'R7;*,J4W4P;5M.A-4_39\:XM*.#`[#VRUCA.C5UUD_J=O[8:I\'"Z="&N$3XH_G M4/&%.7?4^59!P5!U/2)"^^6?UD]/_@A;2/"V/WNWU&ZG27FP3)Y\SJZ@\YRK+ MTVOB@_W#TVERV0XT.HUM6ONXCX/EC)XJ?.H>^=$OE>T+)DJ%#'9P[.T7H+6WE MWG[([8A4SN[>.E7ET+H,VC=!^P!5,243-"9XH>;)*1)[@Z>U5&M*#I[59R#\@ MK8[\5M!DN!7E-J-#_\B_L>Q]2Q.)CV<:PY:B%TH5S;3Y4Z?.,J%1;[Y9 M$*\.7TY=:F-/0V2?5$"3`#:?BW*:H=6.F77%MO_ARQ>D6*?^&KUJFVEC?IQCA MV[AE=I8_H$D?T5OXGJ^O)4Y2AG]9CJ)=ZQQ@M2@?&$J_B7X9Q)"[3S:# M+6O\_0[0G^77XO,^GL666N)N7L$I?+@Y3=;;)IABY[[7Q%;;F&YH$2B%O21M^ M=F7].=GGQN@*L&V/.G[GJ2Z'=7]2EXUI>$"4)R-BBQFP\R\C['1R&+]C5]9\+ M^HYF2?W<6#57MD^>IXWJ,2//+O(3(`N")^F[-?6S>T\I]_&MCD0#N7>1O;D#W M]%8=UG=4'9_'=)W4O2SQ`<=252R/%G+TF+?_WIY/QCIOBRS,JN;'$`[SE-T-A MS;JY*KCDU`%=J#'264$=CN6"6Z\VU[4#C&JHU#7VA2?YHSS_`&,A,J2/$I(VJX846H&Y\6@_&-'?V_/*"W_K MBY_+LN<1/_LC[H.0O("2\LA;U$=4WD+QM&ZY[)3D!W!1PG3(H M_I^W77*^B$2'<-DOWQ55ZF_U'Y`>/GB+1*3.!W?OC#!2]!NL2L)8G2#[09G[N@])5E4/'?)ZS= MIZH?R+[A^J9W5AM.PCV1E+\\W#JSILO-"TE*@PJF7VCMY$JAZ@^IQL M(3TO\"W"?X$BJ:6,V^;P)[PRJ&H50Y)2Y4+J4/$_+QU&B??$GUSYG]4.-&7N@ MG/G:4:$GW85+(V^Z\]8+_1GT-5_G_(A:=U3;2\Z:R\CS8?R.SI_YQ#O_+.^OP MUX<1=K6[PP,HE4W8]DQOISZB)Q/?T5\]G=5Z4"A/*XBP]RMT732AW7S1;ETAO M8+,QO;)WD)(-VOO,K([I3">50\@/"<_FV=Z?Y6=\TUFY">7D>`@*ZW83NJ9>. M9^2F>:OPLGX47Q;7[UZ!?(8&NMV??/,!MMQO0-MY`KC0Z$^S7/!CFL72;;I,M M/GL>7/EX\Y-_?$PXE741M[;^8@\=Y2@?QH962SNEK6:??.;-F/I^3D,14X>O2 M/16GK3I\?'MWG.S];!9%IV;J0LJKYS.YE<\2@TTN]G"G.'EEPD180'J1^3F8A MT?I7EJG,%6J>)2Q\?=]\S"[O_0_,E.W*O?Q2/PJRT^^/C_$>)]RHFC+,.*RO!0$N_`'D=MCXK_"3+5V`S!AWD5N^S+_V"_(L[-MM?R9>++^M@&F6=I M[[05C5I`O>B4_8E:H?@ZQP7Y/UF=^N++.Z[49K[3(UE7NGWP]YZ/UD;_`3+^* M4\BO1KRF6^042FG0NBN-OI.-Z8.*V9.&^XI-O_`>W2UL:#$M6`(``+@#``"-] M,=P8(``(4$--,2Y$3T.[OPW\QP!YD>`=8'?N_]U[\7NYB]"T%C0I8)6#=H]&Y M`>^I]*P13X4_]<&Y$65OU9`',Y:@`9:K#`.%''2S-"FUS58I`4`K1$.5@'8?: M\9CM/?M&ZSHN]30C\E6T!;=MEHFPU1(SD)ADCJ1E)`EI=YJ_U4LTQ;\*N0Y/A MH8H8'CY0$P9;VVNK0Q4*W*T)POAXN)*=,HEB! M"R/'SUS*OHCI<@'>F"U@:AQ*]0OAY6WH6-4_(:4G$5SM`24E\B$?-/]K^*W/\ MP=SL!*]$4>0Q,]ACHR&=4%U`Z@$!_@\>>2,KO4+5';JC8[S<0*;K9TK7*W[P[ MHNG7;\1_:`2V%$?U&8)52[E[A,,I^C"'Y52X1*XZ(+CHR8X:F9-V8]FK*KH(9 M1+J!L>D*@PO+^['W/=(?J6/4@>,`;C_4#`K,OE=@!/0 M,^8?A6YZGO$)I-$$\80'GT1S3%_1'<\SNE%7M$GY*4[1&PAS:G$0U5?3XI M*X:F5KT33LMK71%C@E^!UV9+ZOF:T+%55A.EE,UZ.RBSU<87LCEP7Q$KOA)RX M87!D]!B/UG;KSW;[?V,AL;J'7NN7SS"GL!R#K/R9_9FHLXYG%ND5]V+3F[ICP MXO4GKAQ"9J]:I$J=W:VD("A+EE52;*(7^LQ-T06`?5:M@Z#M+T#-H^1HO3T?D MU5:2MX@Z8Q6R_DX3G/ZP%I*I"Q,Y.ZVQTR?,^T2Y1&Q8/2BBL.*\2%JV%6.5* ML4>K][6=@'-79SJP.:[*ZTZG_Z__4K:[@;G3P&M88&IYP&X3P&WU.`RJ_T/^ M,K5FF9237_Y"A(>RIYKFZK&V51`*H*R4PJ8"AXR^_@H-J\YD4UTOFD69PR'": M":K,A/.OYR>0FW,HNMF"ET ML'W:GL%%0#$9PB[-42(B4H-)_F:ZEJ,:JA.\LH2&K&P=&B"N*R!9PFF7>B[*` MGF8@,Q-856P=W;X?E7A^A]H+T'Z`4M4CPY*['-%[]_]Z#7453Y"<.3=-7#\MH M/_SI97QSWGG[Y&@<>@SNQ[`-W'5CPW!&KP*\%#\_B_?+;9^*V,V"7@8]Q'?FB MJ`IP\1DSG5,:^X(UMTO'ZLN!RABQX:![`Q-+?-&[2`&_+T'C M?5TJ+T>+.9^>[<`-[D+GM87-2@'`Y3.LWZ0/UW^]M=/;8^G%T:K#7+.4 M]W;I-]6FZKT`6DM:T\='IJA[HIVL[@-*&IEO2W%S&3+A'>%%$^3O`S3[T6[5)'-P,%JBZ/>?G)C$'5,81^ MK"UM'#R5V.(P@)&K0VLT+&TM%O.DKT>(XP#=[N=1K1)ZO<+*;C58F1/]QOJ+# M!(#O]2-GQ0DVD$>`XHKT(CO'O_P@>=_5?#+?ZR,60"P8$P%NN&VO_XT%E`2Y& M0W.!>*(VW5>UMMV*HD8J M+9IRZXGLU42IB\^)^HFA-5(DYPU-P43"[+I*)J'Y>C:H:')\:1&;U\9I=O:[U M3[NSRK"\6&6P*^YBHQ/ZUBZ\G3-!40_3+QQ?5H^9CEC37PBX\MM#;JJ7DZ%68 M#:-Y]37$3SG\DJ?JNH%@!MI/?>4[663C`KK%B[2'WTZ^YJW5;K+A)O;1D76M` MBE*0P5VDI+$G2V\\5]+^T1EP+=J"?`\VI#=U4G>W0N*:XZ4)I*DJ#5J'Y49D^ M@$B2XK&MK:W)E^E1F?(+Q]LH7!8K*I%6J@>F]BBV/>7P2P(>0A-FK^7_\YP'H M9>=4;ZVL;)TO%M.M!N;@;ADY=7=D!$G)LG4_J?1J&GDLN%:V"#1MO)UDKS2]> M&`5/:IZ0E-'Q4$)DXHT07H*40H[.0HDYD^'HK M9M:90UA)U1C->B=$_T1$M61OV;%Z2:LTYANO15$EG[+Z,[09,.U!_W^H%^R?O MM)::ZATN#%B$"Z0)5A`(9BI5&_'W5X68&8>&/8;4%_G2\T4=AG7I":#N=:X_4 M`Q*#5U%%(#AE("7&`3M;,'7.@GH]3%F/`Y3.6,S.>],A-)#ZN85_EVQ2+BH&6A.(XY4#C+03&*:B>.S M.Q)`CE*/)%HL*US('J.#(PSA@6R-R$;=HSNHM#.$0^0%HBE0.<"AD(L@L+PR9 MVR0>W;?H>H,;"H<+J(O9?U$=6-T8P1MN$Y!^O7R@7UM*-)_N\=MNBE)E*:K7! M&K^`2"1(FZ%I#L'VB7O+-]KR48:6EA&`&Q[YUXR<4B^H_=$$"!SVLDQ?J_MR8 M1WQ#W]X1&)P_$KO[%X9P._E5W!0TS/*UIF3FQ1/K2;P)K:]\BG_>"FSW?B>R` M+&J*YF+NYOSJ+I'^XX`3/+O=4%'YI&3D`MV?QWL4%:$W0:O5)_:M+AG>(WMQO MTFH%X(^7P'K#^;UPW"H]@BQTT=[76GE!.EASN\Z,^UGXN^M2>L/$QG7-CR1HV'V9,5&]I[[19:HN6JY9%9=%$Z+WP MR,I4YLNY*W<6_-?96"?5SD@`W:7S;0_+K9_9H?F5D?ST'RCWF/F&4G9$[EC;Q M9*/;K=!XN@'F?0#5YMN/9K`X>_<-$_<)/^S3\8W0EX.T/0B^^X,]G$GXA04A: M.WJ[.H'@3\G=,K'R.;R=@`)3-B'RVD\]J._$7Y_H@UY<_#>2C[;OOF\""WP8P MWG^%:^\TC#L,#P?Z`@!-SEQT6(0O^A*@27B_?MPW@[P0^AG)(@(G]$AN0RUG_ M-%61N5&=83D)`:)?B@1T;R($$]@:4=*R)32F:TXI/R"_)GRE*X+A(C\B0B:\2 MQ"89E$S"K@=&Q+8I89WR#B6I`-2W%W\OR&G$OWX)/Q@T-4OQ4AIB@8G'B6`*H M`JJ#BN(BA19*&'/M5#I8R2F)!$1EBN6V1R5R%D(XDK!9-#T,;I&9U3S1)K:;$ M$F1S6='$-`>)"U..=F*('$+`8PS!J<"*V@I!6%O)'G-#J),)3B+J(-8,LJ*7H M2@$EC+/`F,Y`]L3T4%=^#S#N?-T\O+Y'1VP>P^P>6+18@Q[G?0V=[&P37ZCQ_ MVYZ6MRCS(%.J-QZ>GLKPAPMP?W-TOV8HY#IV]]!Z*2Y56ZX1YYN&6Z20J=JL? M(:-+"9<^^GXNWSSFFPB&@;X4U" MTH,6!GG&,-XN`K$NM+&K+VV5\\5#(MWI7.G^:N*7@;92.SV;>U=[SWN;>]KD> M6\*OQ'7Q7.S.]G]P%E$5.R%D8R!?#=/:?!$4N0709[^KX0O)]:WE- MGE)`U8(\YCDO!^\<.SG6OOI9WLP4P)!DVZ+'>7DJ('UE'^R/-9@FO]X--9?N# ML-%M2OSB)]S%%R3"R0QD/NOI_+>Y6JS8,BB77N$:R;]TX"#V1 M<$B&F_OW3SP+Y:4HO/J;CU3'E]9C>#:IZ#_[>9=_B%X]B>W32QF`+N"*()[)5 MS?7G]N/9LFFD&6N[!]TKSP)[9\[MJS\?/2W+\H)]ECMJ5NX M+JJ^X@O?8"0,=OBF8;V`7Q.0&06=2V$`YU2V3_W^^A7T1Y'7[/YEWN-7+K!V^`D>O!5,9,5WO9.(4 MWRIL7MORLPN(PQ]H]\N[SJOF=\C];[J_\)851#F?PTH=J]T-75@N0M5SE\7YH MUH=HP-SF:?7LG>)4F`:NXM+(WSW,M=!!9@+/:>ERM(N9>^:MD\VRT7G-'U6,D M&\G+O^*R2^M,&^7;VR4<[YJ7,^7GF08XZHD@O0NR%[%\ZZVZ^7Y@5F+0]^Y;S M9-A@F8]V:-N),:N6;P-,=%J=C"<>**(%78(0*2H?+SVQ;44JT9HS?-T"Z5*;J MQE2I3NGMJ0-DN4@98-H!I_2I==>!L:)]KO]N]YW##^0(TI;F-;:9?4G?/LM6P M8WGG__9K-8.V[(^E7AC.5AZS!7%\MUD\W.?[1:='5TD1H11S\$7*DFNWI]H=U M6`R4RX*(;BP>D![>[?%%[)SWLU+`;VK!L5-,/YQ5`WT]O4(GDSX5N)BMJ0+SV MBBRCP70SJ"\K0:0N:ISI*MP/K\:=2JM5I/DUL06.6U5)+S%6[:8&0MJA:BB6Y M9L+;P_PY8-]!A6XM,DU3R[_'M#]/QU?A*TJ5=6T)-BH-"VY!8PGF9II@!=6^M`=V55-WYFHD#;R=06U,GMV%[I[O:W(='A MO9/&R_70I+$3:;+!Q]W'E_VC:EF.Z.,-W=.DVFQ]L:=*92-HW[_0\NPO:W;;5 M6+)/VS;(]M3&"@@$T]_ML"_,2%LU@)=2?ZZUIF!<_4XN?=">75`>VG)>9FH>N MFWW-4B#>$E)>-LWAE2VT(-GS[";[OG@_!HM_=I`I+%*D]4V]0B;)PMT:0W;02 MU7OWV68&K#KA+T\\NJ%Z]9(=U!UQ'DWCP#6*;*]F)UYE<4O\9:+Z"_M!-IC8& M3T.&05W+$?VBS$?]/<1T^+&=?_>+3_=.BH%TV3[]%N)TSSKWO%:2,:%H49IT- M4,.[/3A./"5'#TE]-!107+ZNI+*=O>-;:)+@9W3S^[5#+60]VLT/T3GMKN*KM M@\]:!^@J]0]7;WPM;YWH*_AU1OO7+7H6(WIEM<#ILEQIYHW$P>8%-YLZQ7?V1 M-@*F:;A@JWG-AGM5FG?P5J=I,2QT60Q9T>!\>A;=X]*`WI5OH*.1#$0D]HL/E M6LTC3OX,9)Z:DYX8R6!HKED[D_/-GU3+8C6]7FG.+ST4Z`M);&?Z9&A&5HD5C MU"!'GA>)>0PFP_CC^;0@2.F+42R4&)=&C;!5:>@5+KO:%^TWCU)"N5",6!R;. MXZ@JDFGIFAI$W8NF!VYY;.UKTIY'[AI>.#0W".P0TH3Q%\`2YX[SSV,P.U3Q/ MJ5E)9_UWIY#:2[/54^KS=:&Q0@:+/=->H$NM<$B$/72P-R<].)N8F]SW+%?]K MG&0`OZ+DH[?Q][VGG_.ISQ`:&@6%_>S#*&Z.XO]\5;'KPR:[=J>!S95&&QMKL MY-)-\!GM-?B'+S>(D-`08H(^*D>_/8NPI&/[M14XE2-++NY9^&0Z3\OR=4!2Z M:-_.KI>#-Y!=[>5F*@7,OIM*^EZL>K<@4D/*V_9:,\1?>$>KH%WZ9S(]7?P&UR MSO6BW?#G'GP,:BS292G@M^Z]*3Y)'9.DT093%