From 31149d7ecc766fab2b758b89edf22dfd1d5a0538 Mon Sep 17 00:00:00 2001 From: rlx <0x0073@0x2620.org> Date: Wed, 17 Aug 2011 11:39:33 +0000 Subject: [PATCH] add icon to application error dialog --- source/Ox.UI/css/Ox.UI.css | 4 +- source/Ox.UI/js/Core/Ox.Request.js | 20 +++++-- source/Ox.UI/js/List/Ox.List.js | 2 +- source/Ox.UI/js/Window/Ox.Dialog.js | 85 +++++++++++++++++++++------- source/Ox.UI/png/icon128.png | Bin 0 -> 9537 bytes 5 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 source/Ox.UI/png/icon128.png diff --git a/source/Ox.UI/css/Ox.UI.css b/source/Ox.UI/css/Ox.UI.css index dbafe550..245c21ba 100644 --- a/source/Ox.UI/css/Ox.UI.css +++ b/source/Ox.UI/css/Ox.UI.css @@ -240,8 +240,8 @@ Dialog } .OxDialog > .OxTitlebar > .OxTitle { - margin-top: 3px; - font-size: 13px; + margin-top: 4px; + font-size: 11px; font-weight: bold; text-overflow: ellipsis; overflow: hidden; diff --git a/source/Ox.UI/js/Core/Ox.Request.js b/source/Ox.UI/js/Core/Ox.Request.js index cff8bf60..76ccf9eb 100644 --- a/source/Ox.UI/js/Core/Ox.Request.js +++ b/source/Ox.UI/js/Core/Ox.Request.js @@ -152,8 +152,8 @@ Ox.Request = function(options) { }) ], content: $iframe, - width: 800, - height: 400 + width: 768, + height: 384 }) .open(), iframe = $iframe[0].contentDocument || $iframe[0].contentWindow.document; @@ -214,10 +214,20 @@ Ox.Request = function(options) { } }) ], - content: 'Sorry, we have encountered an application error while handling your request. To help us find out what went wrong, you may want to report this error to an administrator. Otherwise, please try again later.', + content: Ox.Element() + .append( + $('') + .attr({src: Ox.UI.PATH + 'png/icon128.png'}) + .css({position: 'absolute', left: '16px', top: '16px', width: '64px', height: '64px'}) + ) + .append( + Ox.Element() + .css({position: 'absolute', left: '96px', top: '16px', width: '256px'}) + .html('Sorry, we have encountered an application error while handling your request. To help us find out what went wrong, you may want to report this error to an administrator. Otherwise, please try again later.') + ), + height: 192, keys: {enter: 'close', escape: 'close'}, - width: 400, - height: 200 + width: 368 }) .open(); // fixme: change this to Send / Don't Send diff --git a/source/Ox.UI/js/List/Ox.List.js b/source/Ox.UI/js/List/Ox.List.js index f420c8e0..5c7eb90c 100644 --- a/source/Ox.UI/js/List/Ox.List.js +++ b/source/Ox.UI/js/List/Ox.List.js @@ -992,7 +992,7 @@ Ox.List = function(options, self) { if (self.options.centered) { that.animate({ scrollLeft: (self.listMargin / 2 + (pos + 0.5) * itemWidth - that.width() / 2) + 'px' - }, 0); + }, 250); } else { positions[0] = pos * itemWidth + self.listMargin / 2; positions[1] = positions[0] + itemWidth + self.itemMargin / 2; diff --git a/source/Ox.UI/js/Window/Ox.Dialog.js b/source/Ox.UI/js/Window/Ox.Dialog.js index be582a31..fcd09642 100644 --- a/source/Ox.UI/js/Window/Ox.Dialog.js +++ b/source/Ox.UI/js/Window/Ox.Dialog.js @@ -31,6 +31,7 @@ Ox.Dialog = function(options, self) { fixedRatio: false, focus: true, height: 200, + keys: {}, maxHeight: Infinity, maximizeButton: false, maxWidth: Infinity, @@ -41,6 +42,14 @@ Ox.Dialog = function(options, self) { }) .options(options || {}) .addClass('OxDialog') + .bindEvent({ + key_enter: function() { + keypress('enter'); + }, + key_escape: function() { + keypress('escape'); + } + }) .hide() .appendTo(Ox.UI.$body); @@ -128,24 +137,7 @@ Ox.Dialog = function(options, self) { self.$buttonsRight = $('
') .addClass('OxButtonsRight') .appendTo(self.$buttonsbar.$element); - var buttonsLeft, - buttonsRight, - index = Ox.map(self.options.buttons, function(v, i) { - return Ox.isEmpty(v) ? i : null; - })[0]; - if (index) { - buttonsLeft = Ox.sub(self.options.buttons, 0, index); - buttonsRight = Ox.sub(self.options.buttons, index + 1); - } else { - buttonsLeft = []; - buttonsRight = self.options.buttons; - } - buttonsLeft.forEach(function($button) { - $button.addClass('OxLeft').appendTo(self.$buttonsLeft); - }); - buttonsRight.forEach(function($button) { - $button.addClass('OxRight').appendTo(self.$buttonsRight); - }); + setButtons(); } if (!self.options.fixedCenter) { @@ -263,6 +255,22 @@ Ox.Dialog = function(options, self) { that.unwrap(); } + function getButtonById(id) { + var ret = null; + Ox.forEach(self.options.buttons, function(button) { + if (button.options && button.options('id') == id) { + ret = button; + return false; + } + }); + return ret; + } + + function keypress(key) { + var id = self.options.keys[key]; + id && getButtonById(id).$element.trigger('click'); + } + function maximize() { var offset = that.offset(); decenter(); @@ -501,13 +509,36 @@ Ox.Dialog = function(options, self) { that.unwrap(); } + function setButtons() { + var buttonsLeft, + buttonsRight, + index = Ox.map(self.options.buttons, function(v, i) { + return Ox.isEmpty(v) ? i : null; + })[0]; + if (index) { + buttonsLeft = Ox.sub(self.options.buttons, 0, index); + buttonsRight = Ox.sub(self.options.buttons, index + 1); + } else { + buttonsLeft = []; + buttonsRight = self.options.buttons; + } + self.$buttonsLeft.empty(); + buttonsLeft.forEach(function($button) { + $button.addClass('OxLeft').appendTo(self.$buttonsLeft); + }); + self.$buttonsRight.empty(); + buttonsRight.forEach(function($button) { + $button.addClass('OxRight').appendTo(self.$buttonsRight); + }); + } + function setContent() { var animate = !!self.$content isImage = !self.options.content.ox && self.options.content.is('img'); if (animate) { self.$content.animate({ opacity: 0 - }, 100, function() { + }, 250, function() { $(this).remove() // fixme: removeElement? }); self.options.content.css({ @@ -532,7 +563,7 @@ Ox.Dialog = function(options, self) { ); animate && self.options.content.animate({ opacity: 1 - }, 100); + }, 250); } function setCSS(css, animate) { @@ -591,7 +622,9 @@ Ox.Dialog = function(options, self) { } self.setOption = function(key, value) { - if (key == 'content') { + if (key == 'buttons') { + setButtons(); + } else if (key == 'content') { setContent(); } else if (key == 'height') { setMinAndMax(); @@ -631,6 +664,16 @@ Ox.Dialog = function(options, self) { return that; }; + that.disableButton = function(id) { + getButtonById(id).options({disabled: true}); + return that; + }; + + that.enableButton = function(id) { + getButtonById(id).options({disabled: false}); + return that; + }; + that.open = function() { self.initialHeight = self.options.height; self.initialWidth = self.options.width; diff --git a/source/Ox.UI/png/icon128.png b/source/Ox.UI/png/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f8c3072fa47235d800c34d0ebf9adbbb612b26 GIT binary patch literal 9537 zcmW+*2RIyE7oH_bbfT;hED|NF_s;4>Cwhxclqk_ziB3c(dWqhGSkZ~zJBi)}(Fsxi z`Tl*L*|~dXcjn%6&ikJCoQ>2_Q^3ce!T|sPUrA9`3p^wLJFqdq_bv&GA@KCrRnfp5 z0C1oDcR+yjOeg^0sN2iPXlU5Ec(}ORxwz6R$;i;Vy1Cfczp(}Y@A)ikTOI9Pa`DUM zbA(C+GD*cniwv7y3lWVZjepJtdrYJp0n7VErrAj>C-;cDKQ{tBHWnE}rU}Q3!ug4{ z3CoZDP!JI{c(dkL;5gfIxjk}UKPRzMah6p#hSh1BZK6|1N2X< zBV++PQJ`Y%Rg@f{&jpa$sB{YhKiL5;B|RHO;A;cWF-nA63t-~`T$&M~tiU5bz`UQ4 z(HjW)43Ns7>WQ7as3O{711dd8jvqds zDS3kV2v^UB0U$S?4BYM6o%bj~)##`|EQ-L4eXkw!f#LP*jr*;!a#tw;Sn~*+xQBDr zQ6WV!kxuvd&ki5ind0VpUPjy05=zwrxx4dvXRiO*MlLU|@z<}d&CQ?6-3TL#LA`)` z+aG2fdUtRB1&ZBXUaYpQGX?XQ1S>qcTKzG6{<4r}Ea7p;>&5L)3bzfo54TUJ7`l~S zH|n#IZfKIcjg?K0IpZm0h(si?_B@+>uv%Y%-=IsZ@B?2RBp`nA>?J0a=zmq1iS#`> z)-M6zwArO|ngtsjY4>4m%NI)inReb@jXn;XpbRhs&| z6AJIZr0K+1?8Ln_7YIQxb^kyRA#kjaG;Zds74H!&VIyCkvYB&EOFiZ5(6kFnbS2>U zq5GXc+?DX!0z12tr6u_BBk6wZCl;{z2*~Rwea2X9iqD}}uujECB+*Rt0}-T}3@Y*b ziriXJI`q1VPfx|&(1gQ{<(uL~`vIQ!w_z;`+)2T;n&Q)V^)ihmf>a^$`MBd&9^C1l z$a6Es-M&$Y#|Y%@jF;OH&VQ1S>Er774aMT^e#6Dl+l8nRfi`ueH@ zy*cv2a;(Pd5lOII$76vE!D;%)*{iDqA&YKhDY*8W}2d@%w?=Jm>YT(gw<}TR$-u zs!&d-01MmK6t)dLRb7XPt%(6m0Uz(gvGBux5tKhQd>ZKf&5cy#mB@1XXy&10K+k!~ zE~l;j7}3~I-VM}~A=YmDEbWXb1zQT+M)wbA5z&z2B{(vudzboKH1LL+G8a}7Oel){yLD3$!(M-lm7I+^8Hq4CCsk>Ph2JJ zawlyxe$<{IR3q^B>^PRiwncPTARcpQc&J{OWUOn1KGg(wD!~e-J zx4LjOyD~qUL>Y&J*t}p9Uz21nhmFDTjDD8B(i;^TVGgz`0p~YuE4K${;pH zX`KBgu0DCAKh8so$xAs%;36qfFC)~1l8&W`*hHAn0j~%;aiO%%%yQHFY#Y4Wr$>xr@y0j;t>~V<^GTmANLkf z22)K$+3wkH+q@g9unw)g?{SW9;G|8)8gQ(OtH3Z|$3Y>Ae(M;r%&}qB+FI+`w2wp% z3a6B3zZf|ft{Ys46U;oyc{m{XL9&*BDhyN6V}Gi@-CE%wTr2k0X8~t}4C6)EE6fV9 z?@=f=ry2F~1HII$z}Dx!s*b^?orCW?>miQ&xVku7p#l4ga|b5s`kV$U^%mD*S=16_ zkx^Bo3lynjK|fg*y|<{tT?X4fFD88}E$?o$8ncC2+?7HUABN z<<+-?i@$OUoT(!$3(X%;GK~f8V&7Y=iw8zWL?v~;=$z|Z>j)f9F4bGiT{%x2Qv0?1 z<@+3~Q-O_$HmPQNjFZPcVbEHN>=x9oeXus}zc$tPyuqkN__U_Zb6ek#%SbSx$- zIV&KL z2IJG`PeWn&Vf)!a62ijkl5Tgqx5YAJR%6ezDem*{hpH&ZIRmd|_UA??(kAj!Pg4`y zo%{>$_B!?{s~38I^wPEsc=K|bp1-;|==56jdU{l_La4s!PankcVE3=)LVLXUCXq5R z@!=7A+S#ooFZ%+hH|Z@EwNwGX_Zg@|KLEhL2k^WL0G?a`uxAbcB543X;gVq1BM$&n zZgfW}>XmMEehJJvKEJdXWiaDHb&av3pg#; z5KEyW*#HXw2Y6qN!Uo8Zq)1925g3I)|HeiGi+&IA?j3d0^Ro|aL1~IFj)ScLaljPq z7>-oU&PO*eHB7yI0};Yql>uBJztPPp&ceP#;Avp3Ubb2qPXYHMqRylrAW;^8 zI@*;xfCZU;Bw|R`h_Px5+$&+fb+5!jLav?w59m?>xrzMotUwU%>H}o8+#Xl}ZW)ob zXivpRPPvhExG=TqFbK_~<90|A#?f7T!Xsq+d01E`KJxlI1mjp6c#zb%XJoa`b`IQA zsBYvzVy>D&TF6^=`VfJSS8o8G9xh;{dG!eM=%OZ}LA*m^8au+;fbd2X{rCtl#b4gB zWDN&yX@Tr&!sB+dEy>x_vf?f*UZj0G;q?NYjrgDxt)DRVs@W~HLlAO~&hmJ9DHV|b zG(lnlI{}{0oLAT+$WOo@gM(tGkVR4QXrlFHV#Vc2+*L0?NF}*d=iaV9Nu4#6Nr^s0 z3VY2krDtmQ+l!DmF)SV6E2$i;tc<4@iXlbQ7rfsTEPa(Ip6&eb&plVAcq%%m3c~fC z?ByO2f_{hx8+Lem+v2m)i|_UN^^ZoMv*%eE8I}W9lUteP-!op316p|+5lP9(jrH~Q zc5mL0s*7JF8SCmkQ%Yc3K;e)22VDA%G?t~2g(T> z=B=xnO#D%PT-;$h2Lkd+#5c;uKk9=!c*>~RyhxPt=#?gOg zJ1PK6lvWD{BGX+zWoveJ_IZxqq3{c;kMhQI$!G%JCAVHc5Fx;ntlUZM5)QoKsQu7) zbA3&s5KE(p--TUT*7Q23|1FK{Xr&!r(^r=j32_>N@RUfmz~n7F{AA9cb0eU&y=MWT^(@X=)Q7y=(U@uE@5yVCpD*Ml8t%%Sm}9U z$I|V+dQ^%3{&=2DsXqKw(Y}b$fx3+WIU5_>y5v zG3ve}jhK@s` zI@OIu=T8)LbI`z;UQ|k&d^#Y6cGh3X}w6@wNfl~wIyIy_YV1W+2lLUf+LoTlr^ zde6VhWk1de7968}b>af*ovaFb^(l zwW(?-Ri3hay;hn8!ABl-Z^dIzEBY>myH_99Pl2G%_-)`H&TuqDa{U zadGk4?U9Vay}i9S_z<2KMFGjEu=?}FzsWE3$bJ3%mQGGiBH%;AoXJDAF}M^QEDbIz zqdGb|A@4P~fm~TOE6fgP*PlNX;@sSM$_YuSr-DxNd_k)nkjAE_CZ3G>3p7Cke3d*6 z#rYb`@HXqAlwk$B0KS`LzoXD+N|Sd`2<*{-l~%L&$-2L~y1F?)%fSSD#M%v1nYKD` z!r>vLas#b2kwj@lks}#`V?hr$D}>t0g>p)zHw47H9#lzM2R#&KNzatheJ+>0tPN5E z46=ycn>M}{o*y<#cUs@k%z+Gj`{ z_-dOIfNE-OT{@;-w~krs{YVYZQWNcb(@`*oXn8l<=y$fQy3W2kDE`QL!P(ZfSW{P5 zx7A8oxr!I#`g}^gZel`n%F~2j&ss~FTTrlXduQjMtc*=K0*`zZ-;eKbcw|IVQkxI< z2$2_8@3bJWggR(3w_6a{+uy&~-nQY@``a(!{yfnlQWmW|IqPwLd`r0DS8Nc1uGgl zrZ=BIk~7q5Xy!D&aCcvL$b1PVq)U-3yBMN_KERvdJmK0 ze^5vvX_&=#aK5`*dsx_unu^L>h=zkDpOOoSRn!$uD0<@EGOZpm&ZpXP`~%mWv-Mm{ z?s?*gIJG9J9F4G>)uCYfKh@Bje9BQ_wihob0?!NRSXo@fcl5F$LOT(%4A;x8eu*w^ z|BB+6SZ(D<5dGuhao3eD0Yf<9U1d3>b*ah?VPRo9s#6hkUG6k}OU+)@|NSc9TJ%vJ z(!Y1|@85T?bam@j^&(Hajp=A<1#Yj2YT=gN-ajMyHk#D83Q#D4DbVRjlY&j8#AZER zD(a3CcGD=h%Hk(hS`V(?-yIzQn5f=W?LeeNvQSuciXPo_In3U#exwWs?{A?kJL0s2Cw z2NBc(Tq;oQ{`q6I=KAxPw>8O{l97>duhOU?2FvFnhI_Hea|lXFsd<~bl5uI2m6c^! z6K#lwsqgj^^>KdQ&}o0RGK`L#K7>AAv7}fn%dNIPUWE{(z`bc!W^n44u1+IOk$sbs zlM^l(8JRNo1RYlgdbg(u%J0(IWX^Ml8FxI9S-n=4A>N=#EkP>^90>cIG9_AnzV;?h zN=YdKi7DxI>>UJMZ1XD|7at!#kKG7mb^8@4B%PX?y8ivUq&^7)v<^7n7ZNd%w&!(j5>L+Wu|M`!b?cM3tP!W^T<#^EULKaux)3lkFI-T#EGqA+GD_mOgwNSk12Mv#d!Q64txTm82mkZf3P@_5Gekis%jcWLikl)`50e*gK0Re%qDwF0E39rMBdudXi5L!+TaEIQwvFG*Vh3A5_f}VP3(Lx&G&JAvyZReL zRIwo@bG*%7N3*xHCSW{mp23HHTwm;~7#bN(?TqE527CpC1FpZ-2HgA=1)XkTkfKyI zW}p7NskwOsL|iT63^Y4wFb34JqP%>lduge~JqzF5!a`co<2R9+zW%s-WzPAy%YUm_ z%dGw$h=$ou9G@ZJ#OCPitoHHKr<=zc38kf_%&mu|!Yk$AEgbCZu&en%pB!88)xwAT z{{D#%A!;*>zA`x2SnB)z=Z}ZbPPx_zDVJ32dVQTH6%`eUwzf9eKaMR^g1du*19|XM zkAo) zWvtw8Bi!B3%DlMoq4b30EbQzvUI+7XZx%R|Jy{E<7waA8(mlAqYwF$3D{Us?zUOvs zfq`w`h{(ZEr51F48L&aU!qNbDoOzLgj@d6Gw8Qe^g?9c#i2)0)hVp^9-(STLB7641 z8So-q;};Oc{_EY5FL^#spY7Tl=B*gE2L^bvkJE8U1;aHA3`#jUn9p8>5cypmF6EC4 z+<>I68BR1*J3cWXeSLGIz3b7`O^6EuGbJUZ5tNs;f1(QNqH3)MtF!G9R8DN+ z@|*Wwo}L3y`6Z6O%AT7ef6xfQ;c$JuYSU+dJb~F?!C)^eD6mu&O~t~~K(a)=kB=wz zb90;Yl2S~u_P^dOp4{BD@@2m?z=7rh=hR^qpqX)$SqF9u!z@@p`|Zw|1udBz5V>{$ za#9b+$FA#O$oaM@!H%c~FZSo=-gr$RA*UH_oqVdxD=XDxR2|%SGDimot!LN!)!}pR zF~BH#(g-4}x4T=mL}Swzo@>_p&MEL2`R7Mq4ByxewZzhj?*S~z0CTc(D7f!RJyRdK z3R#F9_(b`K&%CxIpr~7W{c#~GKW=Sp?fCrsTm3wohzqHH?mp@h6x9AaL?eo<)Irc2FeNK%ooqA7c@zzyI*x|+<9 zBJ2Xk_K%KIY5Fwpa#uW;GQA`&_35YQ=DhsC=UFVEb{U6&UpCk=+*7t#_=}D1;q#~i z@`%9yIQyN+9H%ahoF=^eHyt&#N^ETGVBk1s2(rljvE-40CaDM?pAOZhzRH=O3tUG8 zFmNp?)_MCPx91h0qyi=8CYa22-(a$jWd|Pq{0W7H5ScyYX4xt%EUevc3cLnH6h6_8 z=%*AekA3nUztPm4nQw40Q`RKqoxAaA&IkiZHb|qPMj>A&qTwz>$JF%DQD|&-l#r0H z*xF#!5iib~62$UuO%1nMbBf>Cu!@R`Tvd;FEqr6X-Vt=+XwsE5sO0UOoK(HMy!1el zEOIkB%yMFNU+;bluABG82pYx(c7D<%n1rsR69qlS@9zWe{vIsYONzVK>L{~%N?!kF zWKJB|jOl;FJYHMNWBTgV^PNG%B(2Mlth|oTM{74^iRhC?k^cqC==J8q=YQIUXikM%Sl}~kpF7RsY04yn2 zmW6g`JUu;)r@m!oni1ZWuB}-Na9$f38fvk#vzJ*w?VO!ofuHas;khh0kv*@q#ApRy zC18{YGLJQv+gMr_kP?Kmx5L2#c{Ed4`~EEFK}=XwG-HzQz?AhOfQV367Z%bFiYcc1 zQPHC$p58BF*}t6Z?bjNw@xcxKtg)o*;^LG1O@TNb9aS5ICJODC$0&i>S_iu`pjPU8 zd%Gm7Qi47VlZXTmHQQgyEXdDCI6F8fgK@DJNW5!3!vMNtAUiwz7nu3Wz)TI&GYL%A z`_eUW;EU(hVDd{BmugV~fmfi+Icq*C*>7TDW#u+9GMX`-JyJ>t+1<6@uN#wik!UTv zlOY`Y0nFOdMXDL!{sg>P=miJU|4o2UGT;b|?nC1vk1jPaF)2*|Ut}!GsAn+Q+Kyf5 z0?LV6;^t3X%d2{jcVrnfPr=Q8rwh8R(bd+r1T~&P0@JUm{o2Mx;lQ2Ir^2+KQi&0V znl&rX_j*CLpvvFU2^fMt0YPoU5YIBj$6kCxj4)q7Elf?Urg6$ACozxm<<9h_V(M5odqMp<%--Bco>5o4*IA{tWst++4jS z_UZFiS3*_Bji-&NgHV~g3Blg9R`(sX1eHG@xWjgLcc%vunLp>VbTczjf!WH;oYKXN z;Q%Z?m5Q}WT{$}QSXu>Jn*b&%F zO7HVoE(yREL~+C62NCBgvv!GJ^YgydXtu%+U)tMOUNVtb`56tCq!Zo{r3BeebdqWm-ZY4BU8(zCQs|e^V^H}T)p7k*Xzm! z1)LY{re|h$3HSCL!BT2(@BAaRVA0(<-CuorJ|UqrHXd9&ZJ-$E^JDnC+SzI|v-=;o zoX`~O69vc}?ZueH!|j>HP^}x)jjfGMLXG}QEz-~{+0vPrnP;3k*tjq|J-t*Wr3B8h zB&J9oxH)Mg#v7oxglN5%Xx%t|Tt3@p`}1j4Rh4iT*J3>);MG5Mv6Jpw$LiK1rGzir zKa@e*0jd7)@bJr@gxBmtKbk!Ec|hFeZTaJIDv~;YYG!-=6Wk(rQeE#;MM73m=|GM9hIo;Z*T_Jr1%rftj8zzhtd&NMuH%H8_~Y#^?J2Sy!!p0PxNz|E69vheo6^$0i|e}u zv|F3XC(Ue4h=8UKvXkkUo?;J1oW$8M@8=``9nsSicB4V4rLsi8J00Dg$S2I(pi7l& zxvz}_o|?>!+}&LAs!pBaPb4TZF{ovUY#F9J+e&}S6k={;BVSfgk?H8*fOBIN90VNi z`^9br+ygZv#o4}5`~m_AAc#o}z*+|t?_%VMz@FUw#xEu|JUBR*mLnDh zrfx^aq3PM#lr8GJbCDP@kvrjbb#Ayz&Gal;m+r>B*1tbJb7e9&606}=UbW#Hj%+9ljSLS(g61+vpEpn4nyA+wB zSfB4%kaUc3oYA*G!HI%sLg}S;;3v*1=ljb`{UJ&3rk01}hT(xA{8f!(0y-n%&E4bR z+QpV|^ec2&2lE)rb=2$}E9Wt05jzAz~%T%8{*yQJj$=dv4$fDs) zgB<%IB1$`$z0dpn5&dRs&Vjc7Sik15G9z<`BX|0z%?>2-xMfZ)e`lNEOFl^#LT&xX4-__!C*xvBq`^Zv83EPw>_rfGa{+ zcaCLff@1KZo-^c%61JHGEW$StUm6+&cY;i5_?pHpJ%PX#Q51%VA+a$2>PpK-?|RF? zhc+`+^!_M#$ZyCo3DOqw1}*nd(~t@ru!ZB!mFIKv