diff --git a/patchset/Custer/4-amphibian-dna.patch b/patchset/Custer/4-amphibian-dna.patch index 4d9d252..c810e2d 100644 --- a/patchset/Custer/4-amphibian-dna.patch +++ b/patchset/Custer/4-amphibian-dna.patch @@ -1399,6 +1399,97 @@ new file mode 100644 @@ -0,0 +1 @@ +OBJ MPS \ No newline at end of file +diff --git a/AmphibianDNA/DiskCache.a.o b/AmphibianDNA/DiskCache.a.o +new file mode 100644 +index 0000000000000000000000000000000000000000..a7898ee690479e128c496cb438402d33ff4a79e9 +GIT binary patch +literal 6190 +zcmcIoeQ;A(c0ZCH^0QEg@MygX^_VN6Rh}JTWMf>#WvC>7M3QA;B(JkgJK@P#?-}B? +z6~`u?)EgXPSSL$6Y=+M4ZZjF0$uy9X)Z6T`gk~6%rYR71OUO25lZ*{1E1W=BhIKP8 +zajpLDd$O=;`bRrk&FG!`?#DU5d%h)ufs7`i&^P0;NW7(~ku@hax3bn?1KXTre7JTk +zYl_7po7>rg!6XYeC7SMHjQw#HlZ3EkProF5= +z5^K8szHs(FACt5zR@AfR*f*15O;BOAPG7CVYRA%L;46IE`%@Vf^fmYj=YsmdMt<;t +zruI;5b3@DR#RiRQV*}^9c(uTg4;GkK7tYl*YhX9j_;9c_m}ptbwx(GVx}ioxyJUR{ +z;{xZJ0_XMBI_KI2&cO`@-b>GRK%IU4?WxY5G~3qq?Qf@h2kP0MKGrwbzb*aPcQz;M +z!_CS1hSaw1bX95*dq2PNhFU*>Cz@gf-h9V>>#Lje)h4cw#mh@YFDPXFZNB%{XeS$L +zaI!rSOolr`v6kebbzN=)m)o&)!&md(aQke7uFYnyP3>s223zC4^zi>pCykoQ>wH}0 +z8voxZ`&yrN^}6-9ul_&rU(jo9;qJ9T9a|&ErUgWzG19hZSyN4&=G`4j)|V<~f%ESd +zj@DIcu>6`QXeS>`EaF_JyMn(~bA=`AU(LC$z`4<1%YC6aR13_Jc%)rB&6k&c{x`-# +zwwt2U#fAK{oCj4tG^~q#V)-Hi78itDZfA_;i?WBf5c0)^;4dyjtEHnb6c<9FxDXT; +zO^)W|%NO~xRUhjHE-o0va@#igB-eF*k`HN_NT=yk5fQDFL~*4L16t=VqWIw2)#2=u +zL-hvFkZHJv`s!Rmrnvi2o841wBe9wcHlgF46cv@KL_N_SvZ-BBzv*#B6uneLcBKPr +zWwKprk=oyQR}KI48kH$Cm=ope;xaNQW;{vt`3(IukXu*uBx$qu$||aT{U4Q*@m{J? +ztkKuVtC*`ccBhivDKh!1R>vmGpIld-0Y0D%QckFxicrr-!sku>4DI8s^3Y& +z1myOwMsEHSB_KUQLW;}-z;(PLN@W!dB;C_YUyBC&-1j_c6R5P}QCkf;@T@0q#&&e1 +z%PL+YGuiRPE#G)wEn$$BI7DSBDn7-mGb}T3#8GYoui48abr)zdx&re7)=FEou> +zI0t10?XJjy`b)q*!jZLoO7%JhRmd3S +z9ipGirsv@ya7)!89)YH9>Pw6Hnr_JlxZW$esZ6ti1xV^OJPfBysu`!uq}_=D374`a +zOdHq4D3GDp6u|jI; +zlAAI8zOs?y^x1TrKxmH-hOg{*>;zZw1dqwQZ +zl56;AXR&0+9(f{nd^fzw_~BE@J=s?g8$^4doBtNqkY|ezaw*ZE8bIXv)He7tgG_iL +z;yJ{;WE~$(*XL2xecR{}*w<(k0ZCj6xbe4(|w6s=P0e>jc{GpO8RHE6TjN4(YDRmZJcRmxCkg$*F +zRQ$N%ZTPtB&CzW}uMp1env=|x-NZhcCMi>V@yNwjt02$(JaX27a5fO&*{5yR^mvNC +zw8kclM&-#DMpa9u_|o4_9U|%Z?}oD_Hm-%GInU^dO^RW6(Ix}r$x1Z3TNVBS` +zg|k*lj$T02nH;f6@_DpKbT8|-`idYWrmW(=7)5qcL|5y{2s6D{_0c~h_9Pp7Kjaqw +z!+E)LDY9Gr8nRgYI87_f;p~dCJMZ+>C=J6LB~G1CtUxB}sEoT~lm1Nj3I#Y0o+V>b +zM)H*Fex~beL1UW?JBzbNvajlQ(Dd%e>z(G?mCDq)g?rr^;Bh{8%oS#>i*9r=e^@@Z3gfbjpsUJf!G_(M$WlAq?Lh +zURRErd$pT40>y=VPT?JbkM|9@-%XxLj*oPHc5Eb_-M?qy9zoocb>n9F`^aZvlfOs2 +z4}dREM2}FJ8V%uz3^LS!%8QH>2!gUPXP5+xm_EWDTd0TZ_?BYqz}K51!#vYE0mCP; +zDHC|Uag_vhM$U$>>>knTfDKhdN_LZ|n74#eiMFs;B8GGC@Y)D^LfTgm)3Y8&P!T36 +zf!*M4&*wP{&?EO4Mr2fA!xNhQZO9Uy*pwj{AM{!!t9#t@Eaip04q19h)jLXwkhKy1T48koOL>U8O(ZRagND- +z3mo}QNv|vc^fmT$J-h++TdCn*0b1&AU#PGtn%_~iddMI}<+G8iT;kkMv|V;p;JG|D +z>7eMSBI=b&c_B7gv>MqZ>Uo%ZAL?(L^voLAitU4y1Q+T%_aN9;aJ92%)?iNe0cdyD +zS3%-?u%lhypu7w)XLO;X>0Fi@+z$sk8)f0ejxKTvkK444fM`rNYDGyRwl?Z +zzDkN~*42Aw$mgY!J}dagS%&OBiQ@MM +z$X?M*-UXS6Iim~tIaP{owlsLdM!Ij#TVhiyP4U6=BR<<(fkg01g!2qcXy+uVRcl!Q +z{EVs>QlJHwDfLTE8^A$|AOoLP9l+&KxHhcHb&iW!VKHNTFhlYez&C;TJpdoyh`3$l +z!mjV1W}+(g7k_eSVvcIzjkaG+$O32p=YWOh-)DwgRJW1tzH<1&Q=rA!!*5~lg{L^W +zO*b-R^BXOSF=I%bj}93gQa7R#TDF{_YMiU|8>~MXJ-$0l^mh0OqYGAjf!7Y}bI9>U +z=@qP!5~|1o2Umw)p#+N_T%CF7<#MlxUm+RiDIk55??a92;GC5bCcIqk;;RYP>$-bbbWu&AdApA!h?c&p(Zdb*LIP!Mu&%TH7I3 +z4>vTC9|&hPS!U#jQdtZ?LGVICmq@xX%#aC)KMw2f^!o%=$!bLO7Ir{jb1j-2+3rQv$+fHOjpvzJ8l7(=Ek +z`GU9be#(?(k<5nBA8k36o6FFPGWSjAH2F-~j1YgAZJnHmp9^1^I>G0mfzH>b(OXzk +z9__uGyz%ezkz3;0{LYuE)w(-}k1DuA@%Okt<>o_vQ^-4H+QIy$Z>gd?kg~8687Oz< +z;)8l048B9$?^E;}{wsPUKfZzSaDIH5^BUpZ2C7qZtBThT&-d`e#IMi)n8hzxpI+N}mF5+@34HW?j!{0da~}9w9=K}cxuh2S-bOCJ +zJAP~amRY1TL?#>PyP)rYo&`Mz`g5YYMnQi8uOiTY<^=Q{=wE}r2YLkbJpAki==-2w +zfc_Ha9iaaLS`PXF=yRa|3i<=k3q*nl`YX_bpdW&AejkB7Kld?cIsW5sEc{``(!E`a +f{t@4){dvpO9{fYzneOR(+{-txKIM)-$Bpz~ZdsNg{!nffyT~@V;mDDS)T3p;y_|Yw!@HCB@W56m)1Oc +zj>FKFA%-TXrb+D|`GY^EYRw-AF$qOgg{Fx=_ycLQrSw;515GD{G%-~ZL(~4K5c1o( +z_r7O4KS;a+Z%GhNl|0NC6^8!o8$d^pkLu&>tNR +zBK7oihhyX?Vw41>h_s0i@>5q!phajPF0V%xcawDh8{z7@-l0(yo`H%TuRM(}`nmLf +zZ+c`rrL+=%T0N>{bJ5}KXeQ@Rk0`NpV07$FIh{RHTwhDT>)k#7FUeSLD4SD8$jG=t +za_LqgclStSWHhS`=SGhz4Wu_5=<1iEQBpsY8cnJVBsFwcNfl-}h~v`P*wEpWLWa{v +zjwoubmHcWfJ)Rv_#(o`+wg%;Bt8^@fpm|%dGub +zD|`r7*8_glTCG6n521qqE+^QIScNt?aYBq+d=MH4jU&0vWu_vEI#ROFqio?MnZkYJ +zhSI+v$m-Rnf$Ej{7H=hkgL1Sl+$V(sGGilB-)RZRLcyw>>LNC!YaTkBel(s25{X4g +z?q`ZhGD9OHqiV7+^pU +z{SirwNi-rQ59b&V&EObO#?q;yC{5|{Tr!QZO0r5q$to%;Xe-qY{CdspCiS>5(Y?Es +z?2ks4(|bd1oAce5xMn8)&R2oPraq +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 -z83?Q^$sG@+XYP1cf^ii}S?H? -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 -zhTOPo_(QL`@9c(c7?yoodX_7m)f-!Z@a -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 -zL61X0mcvwbn?l3Y`lOFFAT4b1P% -z87x~&l$6_0s!r$6Rl8ZL&seG`4>lygLY(s8Rj%2ThrW}TroT&BQGO>`1~P?Sn*OJk -zmf{ut#}sQRlP+2Fs}$`ii@CWVz0Uhmuj6>b?RK1?J?9F$UvMOYeZEb?llT>kgZDeW -z1-(i5Dp)r8m*lpyUSuaOVY1037Qx -zc%QeYQ(U?JI^==2r~KZl_v|<$TzhbSI@(S;g8=L$ZOb>?4?pnmR{{&&fT7p~%htwG -z&mL`qJ1lU%dZOSg`wMmrnuK~6X=5_S5A2w59D;r7FZ%}LWudTrI&7vLly+S&bTnjl -zd!*AH6|3HwJR7+pAhkg+_%mVA-WUH}KqP(_69M~!2}CS7J$R>RP*(fWfony>gDKUy -zi@w4(w0FB6p+IPkf}30Bl1aIv7CzfBfPvGRau{U2&E%13Zkp9u{PAJ96YfEe;I -zvTFx=xoU506X|>+G_o;~c$d;1Oaks_l-00jJImvmR_pO)qmts0r}v$Cj5}fVy0e7U -zHc(U>47;f(dql(*fEH`A(~r}!JT!)rKA&6Ba8BeM+VRE%zj$ER&RsivnZG}P{(U01 -zWiWOCRHcAsD~@sORq^dEE7Q?3ICvaxaZ -zU`(E0;VV-RfAx?x>0s;%g-*6)%C$?bou{~Ay$SsJZZ^iLx7?cX_qD@h*hM-p%J2b`oKJzIn(ZuJUJTPpW(8?5#fp?-&4d+;n{?z3(v3NS&!$9c!EjT`th8HihhV^1D=QuVVjSq4^OZjKvtza -zBQ@3ewP&{XE{XPxxUlpbhw3a1FJ)4lk+(Mq1N58i;a#UPeL#qd4H*z*m%nruJCW%w -ze-@`n0`cNhQP*!7-7;#?M6n}rIvh0=U_*w-T0R9o;K8Z8**R$*GJ|NfeS#K99Usm7 -zTGM#l1GZ1-XZsq?_OnD?Y)9{fZ-MLbn5bWR3;Tb4QaC}}4MoIo)1JU8&?elOFNp%B -zu5gcZDz{{xfS&)f{D0>7lIsj>q7m@G?eLYtNxOIKbmjnAl}XQ~*m1GFUOYMOhDMnz -zqtnN7ThhmA`{TqK;ClY;ncB#E+jG^W6a3WV`Ye-z`^VggyHt -zay#+nN+0XIO)P+wa)Yd+cm2FsOUMV_#@QLU@w%AF$ -zjnCWv+4cz=IEt+iL;4_QELpc1Q{z0-74|p#F5PU^t)pqac6G`53c>c@%Y2m@w=UK{ -zW!DTS2^<*T&^MIHr&je14yE#g19_Y-=7&>Bf*Aig!mKIl>Y=@EKlJ6((S0XeLyaEJ -z*?hagb{R{droB04*JW~ci83s;w$bdu4A?IQBqb6(T{QsT1g8f2OCKZ87;K1uu1GoR&=e`{L*AE|LSMIl7vD;f%@Te#>?Y0#fciRgMyB!7B -z?o`3PyGcsKpY6RW2Wojp)T0E&DDoI3A4AEe&eHYT^LRGUPQ`tNa7iom;t*E$PLcYjr`&%pT-|YD?@kLRJbGM| -z7d6|95rf{qKIap`K){~Mm|OEvg%WLo+a}?d1#j4*_VA`*hS_r1%>w3ChN1TNh`bUa*WY;bPj2f -z(s`D2qVKJjioT80UZU@Awx3IPr!R@Y`YcWDn7*w6U2n+u4W-Oe>^Y|JD~Q64F#&~N -zq4QeP@|`F=_CO!mlQttVqEl-wG-}O|ckM+8a3r15t{7Ad9m3_h27@dhY|Uf=QGuOy -zm^^3vI&~P0&W8J4GU}+nOY{*9@Cq75RI`6C{4d1(FB-ZO{IA*e$!Z*eK0c|_M;2>w -z9t@BHOo9;yO?W -zS>;=h@$ZR)tcmAW^K@hqiAWNGq3ORD5@8WP%7@{)^-5(R4H)Najl9CPfaH2}OrTx1 -zEzoJC88os;(#W+Q;vmE++I0OH^Mg+!wL#|xW)J#D)i2j^~4U8(*P8Q>c -zj!2Zr1r|{ds4B)z)mdai)==fO4M~$J*hyDv(GORs0;}wlr;jDJUTIRa1_9F -zO0$51rK#FJwj&~SR4Hrlx!R_ru~>>jk?DP!a`M&@;b?B@l+_dr5{tFxT}cUZm&HcB -zrmZeExK5`yF5&b;+$FJ@vSPEg7L5$r(inh@#&H$YY5I)8D!IH(#+Ju3q&eN -z3q%E<)ue;{KQ~tuq^`#JtfNa3Ps&O>Kv?BSzN1UhPRdF|Zs}y&LK+z68i2Z) -z#F89BO^4b%urj+Q&3ux4P_Jh)j@HaPVV*fjHn`LCOtGTxVgtBz(&}L_6(ni)k&K=L -z_W=nt#|fJW>M$Fcr{RfIK}Zeu!yK2PCdhm(5c5`>NrhYn2R#H&KiHH$%r9b(d2+=7l8iVt!8ytD?@ -zl$A?aX-t)qLbH0_RIeARS8mP54i)7((D+{jyIVk5=+&Z_6dl8IT9F+V!Zsp&#Epg1w -zbUbJwuxgXrj-X`Uhyz$bLiGp-!%XcxR{x#ac0w`>hp^ShWy;(Oa`4`C4_hnhnQC}f -zP-R;0iCbvBhA{;tUG-S$sy2(HtDbYvRZz~(9_#F^=3SETdaQ(3ivadNOZRa6OuawV -zb#PqFbPubkrl%H3EIn3YslksVgdQs))C|5f@#*1^zj`Y)AQp4q4vFI)D~@X_k?V7` -zW__;WR$WZkQLAU)6dZH-(sY#XY|&vctx^oSm9sI*vr*48l?^dHMXk#&hSsoqq?*`j -zo@8;5E%PU9Y*?hre;2pI8Qe-C@u@X#Q4(jAiIba@UDNwzGjsUhyR( -zw#3!0GpH!S8sP?)M!mmqy?O-Ce;H4GvzS-b4Xo{k&#ke0waQ!qTY -zgB_Ba8O`uQ)O0tfkGa_{xtOJRF=NX5czh6RNGl@knN#ec&&^5}aVQ~vvHpQ=~} -z63ZZ6g-KSmm#mN~RMV5?yBrqzF2%E&z)jMIfa6KYT#_-!&&-#g5BZeThq#Wo-LBWA -zJ|y$z_EQm9OOZz8OYo+%9V|AIpFY__Y5M{`(xxuCuHyN({S;zPehF~|o4)?iU%pJG -zTKf=JVB1QYZ#8)g;_RJ0F|(pXfCk@Rz+;hp -z{mk#3_}+LGdn+1gdM(Y_zhV!?LAZVXMbWj4^0dlw6KoUpmoG!N$G(w1(>D@OIB}Pb -zYY-lar3vVcT}3zkI&n_>oRJ$bXPthpeqWCePx&*Huhbf-lm4YE+`iQsY`|dNa|`#8 -zeJtU{$Th=Tk^9`5ZMCB%XUSO*XW!$NzFHVo<`)|@csOFrS_&D@9Rd~_W3g-pEHPFB -zCfwvBeOH%VFIuYm;&YG&lgAidm41f~UqfrA@T|P?2{9E`%ddgOh_HFM8duwZS$Pf= -zXy)658b=DnA>*c?Vzw2QfX0c>gkv!N%pK6Bd)$8k?YgUtd!(NNy*T-1wyuPTxY8zs -z&vqzYZ5^WLexKvh9bK~6pb;~UgtIj>qTBKzQo|p`--ad@aUP{z7)2c-jsBu2;BH@O -z`^%T3onk?2r)WZKK&3ErBsFq-F_%r=Nl{E2o{irbP_8JsTE#cwg*T(N!DOKsQ9qp} -zPpcTwimgXLS%pK}1bkPU5QlaFYG_iO`nc-fv{>fN0|!RhaUYVyk25I80%BQi2Pc+0j=!JD@S8gGn43;FTl*V;qzExhE>Ys^r1`lgCs -zpxFuPWISUwejl^0$#3)b8NR=$+g?~u`5#UVuPO-JBPdr#Wmnq1_fpa8S;q6*-T#`6 -z;gR0Q@@omPmZWA+`TWz}M_3dqL4Hj6^*BVw@^NjWg)*E9+ -z8@{CURK^^UBj}ZMTbm1Uuw^>;Di69NESr2FEBSyNafR~)79%2X6VV+kubv(Fb8v^# -z6*^vmnJ4zNX1@MXc4rB3EvdcY&Hjw1jWOzll|jQeStT>CE43(k3y93jSoHT%1Tj!3 -zX76VN#~lVvv%^KV!8J2)77iGtFza04Q31?3iywLHAhkLneb^f$4=>tj&AGy`K^7xz -zKR}!!kT#}drRjQ=?MY$x>DtF{upD*q -z9cN_A>H4afdY_rPk>6l3>iPn|!86*m(o9wP4R)w5wqE60WL!ejT=z30U!C;Frf&=Z -zP9j9zvy^JXvRk*8-vD3TxA_hBqIKWovandKlkibKhL8GD$G5H7DBor-foke*;u7!( -zuN&ZRl+VxKs9p9F=MqlioAW)+2UwhM@Hg1kIvHlNfORs={PrWxhY@ly0OHe99CEmtcJAZ>uxpNWcgI%rD#c$}P<9&WZj~oX$AA01F?PBa5 -zJQ{T0nnT7>1TGy>&WBz)*gu}I;ArA+Wa-O&qi^<`^pm_#*)?thr#yD)M~||$(?%_} -zgPe*Iw!QrAWxR2J$S+Xr=_y`ukP?3GIc+kuzsRUyxB$WUbaU+){`{X?5 -z!$=Aq1I%q9;PG!;h_Qf;we3ng^LVy^rpY$?)1aMGc;dXw5y110kbXCwivjOX@mzxP -z%kfn36m&jXeK>Xg^HFExB|bAtbBv-i9-WFBP;n;{$@%n~?U~s$X3iIPC0d9S|A58R -zCgXnCThw@0II3?!I{3mDa&%+oj|?0oX4(wwl!``7&0LKl422m8Q`J(F9#mxue7_L2VAU(r -zV9YYW0coGnmKkQruSTH2G)9vnG62fBp)L2Tfk?74*mO>ZWb@Pz$tLl+ns4A5u2p#>UH;RrI!Q*%VszgTKxW+?Z}=?gZKKpIH95E`ujUS6 -zI(?(c>GW-Q=GqOYcqq6t!6+jH8doY=qi?K$r5Gi<&Hkul5`t0WUG*?+Zu^JUB&YEb -z){EkTaWJwz+fvKU7?V`Sw4%CG2uDX|Z7h>1w_woX&f`sZi1%5N;?YvtB-Orob -zKeC+TvmPx9u^%^@;I`e?^WCz00(t+u>XzN&`EJ>jFhT-6Rm|)6>}Eg8J-f1e%}u*c -z(@ndm^ZU3NSHEo+z5Rmht$xdHZxJ_S(0#x&-Lfld#vVc5YAi-(b7>sO9~F)8ABB818i_&=Gh__QN}&H*uC+h~e(ZXt;}FZ~w76$GV+?c9EN~ -zVMob(lwx$k?itXM#m-f4iCtyqp0Af0%8or>FD}CWceegUc*^#~Z$xV=-;}U)o85y; -zR(LlCbpwoqpiJOUk&(sJL;2CE4|sd%?`J*9>_L3P+upc4ZC7%&Uzr1_FcCu)E+ub<}!Nhe*fmNFRX4ARMMcWoLO+o14; -zyhhep8S|)esqHck?x!4!@ChV4SG;j=enF-;2$`k-~v9qp+LNT$=|N-UNR9)gf5QdMW5Zp>2T36fz5 -z`eN4PhY=QH>hU;WAm}(5$tE(Zg_@x3XxQv%wMc|u5LCL$JlU<3rUvNfi-{J9x~Mpb -z+R(HC5dk;*{#9E&$ez*PSskiPQ+JSV+C}Aj&M`dY%&*dbA>X7!;6p)MrzxXwuj_TV -z+(zH$Tk0ZNq*KZw_9)^N#=x8Yn_sEQTx -zD1Q&pcUaNM?;(7D4&N`gg&QhtSEhxL#+nfut-n%}LHX@Qn=<|&;$H~ygt3-${K3m@ -zT@4imCu{3Mu4c|fZ={R37EeSSv@OR|;JE^I@35}kJn3e!dN)Kb@#@`0_PAh^WRI%` -zdax)EcckA8tM}H?TQ`qSD5XtXMlWCq=P)kVoAL#?w7QtGn#uK}y#92XHnLN5kR6~J -z=r-*DfuCy40$Iahe{5RASu;>Ovt6I)USKpNZ&}Y%%)t=MOpF1NO9(~|OGvGWrOAgs -z3ZJ(I2b21hE;g*ZsIY?i8e*+mE}RjSv;ozYGA7s`X??QRO;G|d^ejD?b6&^o#n;ZU -z08xDp*Z>ew=c0b8FN?4?Y#0q# -ztN<<58;TEBE)i-vf@IXBO$l06VB4gD}!(~-THBqLTi;PG&UG-^RoT98S -zzR0+9(^MaldoyW0XoU2dyRi?+t$dXA*@&6fe{NRQMJ>}0R?`w`8tq;yV%{7=*2Ao- -zhl5l?2YeBs-liK?jb}>_dmW=ZwFG8-RDrCjOd@wEAJ*gX7J{)-N{b^KI|(H+mbxKD-;bC@vaK(;VN# -zvj@-X@LY)}#ZUWV=osF|vlq{!czy=YSMakv{665_Wu*!ORPVL!&?FR13aKV2;#D!kE}nKbK8VSge0S&jOabBj-iV+2=HGq -z)bv=Csx$~)NXDbr{qxO -zjxk|+RLLA_sG=m7NBf%Tp*y7x@*f0(5{CQIlnheU5H}s@rnJ#b4#z;QX?$R=;kww> -z(alm>Fc>w?6sorw9o>BD5)85|OygOT9wAR5v|v5+fXrf4AE8(^z^Hj4-4wyEqpO=Y -zQ8+$;Tu3d{ZlpT8x>)pr3!9!}N-w&|4GuUpO;$`f!~g`5%VZ9tm8v~S2h3kMnS+8& -z4+J^=p^2zri7^!j3Uo|4417%mA}Cui;}X?PH4lj>+T3k`;C-U2UnFYXIP4jPN@Fskqn3B>Lr*j|OBJ)^IB}EX;E*yLj~hfP(Gxe(Q#rzpk>o@xw>w?F;ER8%p>ZWWC?f0g&N7$ -zw#nfWrOmJlHEm10CrrFoSFTEuN|+>7U0RjegM_(G)s&WuGifr;>e3;)auM?xK}+O( -zs4g9nwuY5^2a#++W~hfJV=`r|k=3W&VY(^;3~7er?6A~urcE#8>bAp@TOnBdw4ilK -ztB16?{#Li$MeeUy4oox3>dL!%m`$Y3dl_q!S!0qmZ6d0Zp{z&c!GJl{kZd8Q2nFoG -z(jPEZ#G2Bq0YtJnYE^@ZGafF@`V?XV)up?G1bHwRF&JER+udwofaIy8MpKaNB1yC* -z$cCXc?O!{X(x)a;xg6s-6 -zrJPxiA>o25MRq_zK2t+M$z|8(jZmcqsCXLCrl}wo4pA5e&@^A(iNaEBnz32Sjayw3 -zGXcg7O40?(GnWgREk?*k6!gI1BT!Dtax<5#n5lO2{DTxp^A9Dl9KoA*=8|OjaI0;t -zMK6YJiW>zPlk@N*kwc$&v^{t+M~~9wXw>74dPiR*wDcxhCw@s%d@xQJMbRSy%kSOZ^i8uZ$;P{_DX-2 -zkLt1b;df*?_)bmnSp0C;>^v4fynU+2;_ptvr{^PhEPikktPwBBWAV(}RUV7)kT+HF -zf;|?`eETn7Har%8r^04c_gFl=zc`J@;+ZmeEY>9}9*e+Qw1RcRZ!vqj$ds-l&mMUB -z)R)?%cj4(`v9mQZ)vHkYHlArNHiA-wVH;T%Xr)3My|NYdJUsMo;d$uHP3L*|hh4=f -zo`)Y~4bMZ24x(F<$K-kZ4=1Yp58s>C|1ePPfB2}y|M28d`14BtLpytS!B3{v|M0i3 -zg64l|_#fJSdO`k&8S)`4XyzPxc$WT$n@~>oKQt|c^%<=DA}%t#4bSUm*m7<^!&C6C -z6lX5X&+rcqw$9*Z_=l}i{0woMDp9z_&+riY8E%tah3^)MAJwZcFe|S@O1GX -zh$uhx&Ut6~>cS%C3sv{R8+X0Wa67y1-wycon^M>}@)@gdo-4&Z{+Wbx^HBp;u{G_`sGMgJS2ZNQDhIv-$yRmLlUc_q5E|e4UKP|)cwL@TlY4^ -zn{ywh(wp>Yqc>@JcB5|d4P_eVxe>Zu_RzB-k4^fY;Z1BdQU&`ak}kLY3;ZpHx0w0n -zfbNJIVtzu}u*)(7pjZI6*E{SZkLZ_{e -z<`z8HVH`=fKaA{m<9P$Hh|td>Y4`!MHoHdGuI1y)`xV`Cef{XB@jpdCcvTtOvT4&@ -z%I1mN?!0q!17a^Px+L0nh^RQMO%LK?k98?%--AJlPmc$bZHAaVgY}-(_I?`0`=$}} -zty7V`-Mn#hOev3S*l^oe$*gx)W+JI=n@7j)x@~;yu9erXDNQUNp%dz6+vh$}1vw<= -z&q>KyEJA!!Kkz2xZ3NmjM?u-bFw$hZX+8$jfE@U^NykSL_~0`s -zJz~ZJk6kP%`h3@Cj_=r^EJM6?uM&fweW$1|y4+79J_GJjvEhz*YLsU -zR&S`R<(?)7<(jP`lC?0Zd5q*o!cN#v||c -zDKyHveISjt(d|CIZT4qYEVDf*Z_BaWg!bFnr=H$ipv>haaI>My#g~LG&4q|i!2Cq= -z_Y1ijej0uG1K(fJ@$Cb?VbPCW@UMtl -zAOeqFZ4)ls>apN6z%Jc-uly2*$l -zr=bL&y-veKz(YD%gB#+r?rCy-1UA#nEG@(=jc!enY=-VhV*2?L3;kdiK|g<@)6WB- -zp9hJ4!qB=*p2-{-cZFiYSH6cRY2QY8pWY6B(S-ZDc244772kM8atf?d;1iU8+S`!a -zE9UudACm7DnLGO=R=Fn0TjWhhlf%YMNOb2B%bs4;c(=|^{zRzeo3omRi7;kE!_jII -zCi%s6NoaWHdz+Y`dn7@h-?(E6L9;+; -zapCmb*nh0p5b&mB_E`Ddl1I6P?iI>CXx<)l-8s5mjWVmK#^NQgb7|Itq4c0}p&p}y -z|evmajb{#Q*&o -z$_(KNnq0XXJ5sKahj1hbr1&Hmky4EF*lBXe -zI!w!+DLLX49bUyH4aPaTo}&^xD9RQF!4$iw(XsB797(osP+^0kA9yF}p3`-(@`w*8 -zf2@pe*?iY+8%CAlZJS1oy;5AB_NJ4@X)pFuRpZzVX&Z1Qt@bKa8G6|G08!8lt0R5? -zc#cMcV1=l&o1MX_C+9B`f^#>@gyW_W1L_~lFeHOUXMk+Z6g4wVgHFVcCtToGSmSVA -zj-$nX5P_Ts8R71kkr4`}Xqy@CHp7M24qPb6hxp;{Zlj&V8hJdLFph*fLP0i<2zQ&_ -z{)siHr;kPE1usEWz445P|HAkEg -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 -zSC6F7Z1Uxz -zqC_1haC_el_MvgD5apK(p7P7?sHk_GLcbr*ZAqMR6r_g?dL`Vjdv_G1?_F+7`WSib -zvM<;1CD(OsbKI|uO`dhPi3Z^sKIPEx<@Ve|J*LOwKF)bXd}$rC)_*j2uV%6c{u -zti?9~%}Rm$!*}f-?8x@=x5)Qf(O1H><}KU*0Qe -zx;N2Ep9Y9tpt~0*|EAapkK}hO(2B`$`32lI?Yh$|>&C6w^ -z#Hsm0eM`91=W<)n`yI>Optg4+?IL@-KMBh$vA~a;@7*UbDYV^}xu2pZ;KkkFTZ#UD -zwDgP^5ZfH5@cf4D>y9(!#ZSJ7wi-%)U+kINfB~m+dEq_pvdIrUm{7Pi8;%G?x9Zqz -z9}(g(?hy1MV#Nc>+TFq8No9qwM?R&l5RJI$&wERv6hQ9fCEw=xulGG~yTM+3b>eRi -ziDBD@gPD7Z_6f&ko3gF`XSoLp&w@hTrM-nVWfjI_fhwklx#R{89xmRubyADk{v-pa -z75I2&Hrj4n@u?^N3iJp{Ma!{lqW{=h_<@yQ&TRpWyT-jDDt6Bom!A=Z`8In@Ov0D> -zKpZ2NI0f%g5c~&+`j0tmIefvK?!|0cfH8=c7VEQNLFTyfx>owE?Xz|zmU}R}r2kmG -zv(&KrQzh4DalQJJ2dP!UhjPG&xr_OHdHh$xe&`1@r^8|w{$?L4ItR6q^Lq!^zx$w; -z)zF@kN*suhpS63LunVoI4BjU4V=d*$k$n$>^V~{)Zuvq3Jke}I(~t&U;2=DIa0+=I -z#8|ZgRzKAMKUrmuwqZG*zK3IxWn$owcu9Fi+h7knMnq(H$@PX-@)q9z$wuMFuNA(x -z?cfC)MLVdWm1c24oY_=~z)`aC;8b>7hyP|W>+ -zcVXsuA@-P!sBr8wdgLm)v|ZX$!g=`lL#gXup8URE|Kh6pdj&Y`B2BNqo$L2A=Uq6m -zoN9E%ci0GXW&5LrX=*(<;_g4@*m}X0e){SEep+nK?Vs;04$!&) -zx_P0HZp$bu#m&B4{Ip1VZa?%7xD(Tf_kl;3kBC1!3U9LI!tOpGJlDpAUFj75J^MxA -zRwv4|FN=vbCFk2Dl-6T4C3@v0J!RF&9ORbm55JUU@h`UpCLN&~crfur9-s@zguBJWd$ -z58~Pz5s_y^oXWIk!qy;ek|L=LjFHfE+Ia`|wKLiYJ(Sr30 -z_q&#N9KiFFF>ytgCNf=dkF5poU+vEY`eZhd*CQoNCv( -z83v{(PA$Tny4mt8;7JR{y#cHkA3jy|5PaY_FG5Dz4{m#~c+#I?jPCs(i;E{9V+?2E -ze_LFPbuJHXI&oD-*vod{&ZRvm8t`kRJT&${$QsZg-}bBf#86ob#=zSZwA6}~-&T4T -z_{#mSQ;vMm2}$EVL}1ft$##2tW`f^6>oB?v80B>|zP5b%dEd1(zP6-2PUCCq#dx{P -zu}7EFx*xn<9XCIdFbF~Avwk5-GxQS -zad}BhZst7p@~6EA24nfJc=--tTBV6o#4(1rE948r1N8TSvi+fhdM!~s-{V-vJa0eX -z7uzn|D!wGPi@U|(&O62ALLM{QwVHY=P;fJ3J;?P3Z%iOo_$KR -zjyC4+yE-XaS)#jQ>*W5Y#6-z+bxKU&i%sCmb5Dt__>vY|jW6H79rWz!S|yr|FPT;N -zR_1SIYJ;3N9Mo-#k4431{%jcZ##r|HpFse|2}! -zt@MpFPuL1?NmxHTOCty@zlvyJpqOiyjEIIs#YXyCa&MhPn|5)8; -zF65h(c2&2iuEB?_&3^UxdGdkH+Z>(3qh -zyoGr3WoHXsk{yZ-<;kmdcoB}I01CeB-O&@}*W^0n-2pny#o<4Uev_Q!!Wej!dzNNJ -z^HNPLrdVmeexv`W%`NYr2JIe1yKbyO4a)q|!hN_u8+>)J@SfTs+<^}4z+8|k?B#OpsF6 -z4?Gi+XAm$>Q)GGhQH+S_y1dr9ysq1IU0z?;wbpehODW5bb)!<(TFRnDiikj|i%8K@ -z*IG+y^8221pJ!(B#}ci}?yDc>K6&on=bU@bJ?GqW&q2&d@{6d2qfM5$)-In@qT;X~ -z$GVB@u9UF9tvdiO&|B;!ufdDmK?74yVg=gt`CQHln(-vf=#-fBfgaAi>lGB&oS*?* -zB~3`=J+CvLWu255*h@YqRh#^-l=$U+7~34Il5;v>q#V(UwGyJ}@WtTNNvfO!%J7UP -zKBxh0O9UtA#X)eh%ipIQ{d9A*`BtH7uc6&z`VoFt2LGb=!Qb8HCJ5j;jAt8obHy?T -zZ{nEqhg0GUhje&*C_J6}_Fo@LiC-UlZIFJ4NCa}N_XFpdFG -zKX5p9mPPS=Kk=Ca{a)2q3x2BXyT5c5>&22k#16dyYu?pu&Ah7FUt44OX!}jwhlvvf -zT@d0it(CBQ=Y^EGtdIHDa;^lb&hJoNm*}>ogeO3dzO1wRFk#|`0TUDFRQ`Hh -zpOfF -zp;rZ(RM*N<8cPpW%daxJ6P#*N=W?l5l8il7Vr^PY&5W)Ji#6)B=D`6^H9Qbmy^y^F -z!7ymehiCON8t<&13wP!H*RBeySpVM^cKn0>pzXN37_hOfQFr}iSMd(CqT9CZ2&-w^ -zEzP^;gMJAA#MZvFW7>wWxUMg(-U6?Z1Vhk=y+rMb`oY;Z`J<~uWwf|FU9(!01_Q!r -z71Pu9_SlY?eoiaea(746+xEtb?VDR;J)i&so58_mm}h@e`w%c)m@fD6j)*-Ddt$({ -zb%t(Z4bvfyTR#c@eSb>4chKV(m)6Z4QC|ema%&%CJhj`wmiXe;}dOjttd`7QJoDw8w_o96(x38wlupaHkzFic!PFTT{3&_WQ -zji1o24Ly|HW|RCIc%GM1;_6;~CUh?W=UqbdiEb}FduH4TngIz+Y+EL3I*ZUo4W4Fp -zTJba!t7Gdo@E+;olp2(wEHGo;sO2?X_J?1)2;(;)qWEnU&G>B-aqKDWcq$h2@w9-Y -zfQ2bhdPH9|X}MS|63FWmZFueyN&NPTcKogu3$C|=f-M41v^L`bU%G^Fk9v>mURuB4 -z)1~&T2socf-?5ZNUxT$?uB(Lcvl~+4=R0y3zfepVzu*JLR}ICu`pw^uar+JvIe7{Rf-sG}QzSm_ZdJk^aNt&?a9aXKB(9>0}5EY>*Ld9-o_0Ku< -z;u^>=DRBz^=>PghL$rK1JoR;GF;)M>D(Lx$&$l1KzaxiU#P7kbnanNQTci5>K}9=* -zH81qH_kbJMk9jVGHVi#)`;N=0AJ81TzYQ(^%e($U--~^tl*XcY>(q25Q@2vAG$jOG -zUf+xFB(B>i#C7)wYjXD>ZhT@g0_&N3i3@wD6gpJk2K;6*_$urIofTRI?E}8AxS-kw -zkK!Pj_u8LVAP!!<^9;W1SgJ&KC7yrn&m>L!b(N%e?>q>Mm-S3H+ZB7#9`KWO -z`f5<#@{BquECLK+kA!ot&=zLiq8=H8^Rz_ftyO|%O&YV~qqp^$K1UOF)JlAL<}Gll -zPvIZ>FMO&?Y9&8xy*q8&NiaEs9pAPCW7JP{H1`}$fv^2tf_C%7I}_K_xd>)PSKIOR -zAA?4_l6Oq{3KmN_eWx4`{ -zDm!MZA}?$Da{YW1#f$~Lqq+LK6S_@8J=b?$$x{8aoY&d%o3(?)I|E)$;PNWyiU7H- -zR=tR@kM-?JTk$&qI9%*$-RfCo*?UHmwQo3iKeRLp*M~jo-&N@17w>;DA?B@C1Ha0M -z`Lk}0-tKnJQbqT<_88>4)w*N7(B4i}q?w0!XMm_}**XDjN_pstbTN31WgU_3P^chn -zKf1vg1LZgyy2gJ^)irzWNmpEJgIDa>u1!l-zwKIUqXqlGIo(0Bn*HAdz7-nQJEc^5 -z=LP2Sm$Qy^F?h6(^o6UTSGyvrXQ+H;qIWK7NTqhQ?l4h851|{U%EaMcgyKbD#&be&tZfALXTU!zNBz>*{tP?8KK(2-!q9*Ra87bE(GiX=WZW!CiK4U6 -z3U_5*$9|&fFI7gaoh3rh23oHTi@Iy$Vmj(fg~rs`e@0Z;e-1cVH3y^^kNw;9j8YYb -z_WC{13QWzyImLToLG0%O+CkJ+J#BcNNjo>`!Kd0iHeX=`ZwTv<+>1PmAr;TdypGf9 -z)~eaq`)yPnJE^O^54`2#=&aCGp+eV;^8@>f;<7pKiDKUun!Zr=h3YSGe-6AIC;x^f -z`ef^-71mT&x)_v}zIAp-B>E>e{b2BdCI;TGd?EB=Xm92BD_@HKb>%C6wa??M+!y+{ -zg?}FXYs`y6Q2>exC=X2tus -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 -zr1^4iI$+d@5 -zFxXT}-UgEOQ^KFwU*i|P6+!TiHC44PmmeoMF29)iwyVp&LankM*`QgMt5xc9Yv!<4 -z+@pinOe2)v3wrBw*(TWe$_$i_(ubrYcL0ivYC2vkWrmt__uwu<~8*W#@58j(z -z4E;p)iPml*9>92PVrse+)HfVZ5NQ#XT-f3Ml=gj`d#k|$HL45}$0453{j&6ee(Z~# -zdYQj4U92__h}Mni6Up73PxFa*Si{~7dg{cN_;+ATI6r-Z#yP1))OdxD^s;`U3!Y`* -zMR2#^J=%WHHjEr|Nodb>+?#%Q -zN4)!}_HxRz`|fU6uT^uV=&XmnM@4i|e2K5%#Qi7l2QPC<>-R31I+4C`o%+)UlHZu8 -z&=*!EuCKtV$C)&r@IFJZd-Z9|jthD(=^~i?G8Q2sC4{cOq1HxZ$_}*RL -zaoLv^KLUN`QgEaN=k%HMcJfA-Jy4*A0WWYqgUfYKMoBeMKY*0mfYd2K>SLS`lxR2| -zMcqn<%~x>PU89LtKYnb}Tlm%^n=nHd5|2io+tj627ZOB%avC^22AjeYo;lvRuf5PJ -zdaNtl&(8)mTVvgoe2Ap7Lb6yq+7bUJ`-1(D2Hw}sfO7JhI1qy+QnTg?fg@^`(}w73r0@x@gdH16N0y%KvkOBvWx&63@S -zWM=;k*+@cnaR#&gece-8>vGbGz!%6)>~M0orAw9oUF4Ee$KfP)I_#%rO8cv-+1|w{ -z`7G(B$f^nyr4@U^IJ9ZS^8)Xjj8kf(@E0JdIHr&_Xn^L8zS=0clE^!FFbKpQNaTRaOI1I!ZAZnbtqq1}1~=S|0MD3V-{ -z0ljBJwZwh@Zj1gz2Ikf-u@gFH(iZ<>8E%QZu06n-=b|alhKL&K2|L=_>z%WI>9U5( -ze=(=aiW3`0=x8PW_d}CltX+IAana{7%QYB<&n7Zx}lPX%U$VlIPRj@z6&+ijmuB -z%;5A&v3knWtr#7h!a<{i{KxgE&q42T9=eF2miEy1K!$!vw>$3!ALi;VGR{+qapDPm -z8A>*FAIuyf31zUDO3QKYJBT%X6r3j@`=f`5^85x`5EXRlH$9-xDtJfmAp4$0EunkY -z2~b~O+JW^@g|9!LyC%g!d)8!*?EyvamaVj*{Cc!{K(EH$Rqih&df3_4?M0hqY1?z4 -zkzFLC+VSM-qBA*HD#ZPR)A^0i*Z2!7t*bzXuYO5ClQ?w(XJKAiTZ3{Qib8ECp0?=w -zwP%4{+_=F>!iCqK_g!s&RTKs$w7p?nGef|pxv1@pCVbDk3EhMBWet@6OZXRw?xMhp -zp1q#$V+ZyoP7nm&4W&=C9lzmDNGSrd(MG2c{zBaz{ff(`RfGzTZonRQ;E@fTAL1m> -z*(C<2-%zj?`gLVr2zn7^0Ft)T4<37P0pxAyEX09~0$q$H1X@tCp)wnl*aka#l7A7@F&nzzmBEZ*7N?fTi1 -zI1|~qXX8?}8are14*CoCP;hz%X~^Tli3hiRK{!u8^0RPN9VGhjyN^K9cmDKW)RxN! -z$u=0)N!G+WUpq%*tuEYmMpVfYm|cBc_RO)i#Nk&;MbyQ_tih0ZEpc>w7Dmoo~_y3 -zS0i59pzc0&@6Jt2?bVi<8+LB&DrygFw)SuklH|5IOZQF39Tf-YM&g|fBj8aDcqGCn -z5~mXkk>}L-IkCCr#B+)87dL?(9=ArIIgX{FB^cO#LqW79wYweT4^4!|O3|?=9Ejp< -zg<`z?3tuQTLQ;$?6%OTJg!qDtsfwp^8L5<>UP5`7@|+QOwINo=r4db}s5JW|qo~q5 -zJHNYD2uGFqWM9TT{_FTWKi-`8uR>gQhM)W>UtvBKzQ*PI$LDzq=e&L)#>v>Ccv3pK -z)brzUx6%x=z@?stMt(a#Vf1zKX(65x{0<|llOsc)wWrX=1my)s&Xd02QZFEH7xIdf -z7jb_V_Z(wMe*YrguQS`ezK@^K&h@1{mc8Yz|IQjt7y^2=zD3`(rYO=9xs~4gC -z<;wT%+%|6E%3i-O#1t7T7Ee|3OVMN1<7VI2$+)$6cb$Yi#(C`{oQs&Zl{3-m70OFa -zhKS+NU$*=ba?7~Se?y7*G}m;-RX?6w -z{PeGQa&T)H^W}2B(~}$*JrOJ~Q+{NV4&dcC{0OhU$=|o%k@Ng6^Y$Zeqd7jOjGhZf -zj=x~O8^0GdUCO_Y%X(|)oPS4|D&&+Y2d-d$p+h~i^S2*RG}~fxwpnWs8y5uZYAe!C -zA+GcyT?!S*DWqLEm0p9i8+TQvBgM8*v=wPuh?4C{mm#LEAL*@_RR@vcD$jL~B3&Uw -zeJj$HLR7?&-iCSc0n#2|Z64Cwu^Jyon!z4V^}d4sKStUsL}?$=uOg-TtMHy;_}+oP -zpFp}A{ZYL?MM~pXBgE84kp5pnG^|9rRtVc+r2h-)9;Bqpp})U|aa1B*kF)~mofzjP -zqEU#xF+tFjD%izr^f#5a}bp#~P%6g&9Wh`X;U(mj|Ly%rQ6 -z8vN-Z0pC0poPu4FczoGm1>VP`7Q13H_w~jjF2?#L|_p%fjzf);H0dD9H=z}%;=JzXUGTkIud8UuoQR# -z0Uzo^?9+t$4MoT&Nu1+fn7K{aTp5la&OZCh+(0&$-Ay+H*q@J)TPwY#P|NJ9v?0Ku -z4vbs`YcL$1Oo>sy$R*FiX3Mf)Dlr8?p*g>id}=Zw&Vp}lq+=8(Ut@AN6GxaU1lmsA -ze*22A<~huQhiL9B#?IxkK?K_=RMu#2pFTrh9xDRoDX-={rqEP%kNmI+xfq5<_X0i} -zUNzzYK8|>Rpb#fZRPB8_X$9dN1$`d+fZj5>`NVcrp-TKW-*J -zg&Vr(y@>HR@i}^LdLS_U4t(unNR_y63_aa+XuI~Rk#mF2$W~3Kv-2`&O2VRv&K$(F -zbTO4o^uw|wvQD1Y0UI2?XKr|1*y16t3lA9g%r{*xv<=~R#JWPX*@ew?J7_;J_};r1Lfehy)Sc6fTYUkw+EbY0>dX!~IQgz~CI)5~#p%ojV4oeYow -zR10x~0k@Z+ueWX8fDz!vE#Nd0ki(s5^2k7~df^qpgqrMOf$6v5Rn)dK&wq__uz0j( -zFFBNh*u&c$l4pHY5H)`dZ+u99jC9=)s>|f<;#5~0xwKTb0jnKUml8w*Y(TuD&m+?2 -zh)966c8ZnPb8Ck>#Hx7Rh-I2YEYk(FDxmw6n8lqc+^L<;5!a*XI_MFDo*Qf7B>=aF -zZ-rI5H?wrB2Ca$@R=mOOw~BeU+3c`{6XaTJdcoUvh%9Hf-@f!H=Nyd-McPH=b -z=nGyL_ySI)&TpMacJaOyq6}Jowa)!Q|H8Za_a3+lt@x=8k7Bm)#!c7G7GWmjs_#38tYg#`FRS?WOSXc`-!h -z4?5L(`|9rMktBQs2{ADnDCmFpyh6^#NW#NND}Q`Rb=$Kc8xCFrS0Y4Doe1fXueW$Te};Kn&V!&Id>QkqED@ -zH}h5(`UBqHH1JjfyoCsFIF%b9>*1m2<*iFRw+lPuGn^WqxX=5yla~l<>)#ry?Fd>? -zhpsjP;83)Vb+uh`-il(%VADgwxJJAy6W(LxZAYvzhV{{WSl1J*j~cL!1J+4`HT<$v -zIiV=;_TqQq(o+0J(r*0Xqz%6}E+wyT8Q4zj$NGV10GtJn@HWV6Do?hc&lwBk{|9ij -z^@!9$kZ+QZpZ0k{{;hn-HxcCD8cv-uFF|6n;od9M_EAMZA3>7ZusMw3eKts{$1XL! -zibzOG#;xHq$Y&$wu(=4vwz)@H!`9G18n#x13MKE`X!ZXPN|AHN}rTR?1_?@ -zqika4I#@SSF-k4R^t*~Qqg()vV -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 -z0 -zT)Ny-U_vHaqSVL>64Z>|{fN^yMG0iu>=rRKcsS1O7*yWs4DlZ5#-%ar$|ILPk|?H -z!dvNKuZQ-)jKNKsz>Q?&!wXKGb0a}K?R{=zy21loY}=SFfsPUHZZFBgODF;Dq*1ey -zW=^)%(&uQL@GFKk1*GqTrpE}HYXKzzueFhbezZGjmQd+kuTK81()QkX{*3y^cy_M8 -zl&Qsx@2^p5G(QaIzCb)Pd>(EeK*@)xRY>~0i&R8LH95e_-Ww?D2=_gJ$Ks2M(Ewr|kOjGnDDYm^O9!$VtcUR-m2D9)5H -z;f(NAHI7PQ^zZxC8Hh$lEd^`@t=K_~NcFT(zIsE@ -z5rTwk+XS7wc`JxRi*MWh6s#s(ngh?pcrH#`vAS1#=Uk8O%mm0!aQ^zU7_p3? -zx6UN*c=UqU?1y(B{zlvDh?b>U@!RXXi)O9vGTtLT7T&|hmZ2wsKBPe2zJ|u6ppSJY -z^se31q7=y6{m`Qn%;a~_q*w>|3Gb}(PCLDOn%_aMV%?A}*U3+4&pLyj(1*1to9i^6 -zEdAN12eMDz?3282jy}|V<~vo|NzgkVze69Ym7mauDs|$>Rpd>3j0#>F$dd!TyTz=b -zNUsB^p~#!;lqL(Pi0^7c`YZJP2-1&`79;&N -zQo6MZJ8Fe)`Thnikk;uu>V0#l)``?R7uPx!TpDZXtVTT)XeO-_C8Tu3s%5>q6g`H>lC0nk)n!#SsNB?$m1FDbdHnT(oY0gnBG)%_ -zb}&z1%kMhK;&&+6GWxiKLH?|U+FbUK+I%b?g2fxy(2*k#Mo3!~YRDIo^NuQlQIcbU -zm^>jl@2sMMWs4A)+-&3dAZ=i&DFmQqvjcfTGGtI{JQU4qJP#pIL~?d>Zsew*N=To= -z0|y+5y>6D#*XhO@<>mipGT1pAgJzOZ5yyiWbF#onHjh@(G)QTVP?Ovxuu4_y`EVxd -zyJC2cW0V3>KmYV4#=xj&b;N?Xk$KXi$;h_NqYT!t@Tlq=xN5MD;J9FZ`_0K1M21m6 -zDf>-Ps>!v3Qch_I5jYmcM?d!&+u_X6FA6r3P#bE9(BxRKFy7G;X^$m7`GXoD0d*?B -z%}GE+q6&=>p}`5XYBl&>p!w-NqI?!khzkW? -z71i2iL0ruf)Dn1KKJiG$wRtG#$fzEU@d=K@5sd_EUF7>pO(W)=Kd#ptjxCJ9yRQBA -zQ`9ET=i#B3T1xKzR*~*%jp1CkHJH!YLj^tF$X`z-l^ -zn>q#O{@9?>HLV+0cs=;*z{VBuvxzpV+N!XLl`m5>gWKSrDRWH2j*18gKSMg-eh}Lm -z>?t9S92A8(B`QDM*RioJ9JaQJuyr}iTEO4E_DG-6;>#U<=y9!H^ai5PAqoU;bfXpe -zZusO=z(3Ehpii6Z@j;YHJ73L~e57wWpm5|XF8H>z7Yo}0#Ps>%3HGpi43K}>z6DSK -z&y2i6{Jl#%ygRDfeuDB^Nh^NSb_uhdlKKrUQGd4!KIt)<4^ehAIQPX>SFqfL2vnH~ -z+8Tl@!JhCHMQjH96tMQz1*Z+nL7IicS&)@Dfg`iksS4yw@_P$xJU!n_@l>m7)T1%= -zZnAu7s|r{|`A>3Rb$5>#^b=)F2IuQ8cVR@^ -zAPIJscDrDWVcT}Auys1StMRf4DscW5w6s-uRK)bfD0cMSuKGmVa{3z*eEEq7PCl?+z(1?6vY>5w0CR$D -zDJsKc+4JyShx*!V0gGq+p}s@+R;z7QnoX2Hde5GX-R#@Un1MU9GjOG`sxSkUY8p?u -zT4ka6bEL21p0@D3f;KU)V7dCuK2JeM-^$W!Tg>_LjhEL8oIX}Yn>C#9QElMwXpP!r -z$(6C&Fq7@HUQp&CYM~8ARigaia7QfdrnPhs^I=O2(V*eOT09o8P}y(bo!$wrazeX> -zuuquJ!+OWi_4@5&#(G_(-BP2Xe0If}GbeA=7Ne&J^a+q133>4gUm~#(XyvsNQbbd -zJ+SV=D(Hn@z$dpD&??f}cC)MuU%^V+W%i8~W6!v>0Ay!CKBIVL%%3H+0yC=o%YC(|D|O9Uj@?B*x%{=x$u{{r5Shos*@2DlID0N#@ap+TfaYgV85B~dP0%o-uS+h)+ -zE#Q{!Ca6GT^X9i3Jj9ebX5<>Pw>3s7!nbHcjm&|L(u(AOm``bB3zE5Cj@_7?AG>ib -zF4oX(oJjKshGk4A2rX+?b@zPr*4ul&I-MSSdr~XsrdD+0(oCj%X&&3xz^s2GoOi$n -z1os`8H}Ai&WAIpwswI!d0?IER*0Fme5JbU!xUl$gA!fK(iQ9Oq=mFM+>uyfkABJZ5 -zyeOLlyTafML3ctI9ZKpa$exh=zVKa$MHoYC_NhAiREo8R4-@b*rWPP=9=hgea*tunwO#5p -z$ChoOMz(AVH9g*hEq$Q3xM~ -zkn^$?l)16dbL9zABb%J(>S8JutG4_#Mt3Szo3VZ#!1}?Op_3P^m36x9ag8EKJ;}fH -z-uw^z-MHlW!6SKp7vk?%%)hxl;wf*%Td1-4*UY1o^UKkGF}KgZ`T4zqtdG6nwCcWE -z>JE7o_0pcl>u4oE(aK`oA-`+OzH?{Gk*9~;jar(~!`9na?=mY-T;es@#6FZlNNC@i -z1~rGdraocc8{wzt6YqhJarVhG?WRWB0E{Wrl$(Bhyc%kXkZ#AEV6m)Ti4BE9O?;AX -z=0>x*Z2k~xk`5${iQSUTtz{db&@|KM9nbr``#M41n5OZ@WVQ{D5InaF^X4`{hq+xS -z=eDvAc8eQnj$LoR0UiusM_AaQKz5#ua=O3R -zw_0ccNaQ886h)+b7AzPi%|R?T+1tXBzN_|71UQr|(Pspo5+!R?EeLO6?%I{21YW(1 -zQJ3R{BK5$Z@Cm(yeC-d~^&*t^_^T1?&WiJ$0J!zFZO6tT&W3nkL8QkA!z_^uC3hClM34iUsN2K+r-RjB+s#9s4-VJ!kWMcTLzA-D^-jUzLjO< -zPLs5TM)rB|wL~ATR_&wRYXz0C8#~}J?0~1tRa4sJPsnwH8#dW>iy1#3|F%JPe}q=i -zq-GIly<2a?yEb^N+K31hye@vXUw7I40#R`gzv=E3Rz#!JQH~<|EvD6~?KjSS5wo7? -z0^%Gzsy8F2OM52!=6=17-h8ncdbTjhwTO}Fk-0=61}?e* -z=8yN293Ne50gj1ZWwXLiH0$IgIv?WQyu_Ey%Yakl`ix9tMiBcOYpxfN+MA1fmMI;b -zKd)nHs;4GJ^Z0UgoZW;G$v@+a*}ECDcMHv4%-U*y5^)9`K3Lfw?Dtdj-MEiVVs}G! -z>GI9Tv-i4IVZAOUT-QN9x^5X}s&5+nR|-F#9ikY!L(PLvi@NK=qBL49syr^;9eqal -zqAP_TDdo@b^lf_@_x2qg{6Z^xT65UXLa$nd-D$mVv7BoduS<1|%L0jHBh`U1%adE0 -zv*p+qs?84?wk70a)trTw=B7`Sj$g9#Fj~h{KZ-NDi%|Xi5r5WsxPU#6%};f%?Dj0Z -z9UdclR!#T(udm*INAJ?^uYT>uj_HYb2aE59B%hrgfc6A+ydyVunjhnh`B94b;i364 -zX(gghTESoVg&ohu!U6h#`)I&JO|I(y7)<0&h@&v{2T?#mTyYduiJt>9{!m7lFSCcD -zk=$8gB-9)LCW=*O9zTjf0~byM7ps7ab%YDzAJ?D5imme`apzDKr7s|k#-xbwflu=w -z{(Dsw?x!N!3%E7x1wPVO!}DUXypaeDdc@QT>!8uN20KCx{`s$kmx$!r*yZc9^gmB3BA^Z>{iE|?@FMcx>^(CSl@82``(Tm=6Ymx>rqm*wNB -znecR(fu}Oy$xC>;UTFu_^Hz)E?azqPZW}0FfvECM9M09!5XS<|&`@CFmXFeNNp{z~ -z)dX{GT1|0=W(@Zo{$OaD4UB0cm4*#5R&cQKL}HG4|Bl)jBR3pkzEj%T8@wZCG&O+# -zrbsJ-7++*CbAchodQm>s#WV7)v29;Ho|9rhITf+%wA1+2lw|V=0f?l -zySnYKJ%gYbcXh|XC0b!|So2U{r&SYT9ZK2|35o3e`tWy;5BIYvvfTC!OI3KpAsvUy -zyHX&U&A@p*d0kYLUl&3A8oWWvzK5O><;p4| -zgjRhFib8XmT`FA&J5UP6*x(~Ki_AGDC9W8Jb7plR1YMqEm*>qfd;sRy<;ENfV2(8b -zFW3R5+6kM`E<3hiPwqslu7L|CK7m`8Zq<%G81@((74R6$En))B#pw;G%VU=WYgs;z -zC<{5-T*fR3VwTL1vjp@66o~xg4}7RsOanE)7{84`r -zn>~WFlWTH9-kL;*fc69f+Acu5l%OrD#7xmHx)2KNKJm2JKXlE}V8^oN)RmWH&9Mt6 -z1e=;iYpyxS5NyHij*CF>^H_6HR>n5RiS*GHZn(|s_;NC4E*fdY)!dwwhC2{H0}(Xx -ziZsfVo4xcoN-H5Ys%y?N*`pNUdvT#=c7pc_W08j@%~_6Plvdc;K&UxuFgZ#QDc?6Y -z{GKn8r@PJYDF(RUEXeTKWn$#h5Tj$z5ZRDTsSqb|zp>yXBl# -z9MF8bX-dN?!cHDY$=k}{+Xuq0;XZouRXTwoo&qw)7TA+7m=qS}xJ!SU-g*3@y!Y~x -zPfh4o;a^kZyEasA(yfp>sMHH)&B@St2@l@jCWUMZWlFisW9A!b9lqBS -z#TqrBD=Mlp`iKVwJ1oH5>e$AmtXALRL-{ -z&1pA&6VAI~?;visd2bVlT}yFzRq;13dXuoYu!tpwHF^dhk+$IUB%{O8(^{sQ^t3Gd -zv>^M`oPClp`lwtvzq=hzmaZwqWl&3XC> -zw08vM7(r;6_qigE&Z2S5$tw&xYX_Zm0bat6I}n5sz%5TAr2&lvc1=TBQ<9-vmxSWx -z*sm7c$_Ld&!mzuz7nqB~&IJA#iG<`$TN>#g*q{=O$w;l-?TYiU5F#uT8(63W7HS9! -zt$k$o(BJPBSRq!i1UJ{t4<3d7!M1gwN7=dvwtVn)F$_oe@Uh_Nzu!A?s0BBN2}kna -zrUiS53F1F&eqWgn*=YpXD-FnIeW$~Q5AaMo;Vq@lGiU3U+m0*B2uNah|9^obZW|CJ -zrC*SE{io;aN2e4e`H+kfBuflPZp0kjOmoz`LX>!K^4=!BBJ%MPw -zHWwmP(>vHY#}VOUk+d{C@v$GZAb0zAd|PPgCTPYqNLp4%TB>KhZyEGC6vNtCxu(#X -z{0qGl+VU;%+d5q@Lc9_3s>VA9;%pzASV*2^hpm7Sw`l&y>doRf*aO~>5S5DKO#ky) -z0axYW4UGeDR~dMl3B1J#Z$5ja(|;MxkzqNRE~^u>fvq_|7t_m*B9hF7fPxs;f3$Ue -zM)5@bv8rbH>nrt@fA_8z{$|0;gC7ltIDN)gR?09%CH93&zNf~e4HXiGIGEDU2jZpq -z5NGS1QUl`I*eBbzxkR^Z+jf^&3SV>N>uv-b$7lyLQsb*GzQp@$9IjAl=CVKZ##-2P -z{lRcF8yMsMTF=5sygAR(1@n*^!GBZO<4t3LZ@3tmp}gD}sS_Fle1pZz&3XK;t)oNn -z#z3CCaIDR2(+Hf#*(_X{wezwYNhE5l&03JcJ`B^%99V4=_g$N{K^>OO7sDEB>+_UW -z`L+34StH_A=5$*5*-)WU-;JM;&3-@{YuRAV9C>bNxZTFJ*&#+Qn|a2o^XE7DBUi7M -z^IL_!OqKdFJKuRJqr1eqP|NJ!hDLS?c3Od*Rwy6CJLJ!eHwwQwWryu$IthJ=j{L)k -zQ{n)q&UDzFm$_Z5MDf)RsVmAmHnc0Nm6me>Q8~Lw{hnjNzQGIWqISzpW$Br=W8;Me -z4H~5xWp^K1c^GXfX*%h2dz~$4Z8lnSx&PS#x^+Q!`Xd>Y%k^kBe*|?qAxo*A+l1eD -zo2W+J%hHbCF4Qi@-IF-}R?}`5ZXLV*qT-)K{}izp?`!bhnl8b9XWh0;1iOV&zHPY( -zE`@ekaU;)?uEw`)&R9TGJ#)?o4`2XDq;2qbX4S0tg%{9)$J>t8(mm%BsNu}3F&{PN -z=hbN98kMM#F={-E8U<GceTBDoaj@|_Fi}Wz^9YgX1oL|%n%ZlHInFghb(sl>zAT&sit`R>NL=tcRr`~iQGcJy;GhM~hZ42W)05+%<;(A;JJ -zz?tY$uNjwx0p{T~#yl*-JS>s(Fd#rj&m)EcZ2H-{qzt8Om<%=9iWfsCI7Cb3rNQT1 -zT!EDrPHDl{$pv2z&x0nwK0zkEWEidGTiuQI@>cgy-6e56?8K|FK5N^XGZ-;h556_t -zSf8~(%$^CE1^7_5v7WDX)2uOVf6RO~@olVUcUmK76%B%~cQ@8&uXn?m4MAJlW+$^= -z_}S?e!Iw0!InA^QhkWtgPY4bn3EhyQ -z93{K49txxEp&_;=v*jprhV^{A-K?84k;ai9R$YBQdj*l)tXmtPW2(mb{L@P4KFlxw -z0~RDWG`Ctl9uAz$IgAxqE?1;d4n4DvRwQX^Vb9VPtr1HqlT``NRI)1m?b_t-9c7hC -zQ1X+w+lG6$ul+=)v+;X0Ar4TTv=vV;(GId+OqnG-*WLyV@*=ElvbB8ns;F3e?-a2F -zdrCR>iw&UWYPyCvD$g?E#xCN5_3^|`*i{o>_jnDW)XjF4Zk?|=GH)Yf -z+am9YAlhB1$1{W1hJ|)*8*xe(N_CvP{iWwclBV6%6f0#+sm812ir^;~ -z;CO`KB+5c{k3>_pFQ?d%S2u98rSk#fSoI{oEL0Ju4NM -zH9xs-6T)=QM -zVbHGOUDd`}wrk*HYU&E+fJ^WNxo}ane8-}(fg`MpHW(T9q!FHXjXvhx+>sapkyB3DXV7D0I4(okTP?u<BDbpdvuojcp5BW}7!8r^pQ{$OanJ!-#RRFVMyy%lK4alwrnL7!UHc -zM@5DWgCn*y2D6?oF%0SOE;ov4EUyQ%K2=AIf*o8o!q27gDWi-+3iUyG$7}?w*fJRx -zQ_Tj3jgjMzH3s3$dBmY4O<;Cvh|8uXHixeO_L+iw)6Nl}C>{CbK9LVk8-rOt&BL2u -z6Ak2>s}N1VCLvd!EomCz2-JYUu&F?r804C@M@~rI7lT<3$s-`l%LaaqKN-NXg{&j# -zJP6W+8za}iOmQ&FoFLp9{H>Z3mhVXbN#>I9)#Wn{%}j=Zd9G#hb896DX~>e0p-s!c -zd5sNuE>iP*uARmMYsj9E4|Q@{D`_M`85rOhmfgZbYv4PDv;q*cDHLI^HuPzd-vYfy -zWjQU#;GGs@-1u@7lK*{L4kUi-%I?|C`Cd=+C%Rl_pV--_zCALsxBR7V(3bzo?uJmj -zdC|mZdxQx}q@Nj@;N}*nU&!g(XtQ<=@6R>-gD)Qj@5_fF8yw*m42|7$(Ad2MeuX*0 -zQ>ofQ_#J@Gr%kfjXlKZ08&T3_{ -z1@L#TYvcj6fjHIkXQ(~xS*nND0{TpDp^1O}l?iHzcv1R0O@2Hv25t>e1JQz$TX3KS -z_-4TO1+*QqrI+DDQMuo1t5T;rr#hzkg&Y3@lgOgNjbEP#BzM1jWYS{1TP)m_i*bVp -zI>Q>}d#@msUy(~|cr-%sRV}8c%7lOJRMl5N&r?-!JxsIyavIi -zkc~V6y}bqR_EoAr@?KfId!z2~z@y9gQyBAMYU8`VbQSA$yT9WSx~kcBQR<_+CCS|f -zFdDIg{DK6OUWLxp@cvJ!4n=gJwEG3mT<;vO&0|f$?+N*U5s!EZDMw$JZ9C3wSHN3I -zX!1svn7qj~-808O8=hijO23xgHqFcZmUEeVQ088gnLD%$_xG&kWh_`R6Xg7GGY$w7 -z?`pQpJqweX3%vPeAI~}YOY2lRC+VZ_Yj|44 -zx$E)d!^*l!^}4XT4OzR){j0DhS1Y(I)slV$7eXU-!K|-H4}cr+ZX>^=r#1Yv22VZw -z1c^Y=`ROh^E#@c421*(FzCxYsMBiC9NcKBf2yxDAMVv5O5z=cR$rT4s*RA@-qpr!j -zP$`%y3-Nfi<|Emf5AhTF7n}Ks+K{(;$QEWjzw5(OlH2_vwQDjAl&5|Xd5LVP07_l1 -zR@zaDc>+1=N|dSMGSrWUp8yY0#!rBU;M?8`Nk~q9#}X3!EmQy+&d -zjeawwman8YHu2T(Q3hZfm^EcX`9_DvA(~PfU?#pXYpyuF2YGJQnDqibY=lkBKQ?B) -z-w(@fVE$A(hN0mNZ(S;_8et7Bzb}7ygrzZZmpllZh-SGocsa}}o!IcO5l4>M+BbcbZA|J;b{uw -z7|$V}B&CL?EZ;x0Z5&~eSkROeI)-I)yy?cKJU5f3vqpd%bBdAHlo!=%sQ*kJc~e&4 -z!YOJ#w52AqDJ#$`DH8;ZbNG$Cy2GrKk|elTz}bR?h)08Y7<|Nz}8~)W%4jB#~dc0lFdd -z4a55EL>uCqQyve;vO*YUX})t#Nk(E>GBPZZgFH2lWr@I0XR0!kP-84>-#e`FC{Lzb -zY?s^$p%p5H91vs-Ja0Fnto;8zBTGI!v;$lA!Dk7rsk}XTcyFIs1Q_0*#Ca3r+}wr# -z%Q|ajWmps2KA^KKv+`fnVV&H)rt$8D4u^1NpL3_+WIEJq^CTGe11rRl5zXA{v3cescb_~2yIn*AfF2)S(f{hG -zo*{l)TaGpxv@Y=6lk~+D2Y|+M@@YMZky!Nvox-N0d%lHpejD|*TEJSb$TNrhOG1Bd -z#B(FRk!ic+^)+j2Om`W*tkyYBoKD^)YrO@;x3?WDTPJU{QcE-jg2537jA8IlNH3-KA&I(JrhunQ5u)>B -z(O`^ZK#qh)-~m3~*_Fe`PoD%nJd6+1_dR)rFV-N50Akci$owL=;lG7(drKuC_)bq{ -zf-pQ*63-=eI<$UhV~!gdqPb1f}T)l(@IEkbeF{ -zJH?PX3Xd?`{mIJNRSDcZJb}CZM{6wAD)km!Dc(-*K5-T@rkqJa>91A+w^sCA0l$%l -zAfMZDCZdS9wGzBvfcJj9e-7{ItOW1bd;Y16{&IhK -z;WvmgF@8^Z@X)ip?bsjX&E7Q#h|+p@+S_qAJgvfCY#cIo} -zvtqMs{lOWWUyS_a+^YkpgEhU%O+Oqw;f%pPE1FRsjDubxtQ@R7-b0ctI3T!dP%OX0^u#`>2mK2YQ;sv@e+Rrp)s01^Due@)N~A -zn3;W7nSJNwC&U&o^bRPeWcb}VJZWaG;xcQ953)~EvPWI9$gCkkkfQx)Z3fco(85uq -zRYNN7PPd*JDO*Az^7&`LG~E({$XP? -zob3}&K>z*=?J?x_tq3F(a13SY)GJ0A754q9hRsVIY+j}lToEta4&Br?iVv>13pR?K -zO0lw4ty9;k2QAH(`z^0nUDkEhZ3WHa`U_sOssE?CuK|y$yz_nMWS9(L#4)C6q$v#3 -zG#z3HlMj*^8tI(*ViH2YBvNZ#m;jjp#4wFWS;}gp)Ka&%+xmESZLg2Z^7y#ux?a|G -zS?cZMgT3AsUDt=Qu9tPaXswGZr4cD>Q!dTi-~a!fbLPz#86lnPCeO?{b3Welp7;Ox -z{@?$HqXCfUn4s}7@R-DZeS8G??1I23vbBGE-@vx+^#hwS+ag;x^!03wZo2D^_|}0t -z8CET97m1=a!xXR@7jtuU&T=wWYNU6|mb>cK19D!i?o*fPD>*Fb -z?Rys{vJZ#rvim;WFI?HbKqdK5cE3K9y+1Q&e-f)0{fOj$I{WBN%S36%kb4l(jccHE -zmVg5N$|FC9knCbe#-zta4D;tHsOn<^Nq-KKU2#CtZ$PpWkOY-o2_*NIPwp!9l)A97@XAN2-)>;!($ -zN`gx1r4v&+QTKi)W{OM0{RXYiBwA0^`Rjx;abyu|)1MAy-&qK5k$n>1CE3R%$6(G- -zLRa6q5?4nB0fE-*r&w_S(GETf`NRh{Z8xLh1rqu8}oqe%= -zStfh7AT^c2Kk#7JDXf!au%G*ME#3C2820^s0T634AU2V{;F=g_rWDxkl6pd9 -zDEqkQU*tb{yj$V%6m%kK&l#teH~@?yKglWmb(22_Gxne`0e(L;N9}6B@ss*G5Bi{h<3K;NO -z0uCBBIVfu|lkiW>cARonw0{<$=C<@0l6}(VVGK_mbXGu^A&6GGEy>`psx+Le7(xRbTU -z4CEyAn|D~kU0Qet>|5tN%h|ql8Z(bqGBfrk37#E86(aj0Yo*Rjtvry$URK+hmu?V -zs8r$SlY!dLRBhT5N^{t7 -z;8X28N|LD_Q1ciI1KAQ3E5cZN)j76T9cFvgv*Rra^*=31@?1t*6ms^ecHmm`_%7#x -zZH3c)SLn-QSgBcsTFwy54O00nQ0V;Ca)(c7t!!P&y#rxGtAP!5z=md1G6Qz5?87(p -zi!!WH^b2?P5WWq0ocR=U@N(u4v(1@kuF*W;{WMq7xu`q={t_onZ -zqExQkbS)D^?kxbZn+%Ax0%B26rcwwQs49VRE2~oNLQdsys9T`~tEZIA3 -z$zI9dbB~w`fHd0-6bORdw}94AF{5i`B-Y)%Vp$i7VWh!~EN|;vMkLrMtqYB)0ra22 -zwpXn!ows)FW#0-AUTQ!X(eH@V!5^*cE-HqsZWW;ef3kEQEC$ZHI+oFtKQ1~&llefj -zFx9Wtu7x1FWku{V0Of?CfyTnD1Y8w~fSYOop72F3?yQ6MJ4d7dw0hWIhYhxyCS3lUrOZ23(_s9C928(jf!Vs-^xR -zqTEH$trPv(hsZl_>AbX^d_FVoBX!wl(iG1}QGfyz{atWnjtv8sherWuyT%ygspmw6 -zsi3f|ufK1gcU#{r{hPjWcVB1kof7_XR@4L!cynNXk2?3&!t4f3FCG6L1V7z?-_zi{ -zha~6CLN}i0^wkM>O`RyCS#LNF&8Q^%B(JIUi;C>y$#q>1dHS=D!=uo7k8Qg%ZB%Jvqtx2chFG}7`BR#29Iy;;9ns#QHopW;qeu*-#~{)YOS@W@gB*?XRN)wmhE5^GEdF<3SE;V&;q>#Ob;7k -zddSK+9ZYXr0&Jr1GA)ve7NQ4&vLl9kvnr4!-t#0t@7dBHr=8te>6`Guztr(oseMd# -zU+(s36=Y(+-tm#G3>`&AT1UG(rG4+H2RyAx -z=0zy`+(y^~G-Nb$P~Pk^REf<#Q>S&DyxxcsBC4`|2>PPR6S)csJh1uTz!=wV*bB6d -zg5ZE+gd!4SS8hZePPxoE4gscGht3NRIGr&b&x*nL>|qoWiawfIiN>WBVzmPAV1%5 -zeJ@eLM^)cf^xn}Y-Q(+ef&bTOv6395NneQ>*#8=|_BUB;=NP3w{|=<*v&hzhU)Xzc -zm#A}4otL8RozES5V2MbFTrud{bMgJJoF{Ov*M%&AgY9Lho!*l4_MM_?#`j;TM$VMa -zQ49|<_JLATh?()HS0j3?Cb`=62_($$B95vwUFi*R*4eVi2g2r>k9_|n{B5sYC>+#A -z^OK^J+G!7`ONjOmfpalwr&ilzDT?uNB^^szvwQtB(DrP^TwxaA#eL!Lhrh38`4h*P -zJ}FCujIH6^6rj|)+@MS?_lkBDgd%fX844|NWo$_91(BxPWQbQWQM^h<&6S%1K`Xz2 -z%y_prmrt{vt1=-H-^`0J{tC|i5C~f7BUb2L%U9t-Pf(s&~K@ -zgI*thH*%e-K!E9tu86j+zGam;Hu(w*W+nkpl{)mp` -zbf5RE>)qhldiS=wHf`whq+rRhZs6srKu{rlr8$m;NAiMPlJ|ff*3Eml{$?P+3BAm& -z=+?_dcwQB(r}30si3O3NWAd&`b -ze6D*k*BLN^xUTG9G=LO#6F-h#`9|(vfNOHC4tFe9LCf%^FQcMXG!E`HSBops8{{z4 -zx(%ExE;*SENvLfbiIX8BYnP0KTzLdlL~4*FJ`63+)*endn`%S_@>CZi5>QJ-oL?8$ -zB7$?cUB5%v${IF{InTEBmHp!I{K2FMhjHd4uDuqqtr}e+&bJS41`pCok|!SgF)hKT -zw=c9OP8|^*syA9mJkv*!m_^}bhnKBSJl~csZ6Ca2cGohrbd*~-m^|g1``WVS+xlF% -z|5{WrMf>3}?WYlAn1~z-uXiLOh&S9UdyzzRs&B5`M=PD&%4Xx4Hww;|B%gVYXpg3A -zpKsgX!!xV+z2|o0?WtGJBVu0HvhFDDqm|ZnearEr7f&rt&kksZ@!ow}IJ!70D&&*s -zy6R$zDlIxMqcpdR%*o_AjO?J1hl%11WeqOcla;r=iap6+cLEGU%yYkny`6|dT!t;L -zjE`n-Q|m^^2;EQ+zDqb2jWIG3*9E&Jt{X-UL_%8nOu}_1R)ws)@=|>2If)3KX6i1` -zf5YT_M$g6Hjhw(Upj$b8#&K1tnFOso%VU@-r$`P2EtWazetJlrY_pM)4+esgS21&m -z2a#Q6Vrr+3b6(JZ9%SypH&A6W^R?v%G)bwIl{6^XIZrxz6sIr3VPzGKjSUq%`}g#)e^H5d@jj##{n$I`xYC`fPW?o -z{@D-yxgAt0E1?gf24IBhYM`coeuvjNDCQAY=rTA;cZBMnisQ+5B*!3LVY^3(=ni=k -z+mZR9sXhbyZJ<7*rJH;Ela<7YQjYCeZY%tYhr9KDC-~NEwDmNeQ+D$!*^{!xTbH?( -z30L3qo+9L}qo{ar9-5(z9N8hZiC!-_`5fFq99HX!c8AmU-f(gVJgf#>>t2d!2e&#w -z_bk!gUU7OwtER=Tefv~rgQn?XUhlfJeIT23dHhN7i^Eafp$m_UgQq^Fv|b~czAM~& -z_Tb?XN9x>b`m=2t?7fcUxrg-RI}7KLjJP%Kiff|J)fMY4<@TK6IJG!nw1t}0Nko_< -z>=3;ze=UY=e5(eW^zI!e9co=@L~+~JF~0;i6*8Y3xT%m4<8*8ecxW58Kftyf+Yq+P -zv3(U{$ghBUDm4}}%Yxf)!d&$#fDLohsVA4)`_^yUI^aofxx3FZS#0V!JyzOpIuuO- -z4+MU97&9F^W;#esj(GVJo4_b2vvlg<)RL&yGrkU!t-TXjWP3(SkP#dd7#>%VK$*8aPeM0>!= -z(gU*A$)~gxWfQ$8%~n?!Fa(c6C1Cs|-aB%vIx!$%qrp7VL-R;?x~x?6*qrwvspSja -zm8G1?!gKATm&8ub%6inF6Xo+mqO^WjHY+Ok6{qH+`W&*&XAh;yaLpFJ#(_$x^Y?sW9&=4={YU^z4 -zVT6%>?2*QgrGu@74<H?gjJ@*4UBJMSW0z*UNmqI|p^D-rVK>fvQk2N{z|~jbVdcOpztXX(&}rPVdcX(?g8sO#`x@^tfxu2^JMPnW?iZfs;m5{a`>WU`B-r2~Ee -zG#Q!bB5Li5kq@|cz1HPYN0c~Cm&7^^k#ZUs46yFhy}NGdbpELjk&B{wew)Q}0^7aR{_LO~} -zEqUNETk^;Jy92+q@wq)bYgnU5!v-{zy`DaZa| -z99#D|eedLB8jiW}tMhUCPSLTEAso8~zm_~s-(7s{4IFdgSM}rcy_AprB<0wL_3v!y -zWAt6a$DYBl(xey}c?{p#az6Gbj$MaiXCA|MR^ww2podQC;mB(lCwhppe0%`cUXNeT -zKStlL^RYF!7CycBeIWBGzV>-O9>;O4$m95TGk!k)I3KUWamT*z;P{S=<1yNPhmV)z -zcrhPOW{Uavb~^sM5gfPk@kGYX$Jg-jQ#d|@kNYz-_;{R;zl!5dK3w;VpJyU3fHHYlf}7c -z7qx|avXn#?+@(zGR%SmKAaIv%L#AzqOhZm|OdQ`!y!ZBzTUJWH*q)Wh^H|(Tb4}w< -zIS)U}@#kswx~;tPxfh+Z!h$L48dqqfmon_1-I7FxeN>{9`^c0A?$13r_bx>C)sRd=MD=f7Mugxb`_n4){q -z4t&?8<`Ay6qqaesbBgv|$h;ojC@PZn-jq(d`yZAH@| -z-a}@8!Co*n!hP=;i~|_+!niSu^T4C=0bJ=80~36}1V11npodg6aQ2>58T9GSs;{`q -z7%yCe7bdh7_*OA|zm8jJAtuL1c&PG$YG5=QA<6fX!t#-zpY39_VW=V-{72;@b_wt=lS##`}W5=pG6SH@0@Chr^azvC^(*b3#`#e7C{ybn|1M-xjZUj`a-2yxI4 -zVLUyf`9*a!n+bcrc)8K6`WN{>;b@|ZS2miql0xGqR0YjA6~ShyQ;grv)E$wkI01@^3H1y$(r1`R~`)+b#`UuJ}vYL -zQ;;GGKo{7MB&|mY5_1G6(a6|03w0mLx|sgs+WAJ64-mvM$o-C34ij#JuH6G$w{A;2UAyn<8`z#&;?f62 -z%H9yr-1?Akgbx6sx`ZdHNncErHDJxpxTgde{I{c8^gk!(Zqt%;5Gib1gs{`Z>O{Z5 -zGY)*Fp}eXN8RF*w_Jfnc9s`;W>`}kG|8C@|_G}y2bmyIY8!(4_xxmzl93R9ZWvY*0 -zBWzJ7=qBNjRYUe?OY}*s8*Q|*0)$Cz2dTEE?Q@+}u2C=-0}RYv -zBQe*OfmaRr9W%~44-&6I4T6i}BCS|=2~^~0B@BlD%MtidKULLAc#L1q;Mb#7t#|gW -zzYD(}!>{k^uQNVJEPU?4a=|X-BdvC#Vqa=DzKc^%*!7G=%?$LVdY7bqRuBB?O5^!e=~8*Vp$NA41MuGwNo~7L -z^2BT0rq>Uj{Z6U^lxOE>8bMm^9Xy09TY}=agM8m@FiQ-%SQM`WQy}?yp -zWXC%d}_|9mHHbwH-n2->){oSDASI&N^G5LJZo=V*?ElD -z=x@{3*vQV2GGT+c -zl{f44QR`;u1&`B;oP&kiY`b0>)SB3h-WZVh;@oL=KMyt`HGsv$)VtXc2d5Qh^JuQ) -z^;|$4r*q>OP#b4IMU<;!2Yndxs!*|B@!!`O8nU#t$>!n~tm@^EF6JSX?;V80ruAa% -zsu*0{sIXtP=Um`DxR|p#P4M0^#<#_?l-~HR#TlHkioMyj+^98hTtN_(<#MAIRZeqR -z%%H5gZ9Y2(k_L_*!|Cy(MlW|YGqLNmwIw+^r#0WTQaWg;asb-}{t#0bB5OBSzycrB -z>>Q0Y40&eQC^-I6ST|lx%?{on;IXu7NSsLu+kVWZ`^8a62WUN!A@MSJ -zuxCC+x;R7?`0r!zV?TlVMjGSn=&^5BHky4yH^67{;1BtR(f1RRouK$sU3t{qc -z$-{q(ib}SJt6QT;j0r#TAK_QjxE5@@SN!%V9BHWEB|eK7oCBgZvGc>>`D;Z}M(jge -zkAO`4d|aRb=nHcuiS*9Y)55UfzLcV=RYHnAf5H8b&i!wetP! -zNMh&j&MazO{zZK`M&caS*TM(>1buP%k-MVvqU%+7)S{jAYSb_42_m0gulUUw%oE+T -zpL-t~ahy3uXOcB^j;$oq%NZH -z4u>r{(MXK-!K9)O;&njrNn<9n6f+sn73qUC -z%LJs416OP3M~GIV@YEAk&-9B|Xbm+4Eh{7L+bDcQ560DpCz^rMz~wUwnZRaHm@F1i -zIIqS!DWzD~3IcI6r=SWpLrf5JrBA+-kZExlViDKOB`685IjW$Z;E(HzQZFG%XpP-i -zsqg+$Cx>OxRe53%ORQ!tHEhb9uq7?YpB7J1#5i08%r4aPOu4x+7xxuFR(?85pR18a -z*K55l6(S^&dJX)vEa)VSz-b=9Ck|0FGG&Qi!&i%q -zixrNAwR;ocBsOvZW)oEvY-G)>xtSBW5?B}nTG?RGN)Pzh?Ft{GIm+vZ -z45PW-QC|Wxgj-X!IURp^r_}L>ACzmOxO!u+`0ycY2R)csWPc#-Zu1;TG5jcd!6?$# -z>cALUn~47v6~=Qj+M`FKZIP9oOjTU8DoC}|2`2QJMDbI5{CkzYQbUWAOjJ}o6JsP9 -z%1BXA4~5OHjz#>9Egw}8l+rbx)Adv`l=^5~H9h2zRw{xmY_Bm;S|LL@3u#d_Omb*2 -zyT6!8SSHpngnBGsxuq^<6|;pSR*jb7T43JGN!5Za>}YD9RkQ_pFZ;ZjE!SHuhuK!% -zq9iI7aVv6u+v?#1Yy;qv$TB6EWMRV^P=LNwQC6$6Y8q$K_!akE` -zpTkz4>;3X(tcsadH}bSFhofGams+I#zl+U<)1i>l+Lv4FgAQcS33x}JZulNzB5> -zR&`c1;S(r3D;9?5VD<^!{A;VNW7T -z_qPG?qW!7ucv>Z0S@o2t{A@_r7vpN-Y`9UBkoR8X1GlIWuRSHIo_#{N*3*5$w4Hp| -zivFL+>Z(V0V6~~Lr#q`*GqPb8yjj>qU9b3${V7!09)85^J)Ze0em@1yHw+60INxsu -zne(xA3*%R+rDiFl$=YEGqeycS=!7N%8m)h*9LCfMwL=BcH83MFc_OOHkUogW@sAfz -zl$nYq#fq$e8-QywX9*+q8<@m>MJ_OZwsr+O3wG=dr;ZBpWWf9}>SJwI9EzK&Tdpyl5 -zl6%y2Lei|F)|0~)4Iln)lq+I^s7hHmxh|&!0l3(ibQe%)b}`dk5G4w7XLD=*a3%!Z -zVZqBftBQ5G+=V4qIy=2oS*C5gh7A%#m4rE<%#8+R9t33`9z&U{A?KbMMVU>I?0Z13 -zPbsuH!<6GBCpq@!c2M0MvKWu_CRcTb>O&$5`f~}$_WyV|wbWfFUP3$tR?|5~r_NI+ -zUOxDgXfl4!mGm5bO8A2P;zLn$L%%pK7UJluB9H;+_)VumwK5|G%Uy$Nkr@$G+c4@y -z^O$|u3S;|I5S`{9L1}vl>QnlvsoKGn&OcUj9*dsdb;$VM*S~Gx4?TDHuipy)pZ;xq -z8%Xaf)i$Ym3-Du;fghHSn(M$9@F$v5wYRP$__;O;FZ?{T%$tC-+vyV;;*8zx2e77B -z0&C1h#Djj%u)g@!m!F!K+FA?3OLO+HV1(Cuup#}2avMzpFTGlO7>oa)VwoVfbCXF) -zHWWnK?Hr>C#0ZjQ+GfRChF1bCHyg0DEC37VEu5(z2bDi8J<}s+#4%c>#r7z+wWXKD -z416^2eO=#Yiib`QO2WaxvR)y1o)E@G#p_M++p5i@9LpmDL6I8j8YmJQhCYnaQ$T;5o$YEt&FUvo<0-(@n;DjOD6m8a0n0lKST=!gw-Vo8IFB=l -zL;;yygxNq3kim26bu}aj*e8zLU -zg}LBR|pQy%oYR5q?w{ -zUV+OVtFk)Vug56)^zb~V-7MmC#j8P8;aN%7RYiN;v|Cr?pQ^%3=@^!oN_nXv5Y4$u -zNK<4OnTK++bFpQ7Yi4{5H|13LAY>W66#j0++7Yl7*{*PJ2Yc#4g9Gj8_0|<^#tkb= -znKf6&RY#|v50nR%N9R>6LUsvPYfyKz9Wm_7qv2}QBMHBpj -z2O<}s5@V|(G06^5KBmslf?t#e5kBjt@D9~7;ZhHEqwC)Rq$`#)*#6i8xp#i+)yDKuodtRUqq -zB2Gb{Nz6y%6shT3Tt+9rPOnmoL^zGJX(-JtEVCGiAf(-5_T$7zgj0kYwf(p}S&s0Hy$s7cYl>v%e!WBUw -zJ*Ok8aEwJQ*Jx=;im0o2F)RP;jZy?f{khqODkr2@byWHiPM??{eeQZK18=V!{s~ZL -z#-Prlpw45etoZd|@Z7S|vf{!+;P;P=mK9@V!UwO?90>Vd21p`=pR`58;N|$VOX=`C -zH>3l6hJUxw-~l1Y@m-st@wKn7#!+yD)Lc^neDHLt%9H^goJm#CaobYs$hoA$)0)kW -z^rE-TIUaw0^C%tOvMP)4o}A6r;j(F -zUsuH&SR0EfaTltJ$qH2zNlZ)%9AzbD`iycZnDM-UGqeSx5Qyfz>iTY@Y#D*5=2?|` -zIZs?L8c@$FR$}HH(NXs2+`5m>d?6|`!%Z)Jy0x#!wHrf^`-(xE&ww_e!I}PV=ih){ -z(`-;?Iq7h}J`B2qf99|KrmYB;;bMF=TICJ@pjUiQ#rEMO*@xRhuo>Dc>oD7tKB!DZ -z4ePK*)?nC=n^fyCepgBBFuu==4ed`M+bTs?e&|KCEa_Yn!A6?a`By-N5)sQF=eKw5~+*@iz&-7>THYi+y`UoJWlb!kn_OU -z@4*Z8dTjtwGKUo;B?k;j+y+Xd6%T7hbsn)8A8a#d@etAC`43a=phQm!@i3lR>4_nJ -zx*k#rxBc|fAu;6H0z2=Jcz-|UNaquvojNhpC1|Y_6iaJ5MO82KigR0VwjH!|$e^XU -zqi6{dE!V|7BwC@U2@*}ArkGr0iB0V~Sy-WleqB8^A#Tx%AS8T{QSU=Wc}P0tsOg;amn2#y8vv*&*Tp=jX;*>tL#ec?1SQ2&yf9h2^NJm2 -z@f4d5@f5q9c#2(CJjE|7p5l{;C+WBxSK_ut5ftlzaV4NQpv>Z=<8oZqRx+%8If9bp -z7Uwj1)9g!7u5G*4oX!}S0h-!o&{P}}s#BFvA3#E#GbEH4A_?`uhbh?Z&U;euAN*jm -zDs$d{8AoGeNA<*I4!w9_`tsUa6SDm2 -z0ll~?0mHMVIO=1V(-&31un38dik!~*mT{i^U|coEDC(Ml@z8F~h68cGWw$VJT9Ipk -zSd(sw9|Nal9=7S7`OMbtE~Zdoz!126_e8i1ECzO-t45xlhfRO^4-TZ}=KST~-ruO_HG&g|o3$Q)=KbKuywO%L;5y=&fqrgqOp!xPYeu5hbJ?ZoAi1l -z@+GRG&($)Z%j7o9izP8f(ES$8kIET^{&Ao-b^NM$mLx-k?NDxSld+K8#S;{(p)#>U -z>Nh&8uKp^iYgl&bekGtJpd=*WU^E?KI!E8iSzgHiESO_W9|6;fz_r>}ohUBDaHpBs -zR}IN))w+>XJ9H7U^iYm!%`7B-M0qs9=9hgVT}Kq<*FevZ$VA7KZH=-O^op~$XRItD -z_=Vh4Sd;ykLK$1wfAlsyz1pG?nw5b@43wOLNT6pHrsj=wZH50X5lKD!tLgPqr)W~C -z`mz>#i`w!c3C1||;_5NJUJ+WVkY(fh3_4OwM482 -zPAfTmRS7O-biHB*G2KUq6jv+0w1yAu63^G}+IsiE`o6pVXl3^jIJ+*HthSh2+hN2< -zNH6Ri2FCBhyy<{BZvwWT!6$BD{ArR??;lMyADo@$?9-`+`6SVdTpnkuQ3tzLgpM5$&G>|1w+P{P6#Gl? -ziQ+e`i89~EC<>7lbq+~uE4u5Nb5CvE<5GgwcFRO?dj6H6I=_p+XP&metr!+`Djp_F!W%H -zHDTga8ofc8_Upl*mF$v3gW(&UbKp?Va-vMVQ8A&ZEpy3VoXxEcsrPb-uHL8^*mON= -z`2j+(&=@o}=dA2{H0Q`y-^i1(#^&6lNRRp>rmj}c>F4xDB}b=@P%Z0pl%}|PlVTXu -zBMsKw4N|trgn)7msWwi8M0YDIS9&;Vl`?LS!`-9~x6-u+PTHq8NzurrLp>0&pwZAI -zyQU((7sx-O0I_u1qagibYupQCh{7$ui$^ -zU(XN!A)WZUv!XI}0mq!lA?FNXOF8f@(tf{fKy1q{D!xbX(XyI4(e$_fD^+^1Uo@m# -z?N5u^l%uY7V{i9HXwn<&=5?H$d(Wb|8T1dmw98)JyK64@a{i^4Uzqzd?Gk$WPElzK1X_PO-Hi9*WGqjRQP)S$17+rUoFf!!v8@YqJC|wX1Ri10obM;?kPyfw7q#b|%E8$ML -zsXv|-xbH>o0YHg9 -zH1kRAUiVlrB6#L?FX-c8)Egx`zXMyUmGn5aR4M5x$ZU=tlY($+d5wJ54F#0WkjJFc -zV8hZGW_RK#^qIt9F;1r$EuHfes5~)RtW1pbcr$Zw=4j0A7W2~3>J@s|a*N+FCo{fG -zhSmVsd`cTM_!(ZLBzF(-u0cbW@<5mJ0V2e^oZt)f -zWZXjxMWV%WCK%g9eTb-i>weQuP<&+AXdYc;WY!Y5gI -zSs`)(x$*n3kA(%k%n0c2D#LMEy<0Pu}g0b4!m1(;Mo;U -z=WGvg;1^c(zWKrm*3VFLm$XPHabuU1$XNF%LIifP)ajBX_-#wONdM~J>%)^eSk79y}9z8?@iBr&hQQ?&(`%^rFG|eg5D# -z)>TtqNUuVFj-Wp$cV&BpHk79R^~4?N^U$^~p(^$_Ne8B*#d|y6ns+b8*GU?X#|PbP -z?cu?7<%n^gAr>MwBp`}ed#ZuWt(4(VNpM(L)Qh~-;&>)>#E0vIINJG~?L}yW-XHB* -zuhrU7Px+G1QL|Ba{`Iu*WoEwp)Z2euhvzvSfrkH3;#4R^y85c&qOT$brLyCsrlszA -zbWge@GxO*F{jCGS_sBOBr%K&43hLP4UA!G9or$XAr8Yb-nQCv}owom1T<>wE-HB5! -z(Y@ycbkw4Xj+4S)&3bFqi~*Ow7+&y)QgcXiYlkkMa(Y+1(B>)HU-z&7v+En((SF1V -zcbxpfNOIlip8ak&_pAf9`O_)bC}&rWeW!_gY1>7;#9hy)TL1CKi@cJa6iRC}%IJ!ZbwrIVx;UpnDUcvdKH -z^tSOvUi6|iRhc-|EBrR^j4I53zBtgf3geN&7~PMvWvIry#kDyc6{PC~9GCcMKK`yU -z=0ul(%d3d`?!8nE8mhWOlzDDM&CuEN&x)!daosP)>>`nLX0r2-6ro`M(tI -zq6hF@RrHVezQnmRdBOt7ZvkY2oKf=DJNAF -zGlyE?aSe)lv)T1?f4=wF;QWvvO!tICiO^62zv{$BkZ^6%X`HPC<#;;pHmIWP5PaEE -z7nnkaepD+ykvg5!zW<5`Tm)1;LzDpz&(Rw#y(Fn?ho}NnYBq~_Eh@@yoB8h3-S_j{ -z2&*m0x!sTl>xXxzb?|g3LN$?txtdv)KaLl`6f89b{_499^*n{&A -z_|_QD6xoc?PPxyXt{KzLx@5)ZHhk?T_Wb(Um -z{mv67d2VpsnZtv9r@s3Q^F4IDsb?eJ%y^&V%N-{_C1}=6apLXBMwTYe!AfwD9TCh^ -zL8T!bThHG431P>cNABSocX*2^!>1hk75LO5qy317=gqcvWPJG#e<|$g3&~T7_jV7m -zrtQX@%h$b8I8%V8XUS{yQ67(Lt -z$2LgW)NDH${%&xI>W;T;dgtA>E+6;|-rfE;N77zj!m|oncl$=nRxf}f+JAT?UE%>J -zw)NoC>gn*s>CFe<#vN5UX5U`4{{x-oxFqHay%)bQKHJ*Ct@Pb(%R5e1i1s}xr))3vXvfLodEhSX)tog0@^_W*Tb}`}Jl_VC?36KuFbMFqdwV?J -z`V5Xq9Kh%fqyCKZXMkh%&42$=y0yBkx*OZF&jGrq8Bi9(xK};!*>+emPF3IRYwJB! -z1t`$iRQ>ViaCAPN;@j)})@RzN&3PDI<4OK1#$xXZj|T4lkNA*K|c91zuzFs@QtDg)S?0Z@w}0Jk~)Ctpw}@^@v2X0|9aZNPkNWzJ;?2zpmvY! -zMYge8QM%QI_B-MFTZYQPov4yfwjeHQ&1Zt)U5r2WGx=;K(J>1Z;Hw%aNoV+Ys(U -zUx@#HYll}fw~A}ud*Z}>*v>rl#E)_9iTkK`OV42)J)o6P^iJ>b_8qp{(yh>hX3X+H -zY8I&(}p)vdoJoV9);G9_>Cv+==-w@Nbvw -z)wXN@?ZELtoR5=sFep&Rp#AvQA+Zi1J5d>qyXmd@3it#?Vj_SZ4)e1d;1T6XXJRK+ -z!Vu6Bg}>viYj<_tz3R01B(564kqy`$y>5qA!oGc#;Xo1Pgmj?Kkgm{NZUto~(n}f^ -zi1u_7%Wz#(;K@`2#Rd8ONim1kUiaBk<=~!`@DX=&ZSm`1gZp=>MH0-sh{r%nWvBK+ -z%F{L8b@q%qSxLV%(dU%XCg~b*|Dx@no_4Go_S+gn*Wi15QNg4dyrPLls9X2n7Y63( -zr%idYYVXZ2Wj~Z~&fM_COYnzUon`x8WGMR({3U$wJaR(E*im#!_)(Y32bi4lv}G2D -zzjX7_?4^v@pCsIz5AUR+QyDwewmNyF^H}1&x1Oit7=d+vdm6fhtGAkeZ$x$5@6jG= -z+hH{S=>Mi&uH9MurS0Bu=g$bAvLoR@QMh(T(PmGe=+?BeD%4xzDNUl6_hviqmU=MS -z-9dPdh!z+22aSD!{ateZ`~_-jkhI4gJa#4akeK_cz0id!ph<$qy?^vv|M|n`-~RQ> -zzrO81-oCIAHc20(X_Yth-2)=-73n$e?oGR^#J@f8;O_2F_%G;vlUjH_MhseC;=Oaj -z&>}YpCq`t4A+rw%C&t!=BfD}(+HhoBJ+dg*k^HFs%h{6{ -zmmSrcpz~}J?j}IHJB+-f!?5@IrEDiDO%gkXb|gQ?p269v4SY(L{Zb=d(uDS21TVj~ -z^Ww-wwx)hf+kK78+LIPm9CKaZV}si6A|LPl5%#?1b=p1VF|FM^W_uTwysrZb4`EB1 -z+7WEO0q3%9*xrxdPHex4?QCrKV!IpLZ(+L^TdI*bjO`yo!TVEezb!-&v|$lfrqW|< -gg6ir!`<~U(1)i-b)aUDnc{XesfaArc?R}c~e*!f^x&QzG - -literal 0 -HcmV?d00001 - -diff --git a/AmphibianDNA/HFS.lib.idump b/AmphibianDNA/HFS.lib.idump -new file mode 100644 ---- /dev/null -+++ b/AmphibianDNA/HFS.lib.idump -@@ -0,0 +1 @@ -+OBJ MPS -\ No newline at end of file diff --git a/AmphibianDNA/InterruptHandlers.a.o b/AmphibianDNA/InterruptHandlers.a.o new file mode 100644 index 0000000000000000000000000000000000000000..9222b1a277c97a752f199e2adb9f9e2f02dfd2fa diff --git a/patchset/Custer/6-source.patch b/patchset/Custer/6-source.patch index 9e0992b..9fb8036 100644 --- a/patchset/Custer/6-source.patch +++ b/patchset/Custer/6-source.patch @@ -908,6 +908,92 @@ diff --git a/Drivers/EDisk/EDiskDriver.a b/Drivers/EDisk/EDiskDriver.a RAMDiskMediaIcon RAMDiskDriveIcon +diff --git a/Interfaces/AIncludes/Devices.a b/Interfaces/AIncludes/Devices.a +--- a/Interfaces/AIncludes/Devices.a ++++ b/Interfaces/AIncludes/Devices.a +@@ -93,6 +93,25 @@ size EQU * + ENDR + + ++XIOParam RECORD 0 ; Large volume and file support ++ ParamBlockHeader ++ioRefNum DS.W 1 ++ioVersNum DS.B 1 ++ioPermssn DS.B 1 ++ioMisc DS.L 1 ++ioBuffer DS.L 1 ++ioReqCount DS.L 1 ++ioActCount DS.L 1 ++ioPosMode DS.W 1 ; must have kUseWidePositioning bit set ++ioWPosOffset DS.D 1 ; wide positioning offset ++size EQU * ++ ENDR ++ ++kWidePosOffsetBit EQU 8 ++kUseWidePositioning EQU $0100 ++kMaximumBlocksIn4GB EQU $007FFFFF ++ ++ + CntrlParam RECORD 0 + ParamBlockHeader + ioCRefNum DS.W 1 ; short: refNum for I/O operation +diff --git a/Interfaces/AIncludes/FSEqu.a b/Interfaces/AIncludes/FSEqu.a +--- a/Interfaces/AIncludes/FSEqu.a ++++ b/Interfaces/AIncludes/FSEqu.a +@@ -206,6 +206,39 @@ ioVFndrInfo DS.L 8 + HVolumeParamSize EQU * + ENDR + ++;;; ++;;; XVolumeParam Record ++;;; ++XVolumeParam RECORD 24 ; Large volume support ++ioXVersion DS.L 1 ; this XVolumeParam version (0) ++ioVolIndex DS.W 1 ++ioVCrDate DS.L 1 ++ioVLsMod DS.L 1 ++ioVAtrb DS.W 1 ++ioVNmFls DS.W 1 ++ioVBitMap DS.W 1 ++ioAllocPtr DS.W 1 ++ioVNmAlBlks DS.W 1 ++ioVAlBlkSiz DS.L 1 ++ioVClpSiz DS.L 1 ++ioAlBlSt DS.W 1 ++ioVNxtCNID DS.L 1 ++ioVFrBlk DS.W 1 ++ioVSigWord DS.W 1 ++ioVDrvInfo DS.W 1 ++ioVDRefNum DS.W 1 ++ioVFSID DS.W 1 ++ioVBkUp DS.L 1 ++ioVSeqNum DS.W 1 ++ioVWrCnt DS.L 1 ++ioVFilCnt DS.L 1 ++ioVDirCnt DS.L 1 ++ioVFndrInfo DS.L 8 ++ioVTotalBytes DS.D 1 ; total number of bytes on volume ++ioVFreeBytes DS.D 1 ; number of free bytes on volume ++XVolumeParamSize EQU * ++ ENDR ++ + ; + ; The VolumeMount trap equates + ; +diff --git a/Interfaces/AIncludes/FSPrivate.a b/Interfaces/AIncludes/FSPrivate.a +--- a/Interfaces/AIncludes/FSPrivate.a ++++ b/Interfaces/AIncludes/FSPrivate.a +@@ -522,8 +522,8 @@ RegRsrc EQU $347 ; (1) flag used by OpenRF, FileOpen + FLckUnlck EQU $348 ; (1) flag used by SetFilLock,RstFilLock + FrcSync EQU $349 ; (1) when set, all fs calls are sync'ed + RgSvArea EQU $36A ; reg save during async calls. +-Params EQU $3A4 ; 50 bytes long. For I/O parameter blocks. +-FSTemp8 EQU $3D6 ; used by rename ++Params EQU $3A4 ; 54 bytes long. For extended I/O parameter blocks. ++FSTemp8 EQU $3DA ; used by rename + FSTemp4 EQU $3DE ; used by rename, ckfilmod + fsVrsn EQU '1.2A' ; Current file system version + diff --git a/Interfaces/AIncludes/GestaltEqu.a b/Interfaces/AIncludes/GestaltEqu.a --- a/Interfaces/AIncludes/GestaltEqu.a +++ b/Interfaces/AIncludes/GestaltEqu.a @@ -952,6 +1038,20 @@ diff --git a/Interfaces/AIncludes/SysEqu.a b/Interfaces/AIncludes/SysEqu.a dCtlDriver EQU 0 ; driver [handle] dCtlFlags EQU 4 ; flags [word] dCtlQueue EQU 6 ; queue header +diff --git a/Interfaces/AIncludes/SysErr.a b/Interfaces/AIncludes/SysErr.a +--- a/Interfaces/AIncludes/SysErr.a ++++ b/Interfaces/AIncludes/SysErr.a +@@ -229,6 +229,10 @@ badFidErr EQU -1307 ; file id is dangling or doesn't <20 KST> + ; match with the file number + notARemountErr EQU -1308 ; when _Mount allows only remounts and doesn't + ; get one. <27> ++fileBoundsErr EQU -1309 ; file's EOF, offset, mark or size is too big ++fsDataTooBigErr EQU -1310 ; file or volume is too big for system ++volVMBusyErr EQU -1311 ; can't eject because volume is in use by VM ++badFCBErr EQU -1327 ; FCBRecPtr is not valid + + ;__________________________________________________ + ; Dictionary Manager errors <37><36> diff --git a/Interfaces/CIncludes/Events.h b/Interfaces/CIncludes/Events.h --- a/Interfaces/CIncludes/Events.h +++ b/Interfaces/CIncludes/Events.h @@ -2431,6 +2531,19 @@ diff --git a/Internal/Asm/DialogsPriv.a b/Internal/Asm/DialogsPriv.a selectDMgrPopMenuState EQU -2 paramWordsDMgrPopMenuState EQU 0 +diff --git a/Internal/Asm/DiskCachePriv.a b/Internal/Asm/DiskCachePriv.a +--- a/Internal/Asm/DiskCachePriv.a ++++ b/Internal/Asm/DiskCachePriv.a +@@ -117,7 +117,8 @@ LcGBinDHTable EQU $3B ; (byte) set if the block is found in free queue + LcXCacheKey EQU $3C ; (long) translation cache key (buffer) + LcXCacheData EQU $40 ; (long) translation cache data (header) + LcFreeMemSize EQU $44 ; (word) free memory above OldBufPtr +-CacheLclLen EQU LcFreeMemSize+2 ; end of locals ++CacheSize EQU $56 ; (long) subtracted from BufPtr ++CacheLclLen EQU CacheSize+4 ; end of locals + + ; The story w.r.t. BufPtr, NewBufPtr, and OldBufPtr is as follows: + ; diff --git a/Internal/Asm/EDiskEqu.a b/Internal/Asm/EDiskEqu.a --- a/Internal/Asm/EDiskEqu.a +++ b/Internal/Asm/EDiskEqu.a @@ -2443,6 +2556,18 @@ diff --git a/Internal/Asm/EDiskEqu.a b/Internal/Asm/EDiskEqu.a MaxRamDiskSize EQU $0FF00000 ; maximum disk size is 255MB MinHeapSize EQU $00260000 ; must have at least ≈2.5 megs free for heap +diff --git a/Internal/Asm/FileMgrPrivate.a b/Internal/Asm/FileMgrPrivate.a +--- a/Internal/Asm/FileMgrPrivate.a ++++ b/Internal/Asm/FileMgrPrivate.a +@@ -86,7 +86,7 @@ size equ *-FSVars ; so we know how long FSVars is + endr + + ; private bit for ioPosMode +-fsCacheAdvise equ 4 ; set in ioPosMode indicates request for extra caching ++fsCacheAdvise equ 32 ; set in ioPosMode indicates request for extra caching + + ; fsFlags bit values + fsNoAllocate equ 0 ; true when allocating memory is a very bad idea diff --git a/Internal/Asm/InternalOnlyEqu.a b/Internal/Asm/InternalOnlyEqu.a --- a/Internal/Asm/InternalOnlyEqu.a +++ b/Internal/Asm/InternalOnlyEqu.a @@ -4489,13 +4614,13 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a __REGISTERROMCOMPONENTS vIndirect $2020, $00e8, A1 ; {sources}Toolbox:ComponentMgr:ThingManager.c __MAINCOMPONENT vATrap A??? ; {sources}Toolbox:ComponentMgr:ThingManagerDisp.a COMPONENTBUMMER vIndirect $2020, $00ec, A7 ; {sources}Toolbox:ComponentMgr:ThingManagerDisp.a -@@ -1432,233 +1423,11 @@ BLKCHK vIndirect $2030, $0370, A7 ; {sources}OS:HFS:vsm.a +@@ -1431,234 +1422,11 @@ VBLKDEALLOC vDirect ???? ; {sources}OS:HFS:vsm.a + BLKCHK vIndirect $2030, $0370, A7 ; {sources}OS:HFS:vsm.a UPDATEFREE vIndirect $2030, $0374, A7 ; {sources}OS:HFS:vsm.a VREADBM vDirect ???? ; {sources}OS:HFS:vsm.a ++XGETVOLINFO vIndirect $2030, $0378, A7 ; {sources}OS:HFS:TFSVol.a ++CHECKDTICON vIndirect $2030, $037c, A7 ; {sources}OS:HFS:Extensions:DTDBMgr.a -+HFS_VEC0378 vIndirect $2030, $0378, A7 -+HFS_VEC037C vIndirect $2030, $037c, A7 -+ ;============================== End HFS Vectors -;============================== Help Manager Vectors @@ -4726,7 +4851,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a ;============================== Menu Manager Vectors MENUMGRDISPATCH vATrap A??? ; {sources}Toolbox:MenuMgr:MenuDispatch.a -@@ -1744,41 +1513,6 @@ FIND6BOFROMID vIndirect $2044, $007c, A7 ; {sources}Toolbox:MenuMgr:SystemM +@@ -1744,41 +1512,6 @@ FIND6BOFROMID vIndirect $2044, $007c, A7 ; {sources}Toolbox:MenuMgr:SystemM ;============================== End Menu Manager Vectors @@ -4768,7 +4893,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a ;============================== Notification Manager Vectors __NMINSTALL vATrap A??? ; {sources}Toolbox:NotificationMgr:NotificationMgr.a -@@ -1799,10 +1533,10 @@ ValidIconRec vIndirect $204C, $0034, A1 ; {sources}Toolbox:NotificationMgr: +@@ -1799,10 +1532,10 @@ ValidIconRec vIndirect $204C, $0034, A1 ; {sources}Toolbox:NotificationMgr: NMINIT vIndirect $204C, $0038, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c _NMInstall vIndirect $204C, $003c, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c _NMRemove vIndirect $204C, $0040, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c @@ -4781,7 +4906,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a NMCallMBarProc vIndirect $204C, $0054, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c SWAPITEMMARKS vIndirect $204C, $0058, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c ClearMarks vIndirect $204C, $005c, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c -@@ -1812,223 +1546,13 @@ RotateIcon vIndirect $204C, $0068, A1 ; {sources}Toolbox:NotificationMgr:N +@@ -1812,223 +1545,13 @@ RotateIcon vIndirect $204C, $0068, A1 ; {sources}Toolbox:NotificationMgr:N DoSound vIndirect $204C, $006c, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c DoDialog vIndirect $204C, $0070, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c DoRespProc vIndirect $204C, $0074, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c @@ -5006,7 +5131,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a ;============================== Quickdraw Vectors ANGLEFROMSLOPE vATrap A??? ; {sources}QuickDraw:ANGLES.a -@@ -2699,8 +2223,8 @@ INITCRTABLE vDataTable ; {sources}QuickDraw:cCrsrCore.a +@@ -2699,8 +2222,8 @@ INITCRTABLE vDataTable ; {sources}QuickDraw:cCrsrCore.a CRSRVBLTASK vIndirect $2054, $0390, A7 ; {sources}QuickDraw:cCrsrCore.a PINRECT vATrap A??? ; {sources}QuickDraw:cCrsrCore.a CURSORSECT vIndirect $2054, $0394, A7 ; {sources}QuickDraw:cCrsrCore.a @@ -5017,7 +5142,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a GETMAINCRSR vIndirect $2054, $03a0, A7 ; {sources}QuickDraw:cCrsrCore.a SETCRSRDATA vIndirect $2054, $03a4, A7 ; {sources}QuickDraw:cCrsrCore.a ALLOCCRSR vATrap A??? ; {sources}QuickDraw:cCrsrCore.a -@@ -2842,513 +2366,6 @@ GETNEXTFOND vIndirect $2058, $0090, A7 ; {sources}Toolbox:ResourceMgr:Reso +@@ -2842,513 +2365,6 @@ GETNEXTFOND vIndirect $2058, $0090, A7 ; {sources}Toolbox:ResourceMgr:Reso ;============================== End Resource Manager Vectors @@ -5531,7 +5656,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a ;============================== Script Manager Vectors GETIDENTRY vIndirect $2060, $0004, A7 ; {sources}Toolbox:ScriptMgr:DblByteCompat.a -@@ -3485,6 +2502,9 @@ INTLTOKENIZE vIndirect $2060, $01dc, A7 ; {sources}Toolbox:ScriptMgr:Script +@@ -3485,6 +2501,9 @@ INTLTOKENIZE vIndirect $2060, $01dc, A7 ; {sources}Toolbox:ScriptMgr:Script MAXOLDDATE vDataTable ; {sources}Objects:ROM:ScriptMgr.lib SECSINDAYX vDataTable ; {sources}Objects:ROM:ScriptMgr.lib @@ -5541,7 +5666,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a ;============================== End Script Manager Vectors ;============================== Segment Loader Vectors -@@ -3525,8 +2545,8 @@ UPDATEEMUWARMSTART vIndirect $2068, $002C, A7 ; {sources}Toolbox:ShutDownMgr +@@ -3525,8 +2544,8 @@ UPDATEEMUWARMSTART vIndirect $2068, $002C, A7 ; {sources}Toolbox:ShutDownMgr ;============================== Original SuperMario Team Names @@ -5552,7 +5677,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a ;============================== Original SuperMario Team Names -@@ -3563,8 +2583,8 @@ CARDCHANGED vIndirect $206C, $003c, A7 ; {sources}OS:SlotMgr:SlotMgr.a +@@ -3563,8 +2582,8 @@ CARDCHANGED vIndirect $206C, $003c, A7 ; {sources}OS:SlotMgr:SlotMgr.a SLOTEXEC vIndirect $206C, $0040, A7 ; {sources}OS:SlotMgr:SlotMgr.a CALCSPOINTER vIndirect $206C, $0044, A7 ; {sources}OS:SlotMgr:SlotMgr.a GETSLOTDRVR vIndirect $206C, $0048, A7 ; {sources}OS:SlotMgr:SlotMgr.a @@ -5563,7 +5688,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a JSRTBL vDataTable ; {sources}OS:SlotMgr:SlotMgr.a READSLOTPRAM vIndirect $206C, $0054, A7 ; {sources}OS:SlotMgr:SlotMgr.a PUTSLOTPRAM vIndirect $206C, $0058, A7 ; {sources}OS:SlotMgr:SlotMgr.a -@@ -3623,124 +2643,6 @@ SECONDARYEND vNoVector ; {sources}OS:SlotMgr:SlotMgrInit.a +@@ -3623,124 +2642,6 @@ SECONDARYEND vNoVector ; {sources}OS:SlotMgr:SlotMgrInit.a ;============================== End Slot Manager Vectors @@ -5688,7 +5813,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a ;============================== Start Manager Vectors SIZEMEMORY vNoVector ; {sources}OS:StartMgr:SizeMem.a ALLOCFAKERGNS vNoVector ; {sources}OS:StartMgr:StartAlert.a -@@ -3904,101 +2806,6 @@ SONIC_Test vNoVector ; {sources}OS:StartMgr:UnivTestEnv:SONIC_Test.c +@@ -3904,101 +2805,6 @@ SONIC_Test vNoVector ; {sources}OS:StartMgr:UnivTestEnv:SONIC_Test.c ;============================== End Start Manager Vectors @@ -5790,7 +5915,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a ;============================== TextEdit Vectors TEXTEDIT vNoVector ; {sources}Toolbox:TextEdit:TextEdit.a -@@ -4084,14 +2891,14 @@ TEGETOFFSET vATrap A??? ; {sources}Toolbox:TextEdit:TextEdit.a +@@ -4084,14 +2890,14 @@ TEGETOFFSET vATrap A??? ; {sources}Toolbox:TextEdit:TextEdit.a TIMEMGR vNoVector ; {sources}OS:TimeMgr:TimeMgr.a __RMVTIME vATrap A??? ; {sources}OS:TimeMgr:TimeMgr.a @@ -5810,7 +5935,7 @@ diff --git a/Make/VectorTable.a b/Make/VectorTable.a INITTIMEMGR vNoVector ; {sources}OS:TimeMgr:TimeMgr.a ;============================== End Time Manager Vectors -@@ -4286,165 +3093,94 @@ FASTERINVALRECT vATrap A??? ; {sources}Toolbox:WindowMgr:WindowMgrExte +@@ -4286,165 +3092,94 @@ FASTERINVALRECT vATrap A??? ; {sources}Toolbox:WindowMgr:WindowMgrExte ACTIVATEPALETTELAYERBRACKET vATrap A??? ; {sources}Toolbox:WindowMgr:WindowMgrExtensions.a GETREARWINDOW vIndirect $2084, $01d0, A7 ; {sources}Toolbox:WindowMgr:WindowMgrExtensions.a @@ -9210,6 +9335,2118 @@ diff --git a/OS/EgretMgr.a b/OS/EgretMgr.a TerrorEgret +diff --git a/OS/HFS/BTMAINT2.a b/OS/HFS/BTMAINT2.a +--- a/OS/HFS/BTMAINT2.a ++++ b/OS/HFS/BTMAINT2.a +@@ -1110,7 +1110,7 @@ UpdDRec + BEQ.S @2 ; ptr = 0, clear the record -> + MOVEA.L D1,A0 ; source = data record + EXT.L D0 ; move length = record size +- _BlockMove ; move in the data record ++ _BlockMoveData ; move in the data record + BRA.S UDExit ; all done -> + + @1 CLR.B (A1)+ ; clear the record +diff --git a/OS/HFS/BTSVCS.a b/OS/HFS/BTSVCS.a +--- a/OS/HFS/BTSVCS.a ++++ b/OS/HFS/BTSVCS.a +@@ -748,7 +748,7 @@ BIInit + LSR.L #1,D0 ; + LSL.L #1,D0 ; ...and adjust to word boundry + ADD.W D0,D6 ; total size = key size + data size +- _BlockMove ; move in the key ++ _BlockMoveData ; move in the key + + ADDQ.W #1,D6 ; adjust total size to word boundry + LSR.W #1,D6 ; +diff --git a/OS/HFS/CMMAINT.a b/OS/HFS/CMMAINT.a +--- a/OS/HFS/CMMAINT.a ++++ b/OS/HFS/CMMAINT.a +@@ -353,7 +353,7 @@ UpdCName + BLE.S @1 ; no -> <09Sep85> + MOVE.W D1,D0 ; yes, truncate to max <09Sep85> + @1 MOVE.B D0,(A1)+ ; set length byte <09Sep85> +- _BlockMove ; copy CName to dest <09Sep85> ++ _BlockMoveData ; copy CName to dest <09Sep85> + + MOVEM.L (SP)+,D0-D1/A0-A1 ; restore regs <09Sep85> + RTS ; exit UpdCName <09Sep85> +diff --git a/OS/HFS/CMSVCS.a b/OS/HFS/CMSVCS.a +--- a/OS/HFS/CMSVCS.a ++++ b/OS/HFS/CMSVCS.a +@@ -663,13 +663,13 @@ MCGetSrc + LEA ckrOff(A4),A1 ; dest = key record in CM vars + MOVEQ #1,D0 ; get key length (include length byte) + ADD.B (A0),D0 ; +- _BlockMove ; copy the key ++ _BlockMoveData ; copy the key + MOVEA.L (SP)+,A0 ; A0 = ptr(data record) + + LEA cdrOff(A4),A1 ; dest = data record in CM vars + MOVE.W D1,D0 ; length = len(data record) + EXT.L D0 ; +- _BlockMove ; copy the data record ++ _BlockMoveData ; copy the data record + ; + ; insert new source CNode record in BTree with new key + ; +@@ -845,7 +845,7 @@ CMRenameCN + LEA cdrOff(A4),A1 ; dest ptr = CM vars + MOVE.W D6,D0 ; length = len(data record) + EXT.L D0 ; +- _BlockMove ; copy the record ++ _BlockMoveData ; copy the record + ; + ; insert old CNode record in BTree with new key + ; +diff --git a/OS/HFS/Cache/CacheControl.a b/OS/HFS/Cache/CacheControl.a +--- a/OS/HFS/Cache/CacheControl.a ++++ b/OS/HFS/Cache/CacheControl.a +@@ -117,8 +117,7 @@ CTExit + GetCSize + jsr FSQueueSync ; Synchronize with the file manager + move.l CacheVars,a1 ; Cache vars address +- move.l OldBufPtr(a1),d0 ; Pre-cache BufPtr +- sub.l NewBufPtr(a1),d0 ; Size of cache = (Pre-cache BufPtr)-current ++ move.l CacheSize(a1),d0 ; Size of cache = (Pre-cache BufPtr)-current + move.l d0,ioMisc(a0) ; Return in param block + moveq #0,d0 ; Result = SUCCESS + bra.s CTExit +@@ -186,8 +185,7 @@ GetMaxCXfr + SetMaxCXfr + jsr FSQueueSync ; Synchronize with the file manager + move.l CacheVars,a1 ; Cache vars address +- move.l OldBufPtr(a1),d0 ; Pre-cache BufPtr +- sub.l NewBufPtr(a1),d0 ; Size of cache = (Pre-cache BufPtr)-current ++ move.l CacheSize(a1),d0 ; Size of cache = (Pre-cache BufPtr)-current + move.l ioMisc(a0),d1 ; Get caller's parameter + cmp.l d1,d0 ; Cache size >= requested max xfer size? + bhs.s @1 ; Xfer if so... +diff --git a/OS/HFS/CacheIO.a b/OS/HFS/CacheIO.a +--- a/OS/HFS/CacheIO.a ++++ b/OS/HFS/CacheIO.a +@@ -75,6 +75,7 @@ + include 'FileMgrPrivate.a' + include 'SCSI.a' + include 'SCSIPriv.a' ++ include 'Devices.a' + PRINT ON + PRINT NOGEN + +@@ -171,6 +172,22 @@ RWSetUp + @1 + ENDIF + ++ CMP.L #kMaximumBlocksIn4GB,D0 ; ++ BLS.S @notlarge ; (use 32-bit for low blocks) ++ ++ WITH XIOParam ; ++ LSL.L #8,D0 ; ...x 512 ++ ADD.L D0,D0 ; ++ MOVE.L D0,IOWPosOffset+4(A0) ; ... gives low long ++ MOVE.L CBHDBlk(A4),D0 ; physical disk block again ++ CLR.W D0 ; ++ SWAP D0 ; .../ 8M ++ LSR.W #7,D0 ; ++ MOVE.L D0,IOWPosOffset(A0) ; ... gives high long ++ OR.W #kUseWidePositioning,IOPosMode(A0) ; ++ BRA.S BasicIO ; ++ ENDWITH ; ++@notlarge ; + LSL.L #8,D0 ; ...x 512 + ADD.L D0,D0 ; + MOVE.L D0,IOPosOffset(A0) ; ... gives disk address +@@ -282,12 +299,16 @@ SCSINotBusy + BLE.S RWCont ; br if so (otherwise, driver just + ; passed back some garbage . . .) + @3 BSET #HFSContd,HFSFlags ; We're now returning from the trap +- BNE.S RWCont1 ; If we already returned, do I/O comp. now ++ BNE.S RWReturnD0 ; If we already returned, do I/O comp. now + + RWRTS RTS ; return to caller (complete asynchronously) + + ; IO completion routine + ++RWReturnD0 ++ MOVE.W IOResult(A0),D0 ++ BRA.S RWCont1 ++ + RWIOComp + BSET #HFSContd,HFSFlags ; We're continuing now + BEQ.S RWRTS ; If trap didn't really return ,ASYNC +@@ -368,6 +389,23 @@ RWBlksSub: + OR.B D0,IOPosMode+1(A0) ; pass verify bit on to the disk driver + + MOVE.L D3,D0 ; convert from block to byte address ++ ++ CMP.L #kMaximumBlocksIn4GB,D0 ; ++ BLS.S @notlarge ; (use 32-bit for low blocks) ++ ++ WITH XIOParam ; ++ LSL.L #8,D0 ; ...x 512 ++ ADD.L D0,D0 ; ++ MOVE.L D0,IOWPosOffset+4(A0) ; ... gives low long ++ MOVE.L D3,D0 ; physical disk block again ++ CLR.W D0 ; ++ SWAP D0 ; .../ 8M ++ LSR.W #7,D0 ; ++ MOVE.L D0,IOWPosOffset(A0) ; ... gives high long ++ OR.W #kUseWidePositioning,IOPosMode(A0) ; ++ BRA BasicIO ; head for the I/O sphincter ++ ENDWITH ; ++@notlarge ; + LSL.L #8,D0 ; ...x 512 + ADD.L D0,D0 ; + MOVE.L D0,IOPosOffset(A0) ; absolute address +@@ -423,6 +461,36 @@ vSetUpTags ; 'vectored' SetUpTags routine <02Oct85> + @4 MOVE.L Time,BufTgDate ; use date for MFS <01Oct85> + RTS + ++;—————————————————————————————————————————————————————————————————————————————————————————— ++; ++; fsSCSIFreeHookProc (lifted from FileMgrHooks.a, probably for SCSINotBusy JMP) ++; ++; This procedure is called by the SCSI manager every time the SCSI bus is ++; freed up. If (the File System is busy) and (we're waiting for a wake up) ++; then jump to where we deferred until SCSI was free. ++; ++;—————————————————————————————————————————————————————————————————————————————————————————— ++ export fsSCSIFreeHookProc ++fsSCSIFreeHookProc: ++ bclr.b #fsSCSIDefer, FSBusy ; if we're waiting, we'll have this flag set ++ beq.s NoWakeUp ++ ++ MOVEM.L D1-D7/A0-A6,-(SP) ; preserve registers (for caller of fsSCSIFreeHook) ++ PEA SCSIBusyReturn ; return to here to restore regs ++ ++ MOVEA.L HFSStkPtr,A6 ; Recover HFS' private stack pointer ++ MOVEM.L (A6)+,D1-D7/A0-A5 ; Retrieve registers off A6 stack ++ MOVE.L A6,HFSStkPtr ; save stack ptr ++ ++ JMP SCSINotBusy ; continue with the dispatch ++ ++SCSIBusyReturn ++ MOVEM.L (SP)+,D1-D7/A0-A6 ; restore significant registers ++ ++NoWakeUp RTS ; ++ ++ endproc ++ + END + + +diff --git a/OS/HFS/Extensions/BTreeMgr/BTreeQueue.a b/OS/HFS/Extensions/BTreeMgr/BTreeQueue.a +--- a/OS/HFS/Extensions/BTreeMgr/BTreeQueue.a ++++ b/OS/HFS/Extensions/BTreeMgr/BTreeQueue.a +@@ -84,6 +84,11 @@ btDebugSYS EQU 0 ; <16Apr90> + ; that file's access might have been reserved). + ; Input: D0 = dispatch selector, A0 = ioParam, D1.W = trapword (A08E) + ;__________________________________________________________________________ ++ ;; (CDG5) For some reason, with sync BTree requests is not ++ ;; enough to let BTAsync to make the call and spin on the ++ ;; result. Instead we spin waiting for a fake call, then we run ++ ;; ExtBTDispatchRequest, then we spin waiting for the result of ++ ;; *that*. + ExtBTQueue PROC EXPORT + export ExtBTDispatchRequest + IMPORT ExtIsBtree +@@ -97,10 +102,27 @@ ExtBTQueue PROC EXPORT + BNE BTAsync ; yes + ;; else, it's a sync call: + CLR.L IOCompletion(A0) ; no completion routines for sync calls ++ ++ MOVE.L IOCmdAddr(A0),-(SP) ; save the real callback on the stack ++ PEA RaiseFlagFakeCmd ; and install a fake one ++ MOVE.L (SP)+,IOCmdAddr(A0) ++ + MOVE.L A0,-(SP) ; save parameter block ptr + BSR.S BTAsync ; queue it up (and maybe call it) + MOVE.L (SP)+,A0 ; restore ioParam + ++@spin TST.L IOCmdAddr(A0) ; spin... ++ BNE.S @spin ; until fake call back runs ++ MOVE.L (SP)+,IOCmdAddr(A0) ; restore real callback from stack ++ ++ MOVE.L A0,-(SP) ; take extra care to save A0 ++ MOVEM.L D3-D7/A2-A6,-(SP) ; and save Pascal registers ++ MOVE.L FSVarsPtr,A1 ; make globals accessible ++ MOVE.L fsVars.BTMgr(A1),A1 ++ BSR.S ExtBTDispatchRequest; do the dispatch ++ MOVEM.L (SP)+,D3-D7/A2-A6 ; restore registers ++ MOVE.L (SP)+,A0 ; restore carefully saved A0 ++ + WaitLoop MOVE.W IOResult(A0),D0 ; get the result code into D0 + + IF btDEBUG THEN ; debug ... see if we can continue ? +@@ -181,6 +203,10 @@ BTDispatch ;; A1 = ptr(BTvars) + MOVEM.L (SP)+,D3-D7/A2-A6 ; restore registers <17> + rts + ++RaiseFlagFakeCmd ++ CLR.L IOCmdAddr(A0) ++ RTS ++ + ExtBTDispatchRequest: + ;; Added code to support AppleShare's access control: -- 12/14/89 + ;; We may not service the request in FCFS order. If the request we're servicing +diff --git a/OS/HFS/Extensions/CatSearch.a b/OS/HFS/Extensions/CatSearch.a +--- a/OS/HFS/Extensions/CatSearch.a ++++ b/OS/HFS/Extensions/CatSearch.a +@@ -77,6 +77,7 @@ + INCLUDE 'BTScanPriv.a' ; for the NoMoreReads bit + include 'LinkedPatchMacros.a' + include 'FileMgrPrivate.a' ++ include 'DiskCachePriv.a' + PRINT pop + + import BTIPScan, BTEndPScan, BTGetPhys +@@ -248,10 +249,7 @@ MBufInsert: proc + MOVEQ.L #0, D0 ; clear D0 to clear high bytes + LEA.L ckrCName(A0), A0 ; A0 = ptr(str31 containing CName) + MOVE.B (A0), D0 ; get length of CName +- ; don't add one for the length byte 'cause we're DBRAing <1.3> +-@MoveCName: +- MOVE.B (A0)+, (A1)+ ; move the CName, byte by byte +- DBRA D0, @MoveCName ; (this is still faster than _BlockMove) ++ _BlockMoveData + MOVE.L CSSR.nextMBuf(A3), A1 ; A1 = ptr(just filled MBuf entry) + ADDA.W #FSSpec.size, A1 ; A1 = ptr(MBuf entry after the one we just filled) + MOVE.L A1, CSSR.nextMBuf(A3) ; remember position for next time +@@ -261,6 +259,47 @@ MBufInsert: proc + ; _AssumeEQ ckrParID+4, ckrCName ; put this in. •• + endproc + ++;__________________________________________________________________________________ ++; ++; Routine: xxx ++;__________________________________________________________________________________ ++elliotftw: proc export ++ MOVE.L (SP)+,-(A6) ++ MOVEM.L D0-D2/A0-A4,-(A6) ++ ++ MOVE.L CSSR.PSRPtr(A3),A4 ++ MOVE.L PSR.curNode(A4),D2 ++ CMP.L CSSR.newField(A3),D2 ++ BEQ.S @return ++ ++ MOVE.L D2,CSSR.newField(A3) ++ MOVE.L PSR.btcbPtr(A4),A0 ++ MOVE.W btcRefNum(A0),D0 ++ MOVE.L PSR.fcbPtr(A4),A0 ++ MOVE.L fcbVPtr(A0),A2 ++ MOVE.L vcbBufAdr(A2),A1 ++ MOVEQ #12,D1 ++ MOVE.L 4*$C1+$400,A3 ++ JSR (A3) ++ BNE.S @return ++ ++ MOVE.L CacheVars,A2 ++ TST.W LcGBinFQueue(A2) ++ BNE.S @return ++ ++; do the actual thing ++ MOVE.L A0,A1 ++ MOVE.L PSR.curNodePtr(A4),A0 ++ MOVE.L #512,D0 ++ _BlockMoveData ++ ++@return ++ MOVEM.L (A6)+,D0-D2/A0-A4 ++ MOVE.L (A6)+,-(A7) ++ RTS ++ ++ endproc ++ + ;__________________________________________________________________________________ + ; + ; UpperCaseIt +@@ -297,7 +336,7 @@ UpperCaseIt: proc + + MOVE.W D1, D0 ; D0.W = len(copy of current cName) + LEA.L CSSR.copyCur+1(A3), A0 ; A0 = ptr(1st char of copy of cName) +- _FSUprString ; uppercase, strip diacriticals ++ _UprString ; uppercase + MOVEQ.L #1, D0 ; just something to clear the zero flag + + ; Zero flag is cool regardless of how we got here +@@ -925,11 +964,11 @@ CMCatSearch: proc export + BHI.S @NoWayName ; then we do this little optimization <14> + ADDQ.B #1, D0 ; D0 = len(target cName) + length byte + LEA.L CSSR.copyTarg(A3), A1 ; A1 = ptr(copy of target cName) +- _BlockMove ; make the copy ++ _BlockMoveData ; make the copy + MOVEQ.L #0, D0 ; clear D0 to clear high bytes + MOVEA.L A1, A0 ; A0 = ptr(length byte of copy of target cName) + MOVE.B (A0)+, D0 ; D0 = len(target cName) +- _FSUprString ; uppercase, strip diacriticals ++ _UprString ; uppercase + bra.s @go ; <14> + + ; <14> +@@ -949,12 +988,15 @@ CMCatSearch: proc export + + BSR BTIPScan ; A4 is now ptr(PScan state record), 1st record is read + BNE.S @EndScan ; BTIPScan returns a regular OSErr ++ MOVEQ #-1,D0 ++ MOVE.L D0, CSSR.newField(A3) + MOVE.L A4, CSSR.PSRPtr(A3) ; save a copy of the PScan state record + + @loop: + BSR CheckCriteria ; do we have a match? + BNE.S @continue ; Z=1 indicates a hit + ++ BSR elliotftw + BSR MBufInsert ; yes, so add entry to match buffer + ADDQ.L #1, D7 ; tally this match + MOVE.L D7, ioActMatchCount(A5) ; update PB, so async users can watch +diff --git a/OS/HFS/Extensions/CatSrchPriv.a b/OS/HFS/Extensions/CatSrchPriv.a +--- a/OS/HFS/Extensions/CatSrchPriv.a ++++ b/OS/HFS/Extensions/CatSrchPriv.a +@@ -86,13 +86,14 @@ CSMinBufferSize equ 512 ; minimum number of bytes in a CatSearch buffer + + ; CatSearch state record + CSSR RECORD 0, Increment +-csTimeTask ds.b tmQSize ; must be 1st in CSSR ++csTimeTask ds.b tmXQSize ; must be 1st in CSSR + PSRPtr ds.l 1 ; copy of pointer to PScan state record + copyTarg ds.b 32 ; space for UprString'ed copy of target cName + copyCur ds.b 32 ; space for UprString'ed copy of current cName + nextMBuf ds.l 1 ; pointer to next entry in MBuf + attribMask ds.b 1 ; copy of user's ioFlAttrib mask, so we can modify it + flags ds.b 1 ; stuff to keep track of (see below) ++newField ds.l 1 + ALIGN 2 + size equ *-CSSR + ENDR +diff --git a/OS/HFS/Extensions/DTDBMgr.a b/OS/HFS/Extensions/DTDBMgr.a +--- a/OS/HFS/Extensions/DTDBMgr.a ++++ b/OS/HFS/Extensions/DTDBMgr.a +@@ -217,6 +217,7 @@ + + BLANKS ON + STRING ASIS ++ MACHINE MC68030 + + entry DequeueDTDBQElt + entry deepShitError +@@ -419,10 +420,14 @@ CheckDesktopSupport proc export + ; + ; Is this volume bigger than DTMinVolSize? + ; ++ moveq #0, d0 ; Clear d0.h for the long multiply + move.w vcbNmBlks(a2), d0 ; d0 = # of allocation blocks on this volume +- move.w vcbAlBlkSiz+2(a2), d1 ; d1 = allocation block size ++ move.l vcbAlBlkSiz(a2), d1 ; d1 = allocation block size + ; AlkBlkSiz is used as a word throughout HFS +- mulu.w d1, d0 ; d0 = # bytes on this volume ++ mulu.l d1, d0 ; d0 = # bytes on this volume ++ bvc.s @noclip ; ++ moveq #-1,d0 ; ++@noclip ; + cmp.l #DTMinVolSize, d0 ; is this a big volume? + bhs.s @SupportsDT ; then we always support the DTDB + ; +@@ -1294,7 +1299,7 @@ FindDTRegs reg d4/a0/a2/a3 + moveq.l #0, d0 ; clear high bytes + move.b (a0), d0 ; get length of string + addq.b #1, d0 ; add one for the length byte +- _BlockMove ; copy standard name into caller's (a1) buffer ++ _BlockMoveData ; copy standard name into caller's (a1) buffer + + move.l #'root',d2 ; try the root first + bsr CheckDTExists +@@ -1343,7 +1348,7 @@ VolLocked: + move.b (a1),d2 ; d2 = length of volume name + add.b d0,(a1)+ ; update length to include shadow characters + add.w d2,a1 ; point to end of volume name +- _BlockMove ++ _BlockMoveData + movea.l a2, a1 ; restore a1 to point as base of string + + move.w #kOnSystemDisk,d3 ; now we're looking on the system disk for shadow databases +@@ -1510,6 +1515,11 @@ RealOpenDT: proc export + + @OpenDTRegs reg a0-a4/d2 + ++ movem.l d2/a1,-(sp) ++ jsr GetQMRecPtr ++ bclr #asyncCall,QMRec.qmFlags(a1) ++ movem.l (sp)+,d2/a1 ++ + with RealOpenDTLocals + move.l (sp)+, -(a6) ; we do i/o + movem.l @OpenDTRegs, -(a6) +@@ -1920,10 +1930,12 @@ LSize equ *-bigPB + ;________________________________________________________________________________ + ; + DTAddIcon: proc export ++ import CHECKDTICON + + StandardLocals AddIconLocals, IconDRec ; normal locals w/icon sized data rec + + @AddIconRegs reg a0-a4/d1-d2 ; set of regs to save around AddIcon ++ bsr CHECKDTICON + jsrROM FSQUEUE ; just to check for external file systems + bsr DTRfnExtFSCheck ; find the right volume and hope it's ours + bsr DeskMgrQueue ; Wait our turn. +@@ -2047,10 +2059,12 @@ DTAddIcon: proc export + ;________________________________________________________________________________ + ; + DTGetIcon: proc export ++ import CHECKDTICON + + StandardLocals GetIconLocals, IconDRec + + @GetIconRegs reg a0-a4/d1-d2 ; set of regs to save around AddIcon ++ bsr CHECKDTICON + jsrROM FSQUEUE ; just to check for external file systems + bsr DTRfnExtFSCheck ; find the right volume and hope it's ours + bsr DeskMgrQueue ; Wait our turn. +@@ -2118,10 +2132,12 @@ DTGetIcon: proc export + ;________________________________________________________________________________ + ; + DTGetIconInfo: proc export ++ import CHECKDTICON + + StandardLocals GetIconInfoLocals, IconDRec + + @GetIconInfoRegs reg a0-a4/d1-d2 ; set of regs to save around this call ++ bsr CHECKDTICON + jsrROM FSQUEUE ; just to check for external file systems + bsr DTRfnExtFSCheck ; find the right volume and hope it's ours + bsr DeskMgrQueue ; Wait our turn +@@ -2191,6 +2207,38 @@ DTGetIconInfo: proc export + _DTDebugRts 'DTGetIconInfo',0 + endproc + ++;________________________________________________________________________________ ++; Routine: CHECKDTICON ++; ++; Input: a0 - user's DT param block ++; Output: d0 - result code ++;________________________________________________________________________________ ++; ++CHECKDTICON: proc export ++ cmp.l #'????',ioBTHint(a0) ++ bne.s @return ++ ++ addq #4,sp ; don't return to the caller ++ move.w #-$1394,d0 ++ cmp.w #selectDTAddIcon,ioTrap+1(a0) ++ bne.s @blahblah ++ moveq #ioErr,d0 ++@blahblah ++ ++ move.w d0,ioResult(a0) ++ btst #2,ioTrap(a0) ++ beq.s @return ++ tst.l ioCompletion(a0) ++ beq.s @return ++ ++ move.l a1,-(sp) ++ move.l ioCompletion(a0),a1 ++ jsr (a1) ++ move.l (sp)+,a1 ++ ++@return ++ rts ++ + ;________________________________________________________________________________ + ; The Application List + ; +@@ -2473,6 +2521,7 @@ DTAddAPPL: proc export + + @AddAPPLRegs reg a0-a4/d1-d2 ; set of regs to save around this call + jsrROM FSQUEUE ; just to check for external file systems ++ sub.l a3,a3 + bsr DTRfnExtFSCheck ; find the right volume and hope it's ours + bsr DeskMgrQueue ; Wait our turn + +@@ -2697,6 +2746,7 @@ DTRemoveAPPL: proc export + @RemoveAPPLRegs reg a0-a4/d1-d2 + + jsrROM FSQUEUE ; just to check for external file systems ++ sub.l a3,a3 + bsr DTRfnExtFSCheck ; find the right volume and hope it's ours + bsr DeskMgrQueue ; wait our turn + +@@ -2850,7 +2900,7 @@ DTGetAPPL: proc export + moveq.l #0, d0 ; clear high bytes + move.b (a0), d0 ; get length + addq.b #1, d0 ; add one for the length byte +- _BlockMove ; copy the string over ++ _BlockMoveData ; copy the string over + + @NoCopy: + moveq.l #0,d0 ; All is well. +@@ -2882,6 +2932,7 @@ DTSetComment: proc export + + @SetCommentRegs reg a0-a4/d1-d2 ; set of regs to save around SetComment + jsrROM FSQUEUE ; just to check for external file systems ++ sub.l a3,a3 + bsr DTRfnExtFSCheck ; find the right volume and hope it's ours + bsr DeskMgrQueue ; Wait our turn + +@@ -2909,7 +2960,7 @@ DTSetComment: proc export + move.b d0, CommentRec.CmtSize+Data(a6) ; set the comment length + move.l ioBuffer(a4), a0 ; get ready to copy the user's data + lea.l CommentRec.CmtData+Data(a6), a1 ; into the Comment record +- _BlockMove ; copy that comment... ++ _BlockMoveData ; copy that comment... + + bsr SetUpBTPB ; a0 = ptr(BTioParam), a2 = ptr(key) + moveq.l #0, d0 ; clear high bytes +@@ -2946,6 +2997,7 @@ DTGetComment: proc export + + @GetCommentRegs reg a0-a4/d1-d2 ; set of regs to save around GetComment + jsrROM FSQUEUE ; just to check for external file systems ++ sub.l a3,a3 + bsr DTRfnExtFSCheck ; find the right volume and hope it's ours + bsr DeskMgrQueue ; Wait our turn + +@@ -2981,7 +3033,7 @@ DTGetComment: proc export + move.l d0, ioActCount(a4) ; tell the user how much data there was + lea.l CommentRec.CmtData+Data(a6), a0 ; copy starts from the Data + move.l ioBuffer(a4), a1 ; a1 = address of user's buffer +- _BlockMove ; put the Comment Data in the user's buffer ++ _BlockMoveData ; put the Comment Data in the user's buffer + moveq.l #0,d0 ; All went well + + @GetCommentExit: +@@ -3009,6 +3061,7 @@ DTRemoveComment: proc export + + @RemoveCommentRegs reg a0-a4/d1-d2 ; set of regs to save around RmvCmt + jsrROM FSQUEUE ; just to check for external file systems ++ sub.l a3,a3 + bsr DTRfnExtFSCheck ; find the right volume and hope it's ours + bsr DeskMgrQueue ; Wait our turn + +@@ -3107,6 +3160,12 @@ DBParID ds.l 1 ; ParID of btree file + LSize equ *-bigPB + endr + ++ btst #10,d1 ++ beq.s @normal ++ move.w #paramErr,ioResult(a0) ++ rts ++@normal ++ + @DTResetRegs reg a0-a4/d1-d2 + jsrROM FSQUEUE ; just to check for external file systems + bsr DTRfnExtFSCheck ; find the right volume and hope it's ours +diff --git a/OS/HFS/Extensions/ExternalMakeFSSpec.a b/OS/HFS/Extensions/ExternalMakeFSSpec.a +--- a/OS/HFS/Extensions/ExternalMakeFSSpec.a ++++ b/OS/HFS/Extensions/ExternalMakeFSSpec.a +@@ -385,6 +385,7 @@ ParseNextSegment: proc + ;________________________________________________________________________________ + DetermineVolume: proc + @DetermineVolumeRegs: reg d2/a0/a3 ++ move.l (sp)+,-(a6) + movem.l @DetermineVolumeRegs, -(a6) + suba.w #ioHVQElSize, a6 ; allocate a volume param block on a6 + move.l a6, a0 ; leave pb in a0 +@@ -455,6 +456,7 @@ DetermineVolume: proc + @Exit: + adda.w #ioHVQElSize, a6 ; deallocate volume param block on a6 + movem.l (a6)+, @DetermineVolumeRegs ++ move.l (a6)+,-(sp) + tst.w d0 + rts + +diff --git a/OS/HFS/Extensions/FileIDs.a b/OS/HFS/Extensions/FileIDs.a +--- a/OS/HFS/Extensions/FileIDs.a ++++ b/OS/HFS/Extensions/FileIDs.a +@@ -434,7 +434,7 @@ PBHExchangeFiles: + LEA FCBCName(A1, D1),A1 ; fcb spot to move to + MOVEQ #1,D0 ; Clear upper bytes in D0, add length byte + ADD.B (A0),D0 ; Pick up number of bytes to copy +- _BlockMove ; Copy the filename ++ _BlockMoveData ; Copy the filename + MOVEA.L A4, A1 ; Restore A1 + + BRA.S @nxtFCB1 +@@ -451,7 +451,7 @@ PBHExchangeFiles: + LEA FCBCName(A1, D1),A1 ; fcb spot to move to + MOVEQ #1,D0 ; Clear upper bytes in D0, add length byte + ADD.B (A0),D0 ; Pick up number of bytes to copy +- _BlockMove ; Copy the filename ++ _BlockMoveData ; Copy the filename + MOVEA.L A4, A1 ; Restore A1 + + +diff --git a/OS/HFS/Extensions/FileIDsSvcs.a b/OS/HFS/Extensions/FileIDsSvcs.a +--- a/OS/HFS/Extensions/FileIDsSvcs.a ++++ b/OS/HFS/Extensions/FileIDsSvcs.a +@@ -102,6 +102,8 @@ + PRINT POP ; okay, send the lines for the listing + PRINT NOGEN ; don't show the macro expansions + ++ MACHINE MC68030 ++ + FileIDsSvcs PROC EXPORT + + EXPORT FIDCreateID, FIDDeleteID, FIDGetID, FIDResolveID, FIDExchangeFiles +@@ -242,7 +244,7 @@ FIDCreateID: + ; A0/A1 preserved across the call <11Jan91 #10> + MOVEQ #1,D0 ; include length byte <11Jan91 #10> + ADD.B (A0),D0 ; D0.L = length of source <11Jan91 #10> +- _BlockMove ; A0 -> A1 <11Jan91 #10> ++ _BlockMoveData ; A0 -> A1 <11Jan91 #10> + BRA.S @6 ; always updateBT <11Jan91 #10> + @5 TST.W D3 ; have we changed the file? <11Jan91 #10> + BNE.S @7 ; no <11Jan91 #10> +@@ -601,7 +603,7 @@ FIDExchangeFiles: + @ExNxt1 MOVEA.L A1, A0 ; source - the cnode in memory + LEA srcCNode(A4), A1 ; dest - the cnode on the stack + MOVEQ #lencdr, D0 ; length of file record +- _BlockMove ++ _BlockMoveData + ; + ; locate the dest file, test for extents in extent file, and copy the cat record for later + ; +@@ -632,7 +634,7 @@ FIDExchangeFiles: + @ExNxt3 MOVEA.L A1, A0 ; source - the cnode in memory + LEA destCNode(A4), A1 ; dest - the cnode on the stack + MOVEQ #lencdr, D0 ; length of file record +- _BlockMove ++ _BlockMoveData + + ; + ; STEP 2: EXCHANGE THE EXTENTS KEY IN THE EXTENT FILE (IF ANY) +@@ -811,7 +813,7 @@ CheckExtents: + TST.L D3 ; convert it to blocks + BEQ.S @ChNoneThere ; zero length file + SUBQ.L #1, D3 +- DIVU.W vcbAlBlkSiz+2(A2), D3 ; the high word could have trash in it, but we don't care ++ DIVU.L vcbAlBlkSiz(A2), D3 ; the high word could have trash in it, but we don't care + ADDQ.W #1, D3 ; now the peof is in blocks and only a word size + + @1 CLR.W D1 ; extent offset in extent record +diff --git a/OS/HFS/Extensions/QMgr.a b/OS/HFS/Extensions/QMgr.a +--- a/OS/HFS/Extensions/QMgr.a ++++ b/OS/HFS/Extensions/QMgr.a +@@ -104,6 +104,17 @@ GetQMRecPtr: proc export + bne.s @CheckCLQueue + + move.l QMGlobals.DTQueuePtr(a1), a1 ; a1 = ptr(DTDB mgr QM rec) ++ ++ movem.l d0/a0,-(sp) ++ move.l QMRec.qHead(a1),d0 ++ beq.s @DontSetAsync ++ move.l d0,a0 ++ cmp.b #$2C,ioTrap+1(a0) ; not sure which trap? ++ bne.s @DontSetAsync ++ bclr #asyncCall,QMRec.qmFlags(a1) ++@DontSetAsync: ++ movem.l (sp)+,d0/a0 ++ + bra.s @Exit + + @CheckCLQueue: +@@ -284,7 +295,9 @@ QMCmdDone: proc + bne.s toDSFSErr ; or else die + + move.l deQHook(a1), d2 ; just-before-dequeue hook? +- ble.s @doTheDequeue ; branch if not . . . ++ bz.s @doTheDequeue ; invalid values are 0 and -1 ++ cmp.l #-1,d2 ++ beq.s @doTheDequeue ; branch if not . . . + move.l d2, a1 ; a1 = ptr(just-before-dequeue hook) + jsr (a1) ; go do the whatever the hook wants + +diff --git a/OS/HFS/FXM.a b/OS/HFS/FXM.a +--- a/OS/HFS/FXM.a ++++ b/OS/HFS/FXM.a +@@ -92,6 +92,8 @@ + BLANKS ON + STRING ASIS + ++ MACHINE MC68030 ++ + PRINT OFF + LOAD 'StandardEqu.d' + PRINT ON +@@ -294,13 +296,26 @@ vExtendFile ; 'vectored' ExtendFile routine <25Oct85> + BTST #EFAll,D3 ; all or nothing requested? <08Jan86> + BEQ.S @1 ; no -> <08Jan86> + +- MOVE.W VCBFreeBks(A2),D0 ; Compute free space in bytes <08Jan86> +- MULU VCBAlBlkSiz+2(A2),D0 ; <08Jan86> ++ TST.L D4 ; ++ BMI.S @filebad ; ++ MOVE.L FCBPLen(A3),D0 ; ++ ADD.L D4,D0 ; ++ BMI.S @filebad ; ++ ++ MOVEQ #0,D0 ; Do this all in longs ++ MOVE.W VCBFreeBks(A2),D0 ; Compute free space in bytes ++ MULU.L VCBAlBlkSiz(A2),D0 ; ++ BVC.S @notMax ; Not sure what V clear after MULU means? ++ MOVEQ #-1,D0 ; ++@notMax ; + CMP.L D4,D0 ; Compare against requested space <08Jan86> + BHS.S @1 ; If enough space free, go on -> <08Jan86> + + MOVEQ #DskFulErr,D0 ; result = 'disk full' <08Jan86> + BRA EFExit1 ; exit ExtendFile -> <08Jan86> ++@filebad ; ++ MOVE.W #fileBoundsErr,D0 ; ++ BRA EFExit1 ; + + @1 BSET #FXVTContig,FXVFlags(A4) ; 1st try contig allocation <27Aug85> + BTST #EFContig,D3 ; forced contiguous requested? <08Jan86> +@@ -310,14 +325,21 @@ vExtendFile ; 'vectored' ExtendFile routine <25Oct85> + @2 MOVE.L VCBAlBlkSiz(A2),D0 ; round the # of bytes requested + ADD.L D0,D4 ; + SUBQ.L #1,D4 ; +- DIVU D0,D4 ; +- MULU D0,D4 ; ...up to next alloc blk ++ DIVU.L D0,D4 ; ++ MULU.L D0,D4 ; ...up to next alloc blk ++ BPL.S @noof ; ++ BTST #0,D3 ; ++ BNE.S @filebad ; ++ SUB.L D0,D4 ; ++@noof ; + ; + ; locate the extent mapping the new PEOF - 1 (last byte in file) + ; ++filebad equ @filebad ; Persist this @label over a real label + EFLocExt + MOVE.L FCBPLen(A3),D0 ; current PEOF + ADD.L D4,D0 ; + # of bytes requested = new PEOF ++ BMI.S filebad ; + SUBQ.L #1,D0 ; new PEOF - 1 = last byte in file + BSR XFSearch ; locate the extent + BNE.S @1 ; didn't find it -> +@@ -334,8 +356,9 @@ EFLocExt + ; + ; adjust PEOF to end of extent + ; ++ MOVEQ #0,D0 ; + MOVE.W D6,D0 ; (ending FABN + 1) +- MULU VCBAlBlkSiz+2(A2),D0 ; in bytes = max PEOF for extent ++ MULU.L VCBAlBlkSiz(A2),D0 ; in bytes = max PEOF for extent + SUB.L FCBPlen(A3),D0 ; PEOF already at end of extent? + BEQ.S EFAddSpace ; yes -> + ADD.L D0,FCBPlen(A3) ; no, adjust PEOF to end of extent +@@ -432,7 +455,8 @@ EFNewRec + EFUpdFCB + ADD.W D3,D6 ; update ending FABN + 1 <17Oct85> + +- MULU VCBAlBlkSiz+2(A2),D3 ; convert # of blks allocated to bytes ++ AND.L #$FFFF,D3 ; ++ MULU.L VCBAlBlkSiz(A2),D3 ; convert # of blks allocated to bytes + ADD.L D3,FCBPlen(A3) ; adjust PEOF to include new space + BSET #FCBModBit,FCBMdRByt(A3) ; mark FCB dirty + +@@ -551,24 +575,27 @@ vMapFBlock ; 'vectored' MapFBlock routine <27Oct86> + BNE.S MFExit ; exit on errors + + LEA 0(A1,D1.W),A1 ; A1 = ptr to extent entry ++ MOVEQ #0,D1 ; + MOVE.W D3,D1 ; D1 = beg FABN for extent + SUB.W xdrNumABlks(A1),D1 ; ++ MOVEQ #0,D2 ; + MOVE.W D3,D2 ; D2 = end FABN in extent + 1 + ; + ; determine end of available space (PEOF or end of extent) + ; +- MULU VCBAlBlkSiz+2(A2),D2 ; convert end FABN + 1 to file pos ++ MULU.L VCBAlBlkSiz(A2),D2 ; convert end FABN + 1 to file pos + MOVE.L FCBPLen(A3),D0 ; get PEOF + CMP.L D0,D2 ; end of extent > PEOF? + BLE.S @1 ; no, use end of extent -> + MOVE.L D0,D2 ; yes, use PEOF + +-@1 DIVU VCBAlBlkSiz+2(A2),D2 ; D2 = end of avail space ( end FABN + 1) ++@1 DIVU.L VCBAlBlkSiz(A2),D2 ; D2 = end of avail space ( end FABN + 1) + ; + ; set up some constants + ; + MOVE.L VCBAlBlkSiz(A2),D6 ; D6 = # blks per alloc blk +- DIVU #512,D6 ; ++ LSR.L #8,D6 ; Instead of DIVU.W ++ LSR.L #1,D6 + + MOVEQ #0,D7 ; D7 = start blk # for alloc blks + MOVE.W VCBAlBlSt(A2),D7 ; +@@ -576,23 +603,23 @@ vMapFBlock ; 'vectored' MapFBlock routine <27Oct86> + ; calculate physical start block + ; + MOVE.L D5,D3 ; file position / alloc blk size +- DIVU VCBAlBlkSiz+2(A2),D3 ; = FABN mapping file position +- SWAP D3 ; Get remainder in low word +- MOVEQ #0,D0 ; Clear top word to get remainder as long +- MOVE.W D3,D0 ; Compute block offset within alloc block +- LSR.L #8,D0 ; 'divide' by 256 +- LSR.L #1,D0 ; and again by 2 to get size in phys. blocks +- SWAP D3 ; Restore D3 for use +- SUB.W D1,D3 ; - beg FABN = alloc blk delta +- ADD.W xdrStABN(A1),D3 ; + starting ABN = ABN mapping file pos +- MULU D6,D3 ; convert to physical block # ++ TDIVU.L VCBAlBlkSiz(A2),D0:D3 ; ++ LSR.L #8,D0 ; ++ LSR.L #1,D0 ; ++ MOVE.L D0,A3 ; ++ MOVEQ #0,D0 ; ++ MOVE.W xdrStABN(A1),D0 ; ++ SUB.L D1,D3 ; ++ ADD.L D0,D3 ; ++ MULU.L D6,D3 ; ++ MOVE.L A3,D0 ; + ADD.L D0,D3 ; Offset in physical blocks within alloc. blk <24Mar87> + ADD.L D7,D3 ; + ; + ; calculate number of available bytes + ; +- MOVE.W D2,D6 ; end FABN + 1 * alloc blk size +- MULU VCBAlBlkSiz+2(A2),D6 ; = ending file pos + 1 ++ MOVE.L D2,D6 ; end FABN + 1 * alloc blk size ++ MULU.L VCBAlBlkSiz(A2),D6 ; = ending file pos + 1 + SUB.L D5,D6 ; - file position = size avail + + CMP.L D4,D6 ; compare with desired number +@@ -657,8 +684,11 @@ TFLocExt + MOVE.L VCBAlBlkSiz(A2),D0 ; round the new PEOF + ADD.L D0,D5 ; + SUBQ.L #1,D5 ; +- DIVU D0,D5 ; +- MULU D0,D5 ; ...up to next alloc blk ++ DIVU.L D0,D5 ; ++ MULU.L D0,D5 ; ...up to next alloc blk ++ BPL.S @next ; ++ SUB.L D0,D5 ; ++@next ; + + MOVE.L D5,D0 ; new PEOF - 1 = last byte in file + SUBQ.L #1,D0 ; +@@ -693,7 +723,7 @@ TFLocExt + TFTrunPEOF + MOVE.L D5,D0 ; new PEOF - 1 (last byte in file) + SUBQ.L #1,D0 ; +- DIVU VCBAlBlkSiz+2(A2),D0 ; / alloc blk size = last FABN in file ++ DIVU.L VCBAlBlkSiz(A2),D0 ; / alloc blk size = last FABN in file + SUB.W D0,D3 ; (last extent FABN +1) - (last file FABN) + SUBQ.W #1,D3 ; - 1 = # to deallocate + BEQ.S @1 ; nothing to deallocate -> +@@ -903,7 +933,7 @@ vXFSearch ; 'vectored' XFSearch routine <27Oct86> + MOVEM.L D4-D6,-(A6) ; save regs + + MOVE.L D0,D4 ; D4 = file position to be mapped +- DIVU VCBAlBlkSiz+2(A2),D4 ; convert to FABN ++ DIVU.L VCBAlBlkSiz(A2),D4 ; convert to FABN + + MOVE.L FCBFlNm(A3),D5 ; D5 = file number + ; +diff --git a/OS/HFS/FileMgrHooks.a b/OS/HFS/FileMgrHooks.a +--- a/OS/HFS/FileMgrHooks.a ++++ b/OS/HFS/FileMgrHooks.a +@@ -60,8 +60,10 @@ + + fsQueueHookPatch: proc export + export vAfterFSQHook, FSDispatchRequest, CheckInterruptMask ++ export SyncWait + import MungeTrapWord,UnMungeTrapWord, fsInterruptDeferProc + import TagFileWithPSN, CheckFCBAllocation, MoreWDCBs ++ import FlushCRange + + VolatileRegs reg a0-a1/d1-d2 + pascalRegs reg a2-a6/d3-d7 +@@ -166,11 +168,14 @@ SyncWait: move.w ioResult(a0),d0 ; get the result code into d0 + + @RetryCall: ; <15> + bsr UnMungeTrapWord ; trap word in d1, dispatch in d0 +- lea.l TrapAgain,a1 ; get ready to play assembler ++ movem.l d0/a0/a1,-(sp) ; save some registers ++ lea.l TrapAgain,a0 ; get ready to play assembler ++ move.l a0,a1 ; use a1 as empty-ascending counter + move.w d1,(a1)+ ; write in the trap word +- move.w #$4E75,(a1) ; follow it with an RTS +- move.l jCacheFlush,a1 ; get address of the CPU’s cache flusher <45> +- jsr (a1) ; be cool on hoopy cached cpus <45> ++ move.w #$4E75,(a1)+ ; follow it with an RTS ++ sub.l a0,a1 ; a1 = length of code to flush ++ bsr.l FlushCRange ; run CPU’s cache flusher ++ movem.l (sp)+,d0/a0/a1 ; restore registers + jmp TrapAgain ; Go re-execute the original trap + + ; call disk switch hook if synchronous call failed because volume went offline +@@ -178,9 +183,11 @@ SyncWait: move.w ioResult(a0),d0 ; get the result code into d0 + ext.l d0 ; extend result to long + cmp.w #VolOffLinErr,d0 ; volume off-line error? (detected by file + bne.s @Return ; system) br if not +- move.l DskSwtchHook,-(sp) ; OffLineVol points to VCB, a0 to request +- bgt.s @Return ; br if there is a hook proc +- addq #4,sp ; otherwise, just return ++ move.l DskSwtchHook,d0 ; OffLineVol points to VCB, a0 to request ++ beq.s @Return ; br if there is no hook proc ++ cmp.l #-1,d0 ; -1 is also a bad proc, ++ beq.s @Return ; therefore br ++ move.l d0,-(sp) ; tail call the hook proc + + ;• This code was not in the system patch do we want it?? + ;• IF ForROM THEN +@@ -420,7 +427,7 @@ MoreFCBs: proc + move.w (a2),d0 ; Get size of the old array + move.w sr,-(sp) ; save current status register + ori.w #HiIntMask,sr ; turn interrupts off to protect from marauding async calls +- _BlockMove ; copy the old array (including its old size word) ++ _BlockMoveData ; copy the old array (including its old size word) + move.l a1,FCBsPtr ; set new FCB array address (leave the old size for now) + move.w (sp)+,sr ; restore status register + +@@ -455,7 +462,7 @@ MoreFCBs: proc + move.l d1,d0 ; d0= count =old size + move.w sr,-(sp) ; save current status register + ori.w #HiIntMask,sr ; turn interrupts off to protect from marauding async calls +- _BlockMove ; copy over ++ _BlockMoveData ; copy over + add.w d4,cbPBufCount(a1) ; set new count <38> + move.l a1,FSVars.fcbPBuf(a3) ; save new array + movea.l FCBsPtr,a0 ; now that it is safe, update the main FCB array size +@@ -535,7 +542,7 @@ MoreWDCBs proc + movea.l a0,a2 ; save for later + move.w sr,-(sp) ; save current status register + ori.w #HiIntMask,sr ; turn interrupts off to protect from marauding async calls +- _BlockMove ; a1 is preserved ++ _BlockMoveData ; a1 is preserved + move.l a1,WDCBsPtr ; set new WDCB array address + move.w (sp)+,sr ; restore status register + +@@ -564,7 +571,7 @@ MoreWDCBs proc + move.l d1,d0 ; old size + move.w sr,-(sp) ; save current status register + ori.w #HiIntMask,sr ; turn interrupts off to protect from marauding async calls +- _BlockMove ; copy over ++ _BlockMoveData ; copy over + add.w #fsWDCBExtendCount,cbPBufCount(a1) ; set new count <38> + move.l a1,FSVars.wdcbPBuf(a3) ; save new array + movea.l WDCBsPtr,a0 ; now that it is safe, update the main WDCB array size +@@ -615,38 +622,6 @@ interruptRegs reg a4-a6/d4-d7 + rts + + endproc +-;—————————————————————————————————————————————————————————————————————————————————————————— +-; +-; fsSCSIFreeHookProc +-; +-; This procedure is called by the SCSI manager every time the SCSI bus is +-; freed up. If (the File System is busy) and (we're waiting for a wake up) +-; then jump to where we deferred until SCSI was free. +-; +-;—————————————————————————————————————————————————————————————————————————————————————————— +-fsSCSIFreeHookProc: proc +- import SCSINotBusy +- +- bclr.b #fsSCSIDefer, FSBusy ; if we're waiting, we'll have this flag set +- beq.s NoWakeUp +- +- MOVEM.L D1-D7/A0-A6,-(SP) ; preserve registers (for caller of fsSCSIFreeHook) +- PEA SCSIBusyReturn ; return to here to restore regs +- +- MOVEA.L HFSStkPtr,A6 ; Recover HFS' private stack pointer +- MOVEM.L (A6)+,D1-D7/A0-A5 ; Retrieve registers off A6 stack +- MOVE.L A6,HFSStkPtr ; save stack ptr +- +- JMP SCSINotBusy ; continue with the dispatch +- +-SCSIBusyReturn +- MOVEM.L (SP)+,D1-D7/A0-A6 ; restore significant registers +- +-NoWakeUp RTS ; +- +- endproc +- +- + ;________________________________________________________________________________ + ; + ; fsGeneralWakeUp +@@ -680,9 +655,13 @@ fsGeneralWakeUp: proc + ; ________________________________________________________________________________ + ProcessMgrExists proc export + move.l a0,-(sp) ; save a0 +- move.l #GestaltOSAttr,d0 ; set up Gestalt selector +- _Gestalt ; ask Gestalt about Process Mgr +- movea.l (sp)+,a0 ; d0 = OSErr, noErr if Process Mgr exists ++ move.l ExpandMem,a0 ++ tst.w ExpandMemRec.emProcessMgrExists(a0) ++ bne.s @yes ++ moveq #1,d0 ++ bra.s @return ++@yes moveq #0,d0 ++@return movea.l (sp)+,a0 ; d0 = OSErr, noErr if Process Mgr exists + rts ; leave with condition codes intact + + endproc +diff --git a/OS/HFS/HFS.make b/OS/HFS/HFS.make +--- a/OS/HFS/HFS.make ++++ b/OS/HFS/HFS.make +@@ -25,7 +25,6 @@ HFSObjs = "{LibDir}BTreeMgr.lib" ∂ + "{ObjDir}BTMaint2.a.o" ∂ + "{ObjDir}BTSVCS.a.o" ∂ + "{ObjDir}QMgr.a.o" ∂ +- "{ObjDir}cache.a.o" ∂ + "{ObjDir}TFS.a.o" ∂ + "{ObjDir}cacheio.a.o" ∂ + "{ObjDir}cmmaint.a.o" ∂ +diff --git a/OS/HFS/MFSVOL.a b/OS/HFS/MFSVOL.a +--- a/OS/HFS/MFSVOL.a ++++ b/OS/HFS/MFSVOL.a +@@ -467,10 +467,10 @@ GetMFSVolInfo + + RetMFSVolInfo + BSET #6,VCBAtrb+1(A2) ; set if any files are opened +- BSR.S Gt1stFCB ; get (A1,D1) pointing to first FCB ++ BSR Gt1stFCB ; get (A1,D1) pointing to first FCB + @1 CMP.L FCBVPtr(A1,D1),A2 ; file open on this volume? + BEQ.S @2 ; br if so +- BSR.S GtNxtFCB ; get next one until we run out ++ BSR GtNxtFCB ; get next one until we run out + BCS.S @1 + BCLR #6,VCBAtrb+1(A2) ; 0 if no open files match + +diff --git a/OS/HFS/TFS.a b/OS/HFS/TFS.a +--- a/OS/HFS/TFS.a ++++ b/OS/HFS/TFS.a +@@ -182,6 +182,7 @@ SonyNonPortable EQU 1 + INCLUDE 'InternalMacros.a' + INCLUDE 'SysPrivateEqu.a' + INCLUDE 'BTreeEqu.a' ++ INCLUDE 'FSPrivate.a' + PRINT ON + + PRINT NOGEN +@@ -222,7 +223,7 @@ TFSDispatch Proc Export + tst.w d0 ; check lower bound of selector + blt.l UnknownCall ; negative traps are no good + cmp.w #MaxTrapNum,d0 ; check upper bound of selector +- bge.l UnknownCall ; off the deep end ++ bhs.l UnknownCall ; off the deep end + + move.w d1,ioTrap(a0) ; save the unmunged trap + andi.w #$0F00,ioTrap(a0) ; leave only modifiers (Async etc.) +@@ -259,7 +260,7 @@ TFSTrpTbl ; pc relative data + DispatchEntry LockRng ; $10 Lock a byte range + DispatchEntry UnLockRng ; $11 Unlock a byte range + +- DispatchEntry UnknownCall ; $12 ++ DispatchEntry XGetVolInfo ; $12 Get extended volume info + DispatchEntry UnknownCall ; $13 + DispatchEntry CreateFileIDRef ; $14 + DispatchEntry DeleteFileIDRef ; $15 +@@ -390,8 +391,8 @@ TurboFS PROC EXPORT + EXPORT vMtCheck,vCheckReMount,vFindDrive,vDtrmV2,vFClose,vFlushMDB ;<19Feb87> + EXPORT vLg2Phys ; <08Oct85> + EXPORT DSHook ++ EXPORT XGetVolInfo ; Fun fact: this export must not move + EXPORT vFileRead, vFileWrite, vFileClose ; +- EXPORT InitFS ;<1.2> + + IF hasManEject THEN ; + EXPORT SwitchDisk ; for Desk Mgr +@@ -417,6 +418,7 @@ TurboFS PROC EXPORT + IMPORT fsGeneralWakeUp ; from FileMgrHooks.a + IMPORT fsSCSIFreeHookProc ; from FileMgrHooks.a + IMPORT ProcessMgrExists ; from FileMgrHooks.a ++ IMPORT FlushCRange + + + ;________________________________________________________________________________ +@@ -658,7 +660,9 @@ FSQueueSync + + FSQueue + MOVE.L FSQueueHook,D2 ; queue hook? +- BLE.S @0 ; br if not . . . ++ BZ.S @0 ; invalid values are 0 and -1 ++ CMP.L #-1,D2 ++ BEQ.S @0 ; br if not . . . + MOVE.L D2,A1 + JSR (A1) ; D2 and A1 are expendable + +@@ -692,9 +696,14 @@ SyncWait MOVE.W IOResult(A0),D0 ; get the result code into D0 + + CMP.W #VolOffLinErr,D0 ; volume off-line error? (detected by file + BNE.S @1 ; system) br if not +- MOVE.L DskSwtchHook,-(SP) ; OffLineVol points to VCB, A0 to request +- BGT.S @1 ; br if there is a hook proc +- ADDQ #4,SP ; otherwise, just return ++ MOVE.L DskSwtchHook,D0 ; OffLineVol points to VCB, A0 to request ++ BZ.S @nohook ; return offline error even when the hook ++ CMP.L #-1,D0 ; is invalid (0 or -1) ++ BEQ.S @nohook ++ MOVE.L D0,-(SP) ; do the proc but also return error? ++ MOVEQ #volOffLinErr,D0 ++ BRA.S @1 ++@nohook MOVEQ #volOffLinErr,D0 + + IF ForROM THEN ; <27Mar89 V1.8> + BTST #7, DSAlertRect ; already in our proc? <06Mar85> +@@ -834,12 +843,16 @@ RealCmdDone + + cd_CkExtFS BCLR #SkipPMSP,HFSFlags ; Don't skip PMSP now that this trap's done <25Sep85> + MOVE.L ExtFSHook,D2 ; queue hook? +- BLE.S @1 ; br if not . . . ++ BZ.S @1 ; invalid values are 0 and -1 ++ CMP.L #-1,D2 ++ BEQ.S @1 ; br if not . . . + MOVE.L D2,A1 ; (external fs, debug) + JSR (A1) ; leave CmdDone address on the stack + @1 + move.l toExtFS,d2 ; Any external file systems defined? <10Nov87> +- ble.s cd_DeQueue ; Xfer if not... <10Nov87> ++ bz.s cd_DeQueue ; invalid values are 0 and -1 ++ cmp.l #-1,d2 ++ beq.s cd_DeQueue ; Xfer if not... + move.l d2,a1 ; Else, point to first proc in chain <10Nov87> + + cmp.w #ExtFSErr,d0 ; Pass request on to external FS's? <10Nov87> +@@ -1110,9 +1123,11 @@ TFSAgain: OR.B #$A0,TrapAgain ; Set up top nibble + AND.W #$00FF,D0 ; Remove modifier bits from saved index + ; + FlushTrapAgain ; +- MOVE.L D1,-(SP) ; save D1 for 020/030's <2> rb +- JSR ([jCacheFlush]) ; flush the cache <2> rb +- MOVE.L (SP)+,D1 ; restore D1 <2> rb ++ MOVEM.L D0/A0/A1,-(SP) ++ LEA TrapAgain,A0 ++ LEA $4,A1 ++ BSR.L FlushCRange ++ MOVEM.L (SP)+,D0/A0/A1 + JMP TrapAgain ; Go re-execute the original I/O trap <2> rb + + +@@ -1273,7 +1288,9 @@ DoEject + MOVE.W D1,IODrvNum(A0) + + MOVE.L EjectNotify,D0 ; notify proc? +- BLE.S @1 ; br if not ++ BZ.S @1 ; invalid values are 0 and -1 ++ CMP.L #-1,D0 ++ BEQ.S @1 ; br if not + + MOVEM.L D2/A0-A2,-(SP) + CLR.W -(SP) +@@ -1294,6 +1311,8 @@ DoEject + @2 ADD #IOVQElSize,SP ; clean up stack and return + RTS + ++ MACRO ++ InsertLater_InitFS + ;----------------------------------------------------------------- + ; Initialize the file system. + ; +@@ -1319,8 +1338,6 @@ InitFS TST.W FSFCBLen ; are we in already? + + ; get some memory for the FCBs + +- CMP.W #2,MemTop ; 128K machine? <25Oct85> +- BLE.S @2 ; no multiplier for 128K <22Oct85> + LSL.W #2,D0 ; mult by 4 for 512K+ <25Oct85> + + @2 MOVE D0,D2 ; save for WDCB allocation <25Oct85> +@@ -1345,13 +1362,6 @@ InitFS TST.W FSFCBLen ; are we in already? + MOVE.W D1,(A0) ; Store length of WDCB array <11Apr85> + MOVE.L A0,WDCBsPtr ; Store pointer in lomem <11Apr85> + +- BigLEA WDCBSwOS,A2 ; point to offset to the WDCB entry <1.2> +- MOVE.W (A2),A2 ; Get the offset to the WDCB entry <1.2> +- ADD.L SwitcherTPtr,A2 ; Index into Switcher Table <1.2> +- MOVE.L A0,(A2) ; Fill in entry for WDCB switch <27Oct86><1.2> +- NOT.L (A2)+ ; ... complement for long addresses <27Oct86><1.2> +- MOVE.W D1,(A2) ; <27Oct86><1.2> +- + ; Allocate a File System Stack: + + MOVE.L #(HFSStkLen+HFSTmpSize),D0 ; Size of stack area <26Aug85> +@@ -1364,40 +1374,19 @@ InitFS TST.W FSFCBLen ; are we in already? + _NewPtr ,SYS,CLEAR ; Allocate space for it <18Aug85> + BNE FSInitErr ; Punt on errors <18Aug85> + +- BigLEA PMSPSwOS,A2 ; point to offset to the PMSP entry <1.2> +- MOVE.W (A2),A2 ; Get the offset to the PMSP entry <1.2> +- ADD.L SwitcherTPtr,A2 ; Index into Switcher Table <1.2> +- MOVE.L A0,(A2) ; Fill in entry for PMSP hook switch <27Oct86><1.2> +- NOT.L (A2) ; ... complement for long addresses <27Oct86><1.2> + ADDQ.L #SPHdrSize,A0 ; Point beyond PMSP header <18Aug85> + MOVEQ #(PMSPSize-SPHdrSize),D0 ; Get length of remaining table <18Aug85> + MOVE.W D0,(A0) ; Stash it at the start of the table <18Aug85> + MOVE.L A0,PMSPPtr ; Set up the lo-mem pointer <18Aug85> + +-; Set up the lomem system cache pointers: (hack in until new cache arrives . . .) +- +- MOVE.W #512,D1 ; Set up cache block size <26Aug85> +- +- MOVEQ #1,D0 ; Allocate 1-block bitmap cache <26Aug85> +- Jsr InitCache ; Set up the cache <26Aug85><1.2> +- BNE.S FSInitErr ; <26Aug85> +- MOVE.L A1,SysBMCPtr ; Bitmap cache pointer. <26Aug85> +- +- MOVEQ #1,D0 ; Allocate a 1-block volume cache <20Sep85> +- CMP.W #2,MemTop ; 128K machine? <20Sep85> +- BLE.S @4 ; br if so <20Sep85> +- MOVEQ #2,D0 ; Allocate a 2-block volume cache <20Sep85> +-@4 Jsr InitCache ; Set up the cache <20Sep85><1.2> +- BNE.S FSInitErr ; <26Aug85> +- MOVE.L A1,SysVolCPtr ; Volume cache pointer <26Aug85> +- +- MOVEQ #4,D0 ; Allocate a small B*-Tree cache <04Nov85> +- CMP.W #2,MemTop ; 128K machine? <27Aug85> +- BLE.S @5 ; br if so <27Aug85> +- MOVEQ #16,D0 ; Allocate a LARGE B*-Tree cache <20Sep85> +-@5 Jsr InitCache ; Create a new cache <26Aug85><1.2> +- BNE.S FSInitErr ; <26Aug85> +- MOVE.L A1,SysCtlCPtr ; B*-Tree Control cache pointer <26Aug85> ++ MOVE.W SysVersion,-(SP) ++ CLR.W SysVersion ++ MOVE.B SPMisc1,-(SP) ++ MOVE.B #3,SPMisc1 ++ MOVE.L #$00200000,D2 ; unclear purpose, gets clobbered anyway ++ BSR.L InitCache ++ MOVE.B (SP)+,SPMisc1 ++ MOVE.W (SP)+,SysVersion + + ; Set up a disk switch hook + +@@ -1431,6 +1420,8 @@ FSInitOK MOVEQ #0,D0 ; success! + FSInitErr MOVEQ #-1,D0 ; we failed + RTS + ++ ENDM ++ + ;_____________________________________________________________________________________ + ; <38> + ; CountFCBs +@@ -1753,6 +1744,8 @@ clearPB MOVEA.L A0,A3 ; A3=A0=iopb + DBRA D0,@2 ; clear 28 bytes + RTS + ++ MACRO ++ InsertLater_InstallVectors + ; __________________________________________________________________________________ + ; InstallVectors + ; +@@ -1777,7 +1770,7 @@ InstallVectors + + ; install some vectors: + move.l ExpandMem, a1 +- lea vSyncWait, a0 ; get addr of syncwait (in this fsQueueHook patch) ++ lea SyncWait, a0 ; get addr of syncwait (in this fsQueueHook patch) + move.l a0, ExpandMemRec.jSyncWait(a1) + lea vAfterFSQHook, a0 ; get addr just past call to fsQueueHook (in fsQueueHook patch) + move.l a0, ExpandMemRec.jAfterFSQHook(a1) +@@ -1792,6 +1785,10 @@ InstallVectors + + rts + ++ ENDM ++ ++ MACRO ++ InsertLater_FSGrowPatchInit + ;__________________________________________________________________________________ + ; + ; Initialize FCB expansion patch, WDCB expansions patch, and vectors +@@ -1849,6 +1846,8 @@ GrowErrExit: + MOVEQ #dsMemFullErr,D0 ; no mem + _SysError + ++ ENDM ++ + + + ;________________________________________________________________________________ +@@ -1906,7 +1905,7 @@ GetVolParms: + bne.s @notMFS ; no, skip the following + lea.l @MFSVolParmsBuffer, a0 ; copy the static values for MFS volumes + @notMFS: +- _BlockMove ++ _BlockMoveData + + bsr CheckDesktopSupport ; returns zero clear if support, set if none + beq.s @NoDTSupport ; z set means no support +@@ -1983,6 +1982,13 @@ GetVolParms: + + ****************************************************************************************** + ++ PROC ++ IMPORT InitCache, QMInit, DTDBMgrInit, SyncWait, fsSCSIFreeHookProc ++ EXPORT InitFS, FSGrowPatchInit, InstallVectors ++ InsertLater_InitFS ++ InsertLater_FSGrowPatchInit ++ InsertLater_InstallVectors ++ ENDP + + END + +diff --git a/OS/HFS/TFSCOMMON.a b/OS/HFS/TFSCOMMON.a +--- a/OS/HFS/TFSCOMMON.a ++++ b/OS/HFS/TFSCOMMON.a +@@ -61,16 +61,17 @@ + BLANKS ON + STRING ASIS + +-DivUp: DIVU D1,D0 ; Divide by allocation blocks size +- SWAP D0 ; Examine the remainder +- TST.W D0 ; +- BEQ.S @10 ; If zero, we have a perfect fit. +- CLR.W D0 ; If not, clear the remainder +- SWAP D0 ; Restore the quotient +- ADDQ.W #1,D0 ; and add one +- BRA.S @20 ; +-@10: SWAP D0 ; Restore quotient to lower word +-@20: RTS ; And call it a day. ++DivUp: MOVE.L D2,-(SP) ; Save D2 for remainder ++ TDIVU.L D1,D2:D0 ; Divide by allocation blocks size ++ TST.L D2 ; Examine the remainder ++ BEQ.S @10 ; If zero, we have a perfect fit. ++ ADDQ.L #1,D0 ; If not, add one ++@10: MOVE.L #$FFFF,D2 ; ++ CMP.L D2,D0 ; Impose a maximum of 2^16-1 blocks. ++ BLS.S @20 ; ++ MOVE.L D2,D0 ; ++@20: MOVE.L (SP)+,D2 ; Restore D2. ++ RTS ; And call it a day. + + ;_______________________________________________________________________ + ; +@@ -101,9 +102,12 @@ RoundAlloc: + BSR.S DivUp ; Get size in Clumps <06Nov85> + MULU D1,D0 ; And mult. back out -> size in AlBlks + ; (guaranteed to be word magnitude) +-*PWD* MOVE.L VCBAlBlkSiz(A2),D1 ; Pick up alloc. block size again +-*PWD* MULU D1,D0 ; Get size in bytes again +- MOVE.L (SP)+,D1 ; Recover original D1 ++ MOVE.L D0,D1 ; ++ SWAP D1 ; ++ TST.W D1 ; ++ BEQ.S @ret ; ++ MOVE.L #$FFFF,D0 ; ++@ret: MOVE.L (SP)+,D1 ; + RTS + + ;_______________________________________________________________________ +@@ -296,14 +300,14 @@ vFlushMDB ; 'vectored' FlushMDB routine <19Feb87> + MOVEA.L A0,A1 ; Set up as destination for _BlockMoves + LEA VCBDInfoSt(A2),A0 ; Point to MDB info in VCB + MOVE.L #LenMDB,D0 ; Length to copy +- _BlockMove ; Copy VCB info ++ _BlockMoveData ; Copy VCB info + + ; Add some TFS-specific information: + + LEA VCBTDInfoSt(A2),A0 ; Point to additional info + LEA DrTInfoSt(A1),A1 ; Point to tail end of MDB + MOVEQ #VCBTDILen,D0 ; Length of TFS info +- _BlockMove ; Copy it into the MDB Buffer ++ _BlockMoveData ; Copy it into the MDB Buffer + SUBA.L #DrTInfoSt,A1 ; Point A1 back to start of buffer + + MOVEA.L FCBsPtr,A3 ; Point to FCB array +@@ -312,7 +316,7 @@ vFlushMDB ; 'vectored' FlushMDB routine <19Feb87> + MOVEQ #lenXDR,D0 ; Length of extent record + LEA FCBExtRec(A3,D1),A0 ; Point to extent record in FCB + LEA DrXTExtRec(A1),A1 ; Point to first (and only) XT extent record +- _BlockMove ; Copy in the extent record ++ _BlockMoveData ; Copy in the extent record + MOVEM.L (SP)+,A0-A1 ; Restore originals + MOVE.L FCBPLen(A3,D1.W),D0 ; Pick up length of extent B*-Tree <22Sep85> + MOVE.L D0,DrXTFlSize(A1) ; Store length of extent tree in MDB buffer <22Sep85> +@@ -326,7 +330,7 @@ vFlushMDB ; 'vectored' FlushMDB routine <19Feb87> + MOVEQ #lenXDR,D0 ; Length of extent record + LEA FCBExtRec(A3,D1),A0 ; Point to extent record in FCB + LEA DrCTExtRec(A1),A1 ; Point to first (and only) XT extent record +- _BlockMove ; Copy in the extent record ++ _BlockMoveData ; Copy in the extent record + MOVEM.L (SP)+,A0-A1 ; Restore originals + MOVE.L FCBPLen(A3,D1.W),D0 ; Pick up length of catalog B*-Tree <22Sep85> + MOVE.L D0,DRCTFlSize(A1) ; Store length of catalog tree <22Sep85> +diff --git a/OS/HFS/TFSDIR1.a b/OS/HFS/TFSDIR1.a +--- a/OS/HFS/TFSDIR1.a ++++ b/OS/HFS/TFSDIR1.a +@@ -410,14 +410,14 @@ ChkVol MOVE.W D1,IORefNum(A0) ; refnum is the FCB index! + BNE.S @5 ; If set, that's what we wanted + LEA FilRExtRec(A5),A0 ; Point to resource fork's extents instead + @5 LEA FCBExtRec(A3),A1 ; Point to extent record in FCB +- _BlockMove ; Copy the extent record ++ _BlockMoveData ; Copy the extent record + + MOVEQ #0,D0 ; Clear top half of D0 + MOVE.W D2,D0 ; Get name length + MOVEA.L A4,A0 ; Point to filename in pathname + LEA FCBCName(A3),A1 ; Point to name field in FCB + MOVE.B D0,(A1)+ ; Copy in CName length +- _BlockMove ; Make a copy of the name string ++ _BlockMoveData ; Make a copy of the name string + MOVEM.L (SP)+,A0-A1 ; Restore the scratch registers + + ; Fetch the catalog record for the file so the file's real name can be <1.3> +@@ -451,7 +451,7 @@ ChkVol MOVE.W D1,IORefNum(A0) ; refnum is the FCB index! + moveq #0,d0 ; <1.3> + move.b (a0),d0 ; get length of name string <1.3> + addq.l #1,d0 ; take length byte into account <1.3> +- _BlockMove ; move case-correct name into FCB <1.3> ++ _BlockMoveData ; move case-correct name into FCB <1.3> + move.l (a6)+,a0 ; restore param block ptr <1.4> + + CLR.W D7 ; Clear directory block number +@@ -476,13 +476,17 @@ ChkVol MOVE.W D1,IORefNum(A0) ; refnum is the FCB index! + MOVE.W (A5)+,D4 ; FilRStBlk + MOVE.L (A5)+,D5 ; FilRLgLen + MOVE.L (A5)+,D6 ; FilRPyLen +-@30 BSR.S PermssnChk ; Check if the requested file access is OK ++@30 MOVE.W #fsDataTooBigErr,D0 ; Check for a resource fork that is over 2 GB ++ TST.L D6 ; If so, die with an error ++ BMI.S @error ++ BSR.S PermssnChk ; Check if the requested file access is OK + BEQ.S SetupFCB ; Continue if all was well + ; + ; We're going to exit with an error, but some FCB fields have already been set + ; up. Zero the FCB here just to be neat (especially since the MFS code doesn't + ; clear these fields on open)... + ; ++@error + MOVEQ #0,D1 ; <03Feb87> + MOVE.W FSFCBLen,D1 ; (FCB length / 2) - 1 <03Feb87> + LSR.W #1,D1 ; <03Feb87> +@@ -751,7 +755,7 @@ PushCName MOVEM.L D0/A1,-(SP) ; Save 'em through this little manouver + MOVEA.L A6,A1 ; Point to target string start + MOVEQ #0,D0 ; Clear top word of D0 <25Oct85> + MOVE.W D2,D0 ; String length for _BlockMove +- _BlockMove ++ _BlockMoveData + MOVE.W D2,-(A6) ; Push length in front of new string + MOVE.W (SP)+,D2 ; Set D2 to 'fixed' length + MOVEA.L A6,A0 ; Point to element name +diff --git a/OS/HFS/TFSDIR2.a b/OS/HFS/TFSDIR2.a +--- a/OS/HFS/TFSDIR2.a ++++ b/OS/HFS/TFSDIR2.a +@@ -497,7 +497,7 @@ NmOK BSR CVFlgs ; is the volume locked/write protected? + MOVE.B D3,(A1)+ ; Store CName length + MOVEQ #0,D0 ; make sure high word is clear <29Aug85> + MOVE.B D3,D0 ; Set up for block move +- _BlockMove ; Copy in the name ++ _BlockMoveData ; Copy in the name + MOVEA.L FCBsPtr,A1 ; Restore A1 to its former glory + BSR GtNxtMatch ; And look for the next FCB + BEQ.S @100 ; If found, do it all again +diff --git a/OS/HFS/TFSDIR3.a b/OS/HFS/TFSDIR3.a +--- a/OS/HFS/TFSDIR3.a ++++ b/OS/HFS/TFSDIR3.a +@@ -466,7 +466,7 @@ FndFN2 BSR ExtOffLinCk ; make sure it's online, internal fs + MOVEA.L A4,A0 ; Point to source string start + MOVEA.L A6,A1 ; Point to target string start + MOVE.L D1,D0 ; String length for _BlockMove +- _BlockMove ++ _BlockMoveData + MOVE.W D1,-(A6) ; Push length in front of new string + MOVE.L (SP)+,D1 ; Set D1 to 'fixed' length + MOVEA.L A6,A0 ; Point to element name +@@ -673,7 +673,7 @@ fakeRoot LEA ioFlAttrib(A0),A1 ; Clear the return information + LEA VCBVN(A2),A0 ; Source name is in VCB + MOVEQ #1,D0 ; Clear top 3 bytes, add one for length byte <29Aug85> + ADD.B (A0),D0 ; Pick up length to copy +- _BlockMove ; Copy volume name ++ _BlockMoveData ; Copy volume name + GFIOK MOVEQ #0,D0 ; Indicate complete success + BRA.S GFIExit ; All done! + +diff --git a/OS/HFS/TFSRFN1.a b/OS/HFS/TFSRFN1.a +--- a/OS/HFS/TFSRFN1.a ++++ b/OS/HFS/TFSRFN1.a +@@ -272,6 +272,7 @@ FileRead: + vFileRead: ; 'vectored' FileRead routine + BSR FSQueue ; wait our turn + ++ CLR.L IOActCount(A0) ; zero the bytes-read-count in case of error + BSR RFnCall ; map the reference number + BNE FRdExit1 ; exit on errors (don't set IOPosOffset) + ; (also exit for offline, ext fs calls) +@@ -350,7 +351,16 @@ FRdEOFXit MOVEQ #EOFErr,D0 ; then we must have hit end of file . . . + + FRdExit0 MOVE.L D5,FCBCrPs(A1,D1) ; update current position in FCB + MOVE.L D5,IOPosOffset(A0) ; always return current pos +-FRdExit1 BSR.L CacheFlush ; CSS ++FRdExit1 MOVE.L D0,D1 ++ MOVE.L A0,D2 ++ MOVE.L IOActCount(A0),D0 ++ BEQ.S @noflush ++ MOVE.L D0,A1 ++ MOVE.L IOBuffer(A0),A0 ++ BSR.L FlushCRange ++@noflush MOVE.L D2,A0 ++ MOVE.L D1,D0 ++ + BRA CmdDone ; bye now . . . + + ; reading while looking for end of line characters . . . do it a block at a time +@@ -474,7 +484,6 @@ FileWrite: + RTS ; go there + vFileWrite: ; 'vectored' FileWrite routine + +- BSR.L CacheFlush ; flush the chip caches so data is in memory. CSS + BSR FSQueue ; don't do the call until time. + BSR TstMod ; test if we may modify this file. + BNE.S FWrExit1 ; br if not. +diff --git a/OS/HFS/TFSRFN2.a b/OS/HFS/TFSRFN2.a +--- a/OS/HFS/TFSRFN2.a ++++ b/OS/HFS/TFSRFN2.a +@@ -342,39 +342,15 @@ ResetAEOF ;<14Jan86>;TST.B FlushOnly ; Just flushing? + ; MOVEM.L (SP)+,D0-D1 ; Restore scratch registers <12Dec86> + + @1 MOVEQ #0,D2 ; Truncate to alloc block <14Jan86> +-; from DontTruncateMultiForks .start +- +-@Regs reg d1-d4 ; <44> +-; Look for other paths to the same fork as the one being closed. +- MOVEM.L @Regs,-(SP) ; save input parameters <11Dec90 #17> +- MOVE.W D1,D3 ; D3.W = our FCB <11Dec90 #17> +- MOVE.L FCBFlNm(A1,D3.W),D2 ; D2.L = our file number <11Dec90 #17> +- move.b fcbMdRByt(a1,d3.w),d4 ; d4.b = our fork's misc info <44> +- +- BSR Gt1stFCB ; get (A1,D1) pointing to first FCB <11Dec90 #17> +-@2 CMP.W D1,D3 ; same FCB? <11Dec90 #17> +- BEQ.S @3 ; skip ourself if it is <11Dec90 #17> +- CMP.L FCBFlNm(A1,D1),D2 ; file numbers match? <11Dec90 #17> +- BNE.S @3 ; no <11Dec90 #17> +- CMP.L FCBVPtr(A1,D1),A2 ; on the same volume? <11Dec90 #17> +- bne.s @3 ; no <44> +- move.b fcbMdRByt(a1,d1.w),d0 ; grab this fork’s kind <44> +- eor.b d4,d0 ; see how it compares against ours <44> +- btst.l #fcbRscBit,d0 ; are we the same? <44> +- beq.s @7 ; if so, then there's another open path <44> +-@3 BSR GtNxtFCB ; get next one until we run out <11Dec90 #17> +- BCS.S @2 ; continue if more <11Dec90 #17> +- +-; No second open path found, so do the truncate +- MOVEM.L (SP)+,@Regs ; restore regs and <11Dec90 #17> + JSR TruncateFile ; Truncate to this position + BNE FlFilBErr ; Bad time for errors (from CMGetCN) <21Oct85> ++ JSR AdjEOF ; adjust any other FCBs for this file + BCLR #FCBModBit,FCBMdRByt(A1,D1) ; mark the FCB clean again in + BRA.S updFLCat + ++; Vestigial, someone forgot to remove it: + ; A second path was found, so skip the truncation + +-@7 MOVEM.L (SP)+,@Regs ; we did nothing, but quite successfully .end + BCLR #FCBModBit,FCBMdRByt(A1,D1) ; mark the FCB clean again in <14Jan86> + ; case marked dirty by TruncateFile <14Jan86> + ; Now retrieve the file's catalog entry, and update the information there: +@@ -396,19 +372,21 @@ updFlCat MOVE.L A1,-(A6) ; Save A1 across CMGetCN call + LEA filRExtRec(A5),A3 ; Point to resource fork extent record + @1 MOVEA.L A3,A1 ; Set dest. for _BlockMove + MOVEQ #lenXDR,D0 ; Length of extent record to copy +- _BlockMove ; Copy it into the catalog ++ _BlockMoveData ; Copy it into the catalog + MOVEM.L (SP)+,A0-A1 ; Restore original A0,A1 + + LEA filStBlk(A5),A3 ; Update destination for UpDatFlNtry + BSR UpDatFlNtry ; Update the catalog + MOVE.L Time,filMdDat(A5) ; Set date/time modified + JSR CMUpdateCN ; Write out the modified catalog entry +- BNE FlFilBErr ; Bad time for errors (from CMGetCN) CSS ++ BNE.S FlFilBErr ; Bad time for errors (from CMGetCN) CSS + + BTST #FCBFlgRBit,FCBMdRByt(A1,D1) ; Resource fork? +- BEQ FlFilBuf ; Br if not <21Oct85> CSS ++ BEQ.S FlFilBuf ; Br if not <21Oct85> CSS ++ TST.B FlushOnly ; Just flushing? ++ BNE.S FlFilBuf ; Br if so + CMP.L #128,FCBEOF(A1,D1) ; Room for a catalog entry copy? +- BCS FlFilBuf ; If not, forget it <21Oct85> CSS ++ BCS.S FlFilBuf ; If not, forget it <21Oct85> CSS + + MOVEM.L A1/D1,-(A6) ; Save FCB pointer across call + MOVE.L A0,A3 ; Save Key pointer +@@ -423,19 +401,19 @@ updFlCat MOVE.L A1,-(A6) ; Save A1 across CMGetCN call + LEA 48(A0),A1 ; Point into the block to write catalog entry + LEA ckrCName(A3),A0 ; Point to CNode name there + MOVEQ #(lenCKR-4-2),D0 ; Length of key - dirID - length byte+filler +- _BlockMove ; ++ _BlockMoveData ; + MOVEQ #(lenCKR-4-2),D0 ; Same length again + ADDA.L D0,A1 ; Update destination pointer + + LEA filFlags(A5),A0 ; Source: catalog entry + MOVEQ #(filUsrWds+16-filFlags),D0 ; length to copy +- _BlockMove ; ++ _BlockMoveData ; + MOVEQ #(filUsrWds+16-filFlags),D0 ; length to advance pointer by + ADDA.L D0,A1 ; Update destination pointer + + LEA filFndrInfo(A5),A0 ; Point to additional finder info + MOVEQ #16,D0 ; Length of finder info +- _BlockMove ; ++ _BlockMoveData ; + MOVEQ #16,D0 ; Distance to advance pointer + ADDA.L D0,A1 ; Advance the pointer + +@@ -714,7 +692,7 @@ GetFCBInfo: + LEA ioFCBFlNm(A0),A1 ; Destination is PB <24Sep86> + MOVEA.L A3,A0 ; Source is FCB + MOVEQ #ioFIStILen,D0 ; Length of information to straight copy +- _BlockMove ; Copy the first chunk ++ _BlockMoveData ; Copy the first chunk + MOVEA.L (SP)+,A0 ; Restore IOPB pointer + MOVE.W VCBVRefNum(A2),ioFCBVRefNum(A0) ; Return volume refNum <24Sep86> + MOVE.L FCBClmpSize(A3),ioFCBClpSiz(A0) ; File clump size <24Sep86> +@@ -727,7 +705,7 @@ GetFCBInfo: + LEA FCBCName(A3),A0 ; Source is CName in FCB (loses PB Ptr) + MOVEQ #1,D0 ; Clear upper bytes in D0, add length byte + ADD.B (A0),D0 ; Pick up number of bytes to copy +- _BlockMove ; Copy the filename ++ _BlockMoveData ; Copy the filename + MOVEA.L (SP)+,A0 ; Restore pointer to I/O PB + + @80 MOVE.L A2,ReqstVol ; Set up ReqstVol, D1 for external FS +diff --git a/OS/HFS/TFSVOL.a b/OS/HFS/TFSVOL.a +--- a/OS/HFS/TFSVOL.a ++++ b/OS/HFS/TFSVOL.a +@@ -527,7 +527,7 @@ mv_GotMDB: + + LEA VCBDInfoSt(A2),A1 ; Destination is in VCB + MOVEQ #VCBDILen,D0 ; Length of MFS/TFS info in MDB +- _BlockMove ; Copy the information ++ _BlockMoveData ; Copy the information + + MV_GetWPStatus: + MOVE.L FSQHead,A0 ; A0 -> current request +@@ -543,15 +543,23 @@ MV_GetWPStatus: + MOVE.B D0,VCBAtrb+1(A2) ; write-protect, zeroed consistency status + _AssumeEq VCBWrProt,7 + ++ BSR CheckCtrl23 ; Check that _Control 23 == 16 or 17 ++ BNE.S @notEqual ++ BSET #10,vcbAtrb(A2) ++@notEqual ++ + ; Now the MFS code diverges from the TFS code. + + BSR TFSVCBTst ; Is it an MFS volume? <01Oct85> +- BNE MV_GetMFSMap ; Br if so (do the MFS-specific stuff) <01Oct85> ++ BEQ.S @tfsSoNoLock ++ ORI.W #$8000,vcbAtrb(A2) ; Disable MFS write support ++ BRA MV_GetMFSMap ; Br if so (do the MFS-specific stuff) ++@tfsSoNoLock + + LEA DrTInfoSt(A5),A0 ; Advance pointer to additional TFS stuff + LEA VCBTDInfoSt(A2),A1 ; Point to additional TFS-specific info + MOVEQ #VCBTDILen,D0 ; Length of additional information +- _BlockMove ; Copy the additional information in ++ _BlockMoveData ; Copy the additional information in + + MOVE.L VCBAlBlkSiz(A2),D1 ; Pick up allocation block size <22Sep85> + MOVE.L DrXTFlSize(A5),D0 ; Pick up PEOF of extent B*-Tree <22Sep85> +@@ -576,7 +584,7 @@ MV_GetWPStatus: + MOVEQ #lenXDR,D0 ; Length of extent record + LEA DrXTExtRec(A5),A0 ; Point to only XT extent record + LEA FCBExtRec(A1,D1),A1 ; Point to extent record in FCB <01Oct85> +- _BlockMove ; Copy in the extent record ++ _BlockMoveData ; Copy in the extent record + + BSR FindFCB ; Try to find another FCB (set up D0/D1/A1) + BNE MtVolErr ; Punt on error +@@ -587,7 +595,7 @@ MV_GetWPStatus: + MOVEQ #lenXDR,D0 ; Length of extent record + LEA DrCTExtRec(A5),A0 ; Point to first catalog extent record + LEA FCBExtRec(A1,D1),A1 ; Point to extent record in FCB <01Oct85> +- _BlockMove ; Copy in the extent record ++ _BlockMoveData ; Copy in the extent record + + MOVE.L SysBMCPtr,VCBMAdr(A2) ; Set up the volume bitmap cache + MOVE.L SysCtlCPtr,VCBCtlBuf(A2) ; Set up the volume control cache +@@ -1101,24 +1109,25 @@ FindDrive: + RTS ; go there <19Feb87> + vFindDrive ; 'vectored' FindDrive routine <19Feb87> + MOVE.L A0,-(SP) ; preserve A0 +- MOVE.W D2,D0 ; search using this drive number as the key +- LEA DrvQHdr,A0 ; search the queue of drive numbers +- MOVEQ #DQDrive,D1 ; for drive number +- BSR QWordSearch +- BNE.S @2 ; exit if not found ++ MOVE.L DrvQHdr+QHead,A3 ; search the queue of drive numbers ++@loop MOVE.L A3,D0 ++ BEQ.S @2 ; exit if not found ++ CMP.W DQDrive(A3),D2 ++ BEQ.S @found ; exit if found ++ MOVE.L QLink(A3),A3 ++ BRA.S @loop + +- MOVEA.L A0,A3 ; Return pointer to DQE +- MOVE DQRefNum(A0),D1 ; return refnum +- MOVE.W DQFSID(A0),D0 ; is it for us? ++@found ++ MOVE DQRefNum(A3),D1 ; return refnum ++ MOVE.W DQFSID(A3),D0 ; is it for us? + BEQ.S @1 ; br if so + MOVEQ #ExtFSErr,D0 ; otherwise, report an error +- +-@1 MOVEA.L (SP)+,A0 ; restore A0 +- RTS +- +-@2 MOVEQ #NSDrvErr,D0 ; no such drive number + BRA.S @1 + ++@2 MOVEQ #NSDrvErr,D0 ; no such drive number ++@1 MOVEA.L (SP)+,A0 ; restore A0 ++ RTS ++ + ;_______________________________________________________________________ + ; + ; Routine: OffLine +@@ -2143,6 +2152,23 @@ retVRef TST.W D3 ; Was a volume name specified? + retAlBks BSR TFSVCBTst ; Are we dealing with a TFS volume? <13Oct85> + BNE.S @25 ; If not, don't fiddle with NmAlBlks<21Sep85> + ++; System 7.5/PM9500 "Ruby Slipper" rolled in here. ++; This fakes out GetVolInfo to make a >2GB volume make sense to a clueless app. ++ ++ MOVE.L ioVAlBlkSiz(A0),D1 ; If alloc block size is "positive" ++ CMP.L #$8000,D1 ; ++ BLO.S @noclip ; ... fall thru. ++ MOVE.L ioVAlBlkSiz(A0),D1 ; If volume size is < 2 GB ++ MOVE.L #$7FFFFFFF,D0 ; ++ DIVU.L D1,D0 ; ++ CMP.W ioVNmAlBlks(A0),D0 ; ++ BHI.S @noclip ; ... fall thru. ++ MOVE.W D0,ioVNmAlBlks(A0) ; Clip total blks to 2GB / blksize ++ CMP.W ioVFrBlk(A0),D0 ; If apparent free < total blocks ++ BHI.S @noclip ; ... fall thru ++ MOVE.W D0,ioVFrBlk(A0) ; Clip free blocks to total blocks ++@noclip ; ++ + ; Subtract the physical sizes of the extent B*-Tree and the catalog B*-Tree <21Sep85> + ; from the volume size, so that the difference between the volume size and <21Sep85> + ; the free space reflects only the user's allocations: <21Sep85> +@@ -2190,19 +2216,204 @@ retAlBks BSR TFSVCBTst ; Are we dealing with a TFS volume? <13Oct85> + LEA ioVFndrInfo(A0),A1 ; Destination finder info + LEA VCBFndrInfo(A2),A0 ; Volume's finder info + MOVEQ #32,D0 ; Length of finder info +- _BlockMove ; Copy finder info ++ _BlockMoveData ; Copy finder info + MOVE.L (SP)+,A0 ; Restore original A0 + + GVIDone MOVE.L A2,ReqstVol ; Make sure ReqstVol is set up + + BSR TFSVCBTst ; Are we dealing with a TFS volume? <01Oct85> + BNE.S TGVIOK ; No - dont' pass to unsuspecting ext. FS ++ ++ MOVE.W VCBFSID(A2),D0 ++ BNE.S @notZeroFS ++ BTST #HFSBit,ioTrap(A0) ++ BEQ.S @notZeroFS ++ MOVE.W ioVFrBlk(A0),D0 ++ CMP.W ioVNmAlBlks(A0),D0 ++ BLS.S @notZeroFS ++ MOVE.W D0,ioVNmAlBlks(A0) ++@notZeroFS ++ + BSR CkExtFS + BNE.S TGVIDone + + TGVIOK MOVEQ #0,D0 ; No errors + TGVIDone BRA CmdDone + ++;_______________________________________________________________________ ++; ++; Routine: XGetVolInfo ++; Arguments: A0.L (input) -- I/O volume parameter block: uses all volume ++; fields, plus extended ones. ++; D0.W (output) -- error code ++; Calls: FSQueue,CmdDone ++; ++; Function: Version of GetVolInfo that uses an extended parameter block ++; to give meaningful results for volumes over 2GB ++; (Rolled in Ruby Slipper code) ++;_______________________________________________________________________ ++ ++XGetVolInfo: ++ BSR FSQueue ; queue up the request ++ ++ MOVE.W IOVolIndex(A0),D2 ; if positive,z ++ BGT.S @3 ; go search by index ++ BEQ.S @1 ; if zero, go by drive number/default ++ ++ BSR DtrmV3 ; if negative, go by name ++ BRA.S @2 ++ ++@1 BSR DtrmV1 ; figure by drvnum, vrefnum, or default ++@2 BNE XGVIDone ++ BRA.S RetXVolInfo ++ ++@3 MOVEQ #0,D3 ; Never any name specified <25Sep85> ++ ; (ioFileName is output arg) <25Sep85> ++ CLR.W ioVRefNum(A0) ; make sure this gets filled in later <25Sep85> ++ MOVE.L VCBQHdr+QHead,D1 ; we want nth VCB in queue ++@4 BEQ NSVErrXit ; exit with err at end of queue ++ SUBQ.W #1,D2 ; the one we want? ++ MOVE.L D1,A2 ++ BEQ.S RetXVolInfo ; br if so ++ MOVE.L QLink(A2),D1 ; if not, keep traversing the queue ++ BRA.S @4 ++ ++; first copy the heart of the VCB into the parameter block ++ ++RetXVolInfo MOVEQ #IOVDirLen-2,D0 ; number of bytes to straight copy ++@4 MOVE.W VCBCrDate(A2,D0.W),IOVCrDate(A0,D0.W) ++ SUBQ #2,D0 ++ BPL.S @4 ++ ++ BSET #6,ioVAtrb+1(A0) ; set if any files are opened <28Oct85> ++ BSR Gt1stFCB ; get (A1,D1) pointing to first FCB ++ ++@0 CMP.L FCBVPtr(A1,D1),A2 ; file open on this volume? ++ BNE.S @1 ; br if so ++ BSR TFSVCBTst ; Are we looking at a TFS VCB? <27Oct85> ++ BNE.S @2 ; Nope - all files are fair game <27Oct85> ++ MOVE.L FCBFlNm(A1,D1),D0 ; Check the file number <27Oct85> ++ CMP.L #FSUsrCNID,D0 ; Is it a system control file? <27Oct85> ++ BHS.S @2 ; Accept only the highest quality... <27Oct85> ++ ++@1 BSR GtNxtFCB ; get next one until we run out ++ BCS.S @0 ++ BCLR #6,ioVAtrb+1(A0) ; 0 if no open files match <28Oct85> ++ ++@2 BCLR #5,ioVAtrb+1(A0) ; Assume this volume is not the default.<27Oct85> ++ CMPA.L DefVCBPtr,A2 ; Check the default volume pointer <27Oct85> ++ BNE.S @3 ; If this isn't it . . . <27Oct85> ++ BSET #5,ioVAtrb+1(A0) ; If this is default, drop a hint. <27Oct85> ++ ++@3 SUBA.L A3,A3 ; Clear WDCB pointer <14Oct85> ++ ++ TST.W ioVolIndex(A0) ; Check volIndex: <21Sep85> ++ BGT.S @retVRef ; If vol was indexed, leave things be <21Sep85> ++ TST.W D3 ; Was a volume name specified? <21Sep85> ++ BNE.S @retVRef ; If so, always return real file count <21Sep85> ++ MOVE.W ioVRefNum(A0),D1 ; Check VRefNum supplied: <21Sep85> ++ BGT.S @retVRef ; If driveNum, ignore it <21Sep85> ++ BLT.S @5 ; If negative, might be a WDRefNum <21Sep85> ++ MOVEQ #2,D1 ; If 0, look at default WDCB <21Sep85> ++ BRA.S @7 ; <21Sep85> ++ ++@5 CMP.W #WDRfnMax,D1 ; Otherwise, compare to max WDRefNum <21Sep85> ++ BGT.S @retVRef ; If it's a real VRefNum, we're OK <21Sep85> ++ ++; a WDRefNum was supplied as VRefNum: change the number of files to be the <21Sep85> ++; valence of the directory in question: <21Sep85> ++ ++ SUB.W #WDRfnMin,D1 ; Change WDRefNum to index <21Sep85> ++@7 MOVE.L WDCBsPtr,A3 ; Point to WDCB array <12Oct85> ++ ADD.W D1,A3 ; Point A3 to WDCB for ext. FS <13Oct85> ++ BSR ExtOffLinCk ; Is this an external file system vol? <13Oct85> ++ BNE.S @retVRef ; Yes - don't try to read the catalog <13Oct85> ++ ++ MOVEM.L A0-A1,-(A6) ; Use A0,A1 as scratch registers <21Sep85> ++ MOVEA.L WDCBsPtr,A1 ; Point to WDCB array <21Sep85> ++ MOVE.L WDDirID(A1,D1),D0 ; Pick up the DirID in question <21Sep85> ++ CMP.L #FSRtDirID,D0 ; Is it the root directory anyway? <21Sep85> ++ BEQ.S @8 ; If so, don't make special efforts <21Sep85> ++ ++ MOVE.L WDCatHint(A1,D1),D2 ; Pick up directory hint <21Sep85> ++ SUBA.L A0,A0 ; CName = Nil <21Sep85> ++ JSR CMGetCN ; Look up the directory <21Sep85> ++ BNE.S @8 ; If can't find it, forget it. <21Sep85> ++ ++ MOVE.W dirVal(A1),D0 ; Store directory valence <21Sep85> ++ MOVEM.L (A6)+,A0-A1 ; Restore scratch regs <21Sep85> ++ MOVE.W D0,ioVNmFls(A0) ; Replace file count w. dir. valence <21Sep85> ++ BRA.S @retVRef ; And continue <21Sep85> ++ ++@8 MOVEM.L (A6)+,A0-A1 ; Continue without changing file count <24Sep85> ++ ++; Do some hairy checking: if a working directory was specified, it shouldn't ++; be overwritten by the volRefNum. However, if a volume NAME was used, the ++; volRefNum field is ignored, and SHOULD be filled in with the volume's VRefNum. ++ ++@retVRef TST.W D3 ; Was a volume name specified? ++ BNE.S @10 ; If so, always return volRefNum ++ TST.W IOVRefNum(A0) ; VRefNum or WDRefNum supplied? ++ BLT.S @20 ; If so, leave it alone ++@10 MOVE.W VCBVRefNum(A2),IOVRefNum(A0) ; return volume refnum ++@20 BSR XferVName ; copy volume name ++ ++@retAlBks BSR TFSVCBTst ; Are we dealing with a TFS volume? <13Oct85> ++ BNE.S @25 ; If not, don't fiddle with NmAlBlks<21Sep85> ++ ++; Subtract the physical sizes of the extent B*-Tree and the catalog B*-Tree <21Sep85> ++; from the volume size, so that the difference between the volume size and <21Sep85> ++; the free space reflects only the user's allocations: <21Sep85> ++ ++ MOVE.W VCBXTAlBks(A2),D0 ; Pick up extent B*-Tree size <21Sep85> ++ SUB.W D0,ioVNmAlBlks(A0) ; Take out XT allocation <21Sep85> ++ MOVE.W VCBCTAlBks(A2),D0 ; Pick up catalog B*-Tree size <21Sep85> ++ SUB.W D0,ioVNmAlBlks(A0) ; Take out CT allocation <21Sep85> ++ ++; Ruby Slipper code: calculate the extended fields: ++; unsigned 64-bit integers describing total and free bytes ++ ++@25 MOVE.L ioVAlBlkSiz(A0),D1 ; Multiply! ++ MOVEQ #0,D0 ; ++ MOVE.W ioVNmAlBlks(A0),D0 ; ++ MULU.L D0,D0:D1 ; ++ MOVE.L D1,XVolumeParam.ioVTotalBytes+4(A0) ; ++ MOVE.L D0,XVolumeParam.ioVTotalBytes(A0) ; ++ ++ MOVE.L ioVAlBlkSiz(A0),D1 ; Multiply! ++ MOVEQ #0,D0 ; ++ MOVE.W ioVFrBlk(A0),D0 ; ++ MULU.L D0,D0:D1 ; ++ MOVE.L D1,XVolumeParam.ioVFreeBytes+4(A0) ; ++ MOVE.L D0,XVolumeParam.ioVFreeBytes(A0) ; ++ ++; Return some additional information for TGetVolInfo requests: ++ ++@40 MOVE.W VCBVRefNum(A2),ioVRefNum(A0) ; ALWAYS return VRefNum <25Sep85> ++ MOVE.W VCBSigWord(A2),ioVSigWord(A0) ; Volume signature ++ MOVE.W VCBDrvNum(A2),ioVDrvInfo(A0) ; Driver number ++ MOVE.W VCBDRefNum(A2),ioVDRefNum(A0) ; Driver RefNum ++ MOVE.W VCBFSID(A2),ioVFSID(A0) ; File System ID ++ ++ CMP.W #SigWord,VCBSigWord(A2) ; Are we dealing with a TFS volume? ++ BEQ.S XGVIOK ; No - the information below doesn't exist ++ ++ MOVE.L VCBVolBkup(A2),ioVBkup(A0) ; Last backup date ++ MOVE.W VCBVSeqNum(A2),ioVSeqNum(A0) ; Volume sequence number ++ MOVE.L VCBWrCnt(A2),ioVWrCnt(A0) ; Volume write count ++ MOVE.L VCBFilCnt(A2),ioVFilCnt(A0) ; Files count for volume ++ MOVE.L VCBDirCnt(A2),ioVDirCnt(A0) ; Directory count for volume ++ ++ MOVE.L A0,-(SP) ; Free up A0 as a scratch register ++ LEA ioVFndrInfo(A0),A1 ; Destination finder info ++ LEA VCBFndrInfo(A2),A0 ; Volume's finder info ++ MOVEQ #32,D0 ; Length of finder info ++ _BlockMoveData ; Copy finder info ++ MOVE.L (SP)+,A0 ; Restore original A0 ++ ++XGVIOK MOVEQ #0,D0 ; No errors ++XGVIDone BRA CmdDone ++ + ;_______________________________________________________________________ + ; + ; Routine: SetVolInfo +@@ -2220,11 +2431,39 @@ TGVIDone BRA CmdDone + SetVolInfo: + BSR FSQueue ; Wait our turn + BSR DtrmV1 ; Determine volume by drvnum/refnum +- BNE.S SVIDone ; Punt on errors ++ BNE SVIDone ; Punt on errors + BSR CVFlgs ; Check if volume can be modified +- BNE.S SVIDone ; Give up easily ++ BNE SVIDone ; Give up easily + BSR ExtOffLinCk ; Check if volume is on-line, non ext. FS +- BNE.S SVIDone ; Be a wimp - give up now. ++ BNE SVIDone ; Be a wimp - give up now. ++ ++; Validate the new volume name if ioVNPtr is set: ++; (Similar to old SetVolName below) ++ ++ MOVE.L ioVNPtr(A0),D2 ++ BEQ.S @goodName ; No string, no worries ++ MOVE.L D2,A1 ; A1 = pstring base ++ MOVEQ #0,D2 ; D2 = loop counter (kept around as an "actual" length) ++ MOVE.B (A1),D3 ; D3 = string length ++ BEQ.S @goodName ; Empty string, no worries ++ ++@nextVNChar ADD.B #1,D2 ++ CMP.B #':',(A1,D2.W) ; Hit a colon? ++ BEQ.S @colonChar ; Yes - punt. ++ CMP.B #vcbMaxNam,D2 ; Exceeded the max. length? ++ BGT.S @badName ; Yes - stop here. ++ CMP.B D3,D2 ; If this is the last character and ++ BEQ.S @goodName ; no problems have been found, great. ++ BRA.S @nextVNChar ; Next character. ++ ++@colonChar CMP.B D3,D2 ; A colon as the last character is okay, ++ BNE.S @badName ; just trim it off. ++ SUB.W #1,D2 ; But check that it's not the *only* ++ BNE.S @goodName ; character! ++ ++@badName MOVEQ #bdNamErr,D0 ; Invalid name passed. ++ BRA SVIDone ; Return to sender! ++@goodName + + ; Set user-modifiable fields in the VCB: + +@@ -2237,23 +2476,37 @@ SetVolInfo: + OR.W D0,D1 ; Combine attributes + MOVE.W D1,VCBAtrb(A2) ; Set new volume attributes + ++ MOVE.L ioVNPtr(A0),D1 ++ + BSR TFSVCBTst ; Is it a TFS volume? <01Oct85> + BNE.S @3 ; br if not - MFS VCBs don't have <01Oct85> + ; this info + MOVE.L IOVClpSiz(A0),VCBClpSiz(A2) ; Volume clump size + MOVE.L IOVBkup(A0),VCBVolBkup(A2) ; Last backup date + MOVE.W IOVSeqNum(A0),VCBVSeqNum(A2); Volume sequence number +- MOVE.L A0,-(SP) ; Save IOPB pointer + LEA IOVFndrInfo(A0),A0 ; Point to finder info source + LEA VCBFndrInfo(A2),A1 ; Finder info in VCB + MOVEQ #32,D0 ; Length of finder info +- _BlockMove ; Copy it in +- MOVEA.L (SP)+,A0 ; Restore IOPB pointer ++ _BlockMoveData ; Copy it in + +-@3 MOVE.L IOVNPtr(A0),D0 ; New name specified? ++@3 TST.B D2 ; New name specified? + BEQ.S @10 ; If not, forget it +- MOVEA.L D0,A1 ; Point to new name +- BSR.S SetVolName ; Update name in VCB ++ MOVE.L D2,D0 ++ MOVE.L D1,A0 ++ ADD.W #1,A0 ++ LEA VCBVN(A2),A1 ++ MOVE.B D0,(A1)+ ++ _BlockMoveData ++ ++ BSR TFSVCBTst ++ BNE.S @10 ++ ++ MOVEQ #0,D2 ++ MOVEQ #2,D0 ++ MOVE.L D2,A0 ++ LEA VCBVN(A2),A1 ++ BSR CMRenameCN ++ BNE.S SVIDone + @10 BSR MarkVCB + MOVEQ #0,D0 ; All went well... + +@@ -2919,3 +3172,23 @@ SetupDef: MOVEM.L D3-D7/A1-A6,-(SP) ; Save registers, same as SetUpWDCB <26S + BRA.S SetWDOK ; And call it a day <26Sep85> + ; [returns directly to trap dispatcher] <26Sep85> + ++;_______________________________________________________________________ ++; ++; Routine: CheckCtrl23 ++;_______________________________________________________________________ ++ ++CheckCtrl23 ++ LEA Params,A0 ; general purpose I/O param block ++ CLR.L ioCompletion(A0) ++ MOVE.W #23,csCode(A0) ; ?Sony DriveInfo code ++ CLR.L csParam(A0) ++ _Control ++ BNE.S @return ++ ++ MOVE.L csParam(A0),D0 ; reserved bits 7-4 == 0 && type bits 3-0 <= 1 ++ CMP.B #16,D0 ++ BEQ.S @return ++ CMP.B #17,D0 ++ ++@return RTS ++ +diff --git a/OS/HFS/VSM.a b/OS/HFS/VSM.a +--- a/OS/HFS/VSM.a ++++ b/OS/HFS/VSM.a +@@ -189,7 +189,7 @@ bkAlFree: + + MOVEM.L D0-D1,-(A6) ; Free up for use in division + MOVE.L D4,D0 ; Set up to divide +- MOVE.W vcbAlBlkSiz+2(A2),D1 ; by allocation block size ++ MOVE.L vcbAlBlkSiz(A2),D1 ; by allocation block size + JSR DivUp ; and round result up to next alloc. block + MOVE.L D0,D4 ; D4 is now min. number of alloc. blocks + MOVEM.L (A6)+,D0-D1 ; Restore original registers diff --git a/OS/HwPriv.a b/OS/HwPriv.a --- a/OS/HwPriv.a +++ b/OS/HwPriv.a