From 5aa18c624f9be583b18bb6216ba5c8745e77b4d3 Mon Sep 17 00:00:00 2001 From: Valeriy Date: Wed, 4 Dec 2013 20:16:19 +0600 Subject: [PATCH] new major version 2.0.0 Added fast month and year select Added touch handler for scroller element Update screens Creation of a custom scrollbars allocated into a plugin xdsoftScroller --- datetimepicker.jquery.json | 5 +- index.html | 1 + jquery.datetimepicker.css | 46 +++++++-- jquery.datetimepicker.js | 204 ++++++++++++++++++++++++++++++++----- screen/1.png | Bin 6610 -> 9705 bytes screen/3.png | Bin 1391 -> 2495 bytes 6 files changed, 223 insertions(+), 33 deletions(-) diff --git a/datetimepicker.jquery.json b/datetimepicker.jquery.json index 88f30de..2b1508b 100644 --- a/datetimepicker.jquery.json +++ b/datetimepicker.jquery.json @@ -16,9 +16,10 @@ "scroller", "picker", "i18n", - "input" + "input", + "touch" ], - "version": "1.1.1", + "version": "2.0.0", "author": { "name": "Chupurnov Valeriy", "url": "http://xdsoft.net/contacts.html" diff --git a/index.html b/index.html index f3930eb..2a33f42 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,7 @@ + diff --git a/jquery.datetimepicker.css b/jquery.datetimepicker.css index 7d3ae3a..8454d24 100644 --- a/jquery.datetimepicker.css +++ b/jquery.datetimepicker.css @@ -12,7 +12,7 @@ padding-left: 0px; padding-top: 2px; position: absolute; - z-index: 9999; + z-index: 99; box-sizing: border-box; display:none; -webkit-touch-callout: none; @@ -22,6 +22,7 @@ -ms-user-select: none; user-select: none; } + .xdsoft_noselect{ -webkit-touch-callout: none; -webkit-user-select: none; @@ -143,8 +144,7 @@ .xdsoft_datetimepicker .xdsoft_label{ display: inline; position: relative; - z-index: 9999; - overflow: hidden; + z-index: 99; margin: 0; padding: 5px 3px; font-size: 14px; @@ -154,6 +154,37 @@ float:left; width:182px; text-align:center; + cursor:pointer; +} +.xdsoft_datetimepicker .xdsoft_label:hover{ + text-decoration:underline; +} +.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select{ + border:1px solid #ccc; + position:absolute; + display:block; + right:0px; + top:30px; + z-index:101; + display:none; + background:#fff; + max-height:160px; + overflow-y:hidden; +} +.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_monthselect{right:-7px;} +.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_yearselect{right:2px;} +.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover{ + color: #fff; + background: #ff8000; +} +.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option{ + padding:2px 10px 2px 5px; +} +.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current{ + background: #33AAFF; + box-shadow: #178FE5 0px 1px 3px 0px inset; + color:#fff; + font-weight: 700; } .xdsoft_datetimepicker .xdsoft_month{ width:114px; @@ -219,7 +250,7 @@ .xdsoft_datetimepicker .xdsoft_calendar th{ font-weight: 700; text-align: center; - color: #999999; + color: #9999; cursor:default; } .xdsoft_datetimepicker .xdsoft_copyright{ color:#ccc !important; font-size:10px;clear:both;float:none;margin-left:8px;} @@ -231,12 +262,12 @@ position:relative; border:1px solid #ccc; } -.xdsoft_time_box > .xdsoft_scrollbar >.xdsoft_scroller{ +.xdsoft_scrollbar >.xdsoft_scroller{ background:#ccc !important; height:20px; border-radius:3px; } -.xdsoft_time_box > .xdsoft_scrollbar{ +.xdsoft_scrollbar{ position:absolute; width:7px; width:7px; @@ -244,4 +275,7 @@ top:0px; bottom:0px; cursor:pointer; +} +.xdsoft_scroller_box{ +position:relative; } \ No newline at end of file diff --git a/jquery.datetimepicker.js b/jquery.datetimepicker.js index 84adb3a..98cc7ae 100644 --- a/jquery.datetimepicker.js +++ b/jquery.datetimepicker.js @@ -1,9 +1,98 @@ /** - * @preserve jQuery DateTimePicker plugin v1.1.1 + * @preserve jQuery DateTimePicker plugin v2.0.0 * @homepage http://xdsoft.net/jqplugins/datetimepicker/ * (c) 2013, Chupurnov Valeriy. */ (function( $ ){ + $.fn.xdsoftScroller = function( _percent ){ + return this.each(function(){ + var timeboxparent = $(this); + if( !$(this).hasClass('xdsoft_scroller_box') ){ + var pointerEventToXY = function( e ){ + var out = {x:0, y:0}; + if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){ + var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; + out.x = touch.pageX; + out.y = touch.pageY; + }else if (e.type == 'mousedown' || e.type == 'mouseup' || e.type == 'mousemove' || e.type == 'mouseover'|| e.type=='mouseout' || e.type=='mouseenter' || e.type=='mouseleave') { + out.x = e.pageX; + out.y = e.pageY; + } + return out; + }; + var move = 0, + timebox = timeboxparent.children().eq(0), + parentHeight = timeboxparent[0].offsetHeight-2, + height = timebox[0].offsetHeight, + scrollbar = $('
'), + scroller = $('
'), + maximumOffset = 100, + start = false; + scrollbar.append(scroller); + timeboxparent.addClass('xdsoft_scroller_box').append(scrollbar); + scroller.on('mousedown.xdsoft_scroller',function( event ){ + var pageY = event.pageY, + top = parseInt(scroller.css('margin-top')), + h1 = scrollbar[0].offsetHeight; + $(document.body).addClass('xdsoft_noselect'); + $([document.body,window]).on('mouseup.xdsoft_scroller',function(){ + $([document.body,window]).off('mouseup.xdsoft_scroller',arguments.callee) + .off('mousemove.xdsoft_scroller',move) + .removeClass('xdsoft_noselect'); + }); + $(document.body).on('mousemove.xdsoft_scroller',move = function(event){ + var offset = event.pageY-pageY+top; + if( offset<0 ) + offset = 0; + if( offset+scroller[0].offsetHeight>h1 ) + offset = h1-scroller[0].offsetHeight; + timeboxparent.trigger('scroll_element.xdsoft_scroller',[maximumOffset?offset/maximumOffset:0]); + }); + }); + timeboxparent + .on('scroll_element.xdsoft_scroller',function( event,percent ){ + percent = percent>1?1:(percent<0||isNaN(percent))?0:percent; + scroller.css('margin-top',maximumOffset*percent); + timebox.css('marginTop',-parseInt((height-parentHeight)*percent)) + }) + .on('resize_scroll.xdsoft_scroller',function( event,_percent ){ + parentHeight = timeboxparent[0].offsetHeight-2; + height = timebox[0].offsetHeight; + var percent = parentHeight/height, + sh = percent*scrollbar[0].offsetHeight; + if( percent>1 ) + scroller.hide(); + else{ + scroller.show(); + scroller.css('height',parseInt(sh>10?sh:10)); + maximumOffset = scrollbar[0].offsetHeight-scroller[0].offsetHeight; + timeboxparent.trigger('scroll_element.xdsoft_scroller',[_percent?_percent:Math.abs(parseInt(timebox.css('marginTop')))/(height-parentHeight)]); + } + }) + timeboxparent.mousewheel&&timeboxparent.mousewheel(function(event, delta, deltaX, deltaY) { + var top = Math.abs(parseInt(timebox.css('marginTop'))); + timeboxparent.trigger('scroll_element.xdsoft_scroller',[(top-delta*20)/(height-parentHeight)]); + event.stopPropagation(); + return false; + }); + timeboxparent.on('touchstart',function( event ){ + start = pointerEventToXY(event); + }); + timeboxparent.on('touchmove',function( event ){ + if( start ){ + var coord = pointerEventToXY(event), top = Math.abs(parseInt(timebox.css('marginTop'))); + timeboxparent.trigger('scroll_element.xdsoft_scroller',[(top+(coord.y-start.y)/10)/(height-parentHeight)]); + event.stopPropagation(); + event.preventDefault(); + }; + }); + timeboxparent.on('touchend touchcancel',function( event ){ + start = false; + }); + } + timeboxparent.trigger('resize_scroll.xdsoft_scroller',[_percent]); + }); + }; $.fn.datetimepicker = function( opt ){ var CTRLKEY = 17, @@ -92,29 +181,73 @@ scrollTime:true, scrollInput:true, mask:false, - validateOnBlur:true + validateOnBlur:true, + yearStart:1950, + yearEnd:2050 }; var options = ($.isPlainObject(opt)||!opt)?$.extend({},default_options,opt):$.extend({},default_options); var createDateTimePicker = function( input ){ var datetimepicker = $('
'), xdsoft_copyright = $(''), datepicker = $('
'), - mounth_picker = $('
'), + mounth_picker = $('
'), calendar = $('
'), timepicker = $('
'), timeboxparent = timepicker.find('.xdsoft_time_box').eq(0), timebox = $('
'), scrollbar = $('
'), - scroller = $('
'); + scroller = $('
'), + monthselect =$('
'), + yearselect =$('
'); + + mounth_picker.find('.xdsoft_month span').after(monthselect); + mounth_picker.find('.xdsoft_year span').after(yearselect); + + mounth_picker.find('.xdsoft_month,.xdsoft_year').on('mousedown.xdsoft',function(){ + mounth_picker.find('.xdsoft_select').hide(); + var select = $(this).find('.xdsoft_select').eq(0),xd = datetimepicker.data('xdsoft_datetime'),val = 0,top = 0; + + if( xd&&xd.currentTime ) + val = xd.currentTime[$(this).hasClass('xdsoft_month')?'getMonth':'getFullYear'](); + + select.show(); + for(var items = select.find('div.xdsoft_option'),i = 0;i=0 ){ timebox.css('marginTop','-'+(top-options.timeHeightInTimePicker)+'px') } - datetimepicker.trigger('scroll.timebox',[Math.abs(parseInt(timebox.css('marginTop')))]); + timeboxparent.trigger('scroll_element.xdsoft_scroller',[Math.abs(parseInt(timebox.css('marginTop'))/(height-pheight))]); period= ( period>10 )?10:period-10; !stop&&(timer = setTimeout(arguments.callee,v?v:period)); })(500); @@ -420,10 +562,9 @@ stop = true; $([document.body,window]).off('mouseup.xdsoft',arguments.callee); }); - }); - - // generating a calendar and timepicker - datetimepicker.on('change.xdsoft',function(){ + }); + // base handler - generating a calendar and timepicker + datetimepicker.on('xchange.xdsoft',function(event){ var xd = $(this).data('xdsoft_datetime'), table = ''; var start = new Date(xd.currentTime.getFullYear(),xd.currentTime.getMonth(),1); @@ -453,8 +594,8 @@ } table+=''; calendar.html(table); - mounth_picker.find('.xdsoft_label').eq(0).text(options.i18n[options.lang].months[xd.currentTime.getMonth()]); - mounth_picker.find('.xdsoft_label').eq(1).text(xd.currentTime.getFullYear()); + mounth_picker.find('.xdsoft_label span').eq(0).text(options.i18n[options.lang].months[xd.currentTime.getMonth()]); + mounth_picker.find('.xdsoft_label span').eq(1).text(xd.currentTime.getFullYear()); var time = '',h = '',m =''; var line_time = function (h,m){ var now = new Date(); @@ -491,6 +632,16 @@ } } timebox.html(time); + var opt = '',i = 0; + for( i = parseInt(options.yearStart);i<= parseInt(options.yearEnd);i++ ){ + opt+='
'+i+'
'; + } + yearselect.children().eq(0).html(opt); + for( i = 0,opt = '';i<= 11;i++ ){ + opt+='
'+options.i18n[options.lang].months[i]+'
'; + } + monthselect.children().eq(0).html(opt); + event.stopPropagation(); //timebox.find('.xdsoft_current').length&&timebox.css('marginTop','-'+parseInt(timebox.find('.xdsoft_current').index()*options.timeHeightInTimePicker)+'px'); }); datetimepicker.on('afterOpen.xdsoft',function(){ @@ -501,7 +652,7 @@ if( (height-pheight)23(bKmVjQv+B zQ9#AW$NjetcvBI15dfe%3iZhV0RZ?MD=jXf>Y{g?E(-?Ey7mgmB-9}h^;*j-%ZY|5 zp!G=7`erGKA^lY?5oRIBFZZE9MIrkuQTG*qJmyC~NzViyEZp=PAD)SfF%X`{=93uI*@> zk-jhhphS^ZRbEkXAPoSRS-nFkUqPz=d1{FQCY0@<|kW1nuLt%4E;y4e*ej*73v|*05RWYnKX--uz>>>BV>Q;AInLG##TkRqL zSeJ?5kv0$zlDe@#!Rw|sjKULK#779$;rm1Z-o~wGg}$7TgE%^`S$Um}tXFUi!0J7v z#uiNz%>-A6#mTo>LvpQC(T}Iomw2I&`JiIG6&rXK|sR*vF9Tm3@@AT&@ zrPF4+ch@BN-Web@<+(X6qK&qV)!K^`q3psD16t)4M`i210#iTh>a67yOn1D!=WFy# z$S$DB|dm5v$poC4kzO9^BuD9gC-M^*R@aYrh@svMz29?AJ%{wu#i zL|sN4_4K7UD-!j`o%bOtg?gq&$tUN0)f2ekx*CTB?PfTYXTiZ=Eh?p09`gp~!DExA zPYu7Qte0~_kPyjhOAU8D(5)rr$xO9Hmcok&L+PyLkr#d8LU70Hsi>f9U;6q-lK14o z!b1p{`!)afX2!cN_vqg(^Ly&x4m zb;i0x*cc1w`q_PH4QNE$eWIjEZ>MoJe}$$Or_oc~U?@Z#k5eqBi!r9f*tJ_8cdQhg zLJ(J?RvQn(c8IBUt~g2~kt6pUB_vX}NvUPN{5l9WjPvAZ@A+uj>EaDV4xk;B;a&c& zZl<^GjBs*D@6TZWZG_EpNx?)E=m)WZOi)S;kXZ!f1nU?E8XtdXvNdSc#T?$|f#QC_ zjr2;NPIgvU@3;#K67|@v$~T`BCMv1* zBd&GiPSTWLXI3SaMu_f{-A-F?uT%t3C_3rIQHiURP*MX z9RA93y-#+BYWP0JzE$Hb;lv~D!>zb zN$QHoD&3Lf_>#ASmth)>?16C&RnDB0oQQhDIIC^(h^q)H3*R9L1*f{7MPPB)=?MI- ztySSzV004nj-9#Q;MhOG3$Z$#u;;x_b85I27=u)04ULqLE73nN2QWv;cAoy_Tjn6$ zYgxB%JmUSqd&;JpAU1a&e93aC+nl>9B{o-c^@WFiL3+31Ld?;3i@j5y)mC)&q-b(I zc%Vu6AxF2_b+XCjM{6G%+Su9*#_>Ri?!r9LmX@_RADPq)-9a|w)Mm~;hUcLh>Lf2@ zI=eRljDHzc{czO+=eO%z(SNlxyUx4Z#HGmAqmw>*m0#(5Di!g!X0KxWZ`{Kdxd`jY zmQ&V}OR{H?WFpO6!rhJ_M%l!j!17BPAhtII&vXMd_Pb?s7}b@AwWTfZPN!!a6xv{} zAxPa^x4is$XRe5uqA!Y(D62T=)W#1C%*8sl8y?Ziw?Fxn=i0FXb8b)`EcH_rwJWbr zy7=%fERQssQFk}3#%KudJf#rbs8ceu2$2g zeB8)0?LwE$*I$4d7~=+qLVE$z9@NTU^1DBD0DJpqyv;G)uzh3Zcm)5#wEW_R3}|(^ z;DqUP8Rj@hr6<7=9_I=p$&N0WQUy!LlB~<_HQ)xMUOcP8wy_Sd<%=kMGwejEDeu%P@KqGwH;(AE&hxB^JWss`E7RQ z+H-fP-J~=s5Y}3nKZ?27CFsdWqf%XLYA0u3wy>wTLMB}O-ihzE(Y-iY`}x))s^q%C z;sh~dgrOn3Bl3;P@9mJb$ZbiP@H0?4JUjfRZc^u{*Is|O9u=k5BY7Cr#lJ%>^Ub$G zMizP`Em@@C`eUxfLBtzOhWi`LvT*cllR%M|=?14e;x=+L7CbE{!3Aea1k{OGv7Fha z;)L$Y+!hrwFoCrMHaNxtt9(^`sy<6mb&eNfOmNRo(FD7WwkmEDP}rU)jQ`wc0nwMLc2-lrRwENT|G z(+?a}R?b>oAqvO5p&gI8Yb4!Z8+uA}hq`xyy8wU@5K!JNJ#0T^ES3Dnz^}qr9kyfU zAa93P8&}+|K_l!Fpd2Qk91Tr=vh&ybQn-fkpRD4OGZ*{hpyMR6)a?^(#n@pWf0zZ_ znD!Pkn5mao=_A+vN=+F?K8M4wrF5dFR2UfDbYf&A*S{F#%xSzOH;cDL5B}p7L}tT9 zzv*y*)1bQvw!DH^+J28hSzMaCSs(JdPGzrS&zZ~+kPM4I@&M&C``NFgy<{B)*zydb zu5~m2jlK*&3-WZSbEbd4%^?>#;uf7r-j|*cqN5H`8chApDSFVAF}+Lk z0Bwhjp0B0ub+8kLN&~1_g)F=%uAK39D!os1sMwBS$vB}MlAXV&D)CKhey2PQlwxkaSvV#2l61uX4VS_Ui$7xgh zis)n7L0aQ2#3(FzzbyC(sNgUW?+wk2Fp>GYO?M^es|V}y>B5f!#HAb2uDx=BR&R#vo{*;wY3 znqo<`c5mm(x61cuy~9F7ghPW$Gw{B6Qjt1JEf*`^WPs1^D=rOOAlfVkTaEhsb?I)f z6U4(q!o*lZw9^=1IO#1i9lamwKbS}_jy=zHyVu4dotGOkcodWDT26ysb~rBDG0ai2 zol)|;bM%NHs2|<`WlsD3Rd2$_SQL~Dzd#NbRoC>~bkw9p?2oEj%*GX%Pcl-4r8tghy2 zJU(7AdtWltRFTuC&{7eX43;UV0dqG@rDDGa7ue|ko?oY8e1#{;I-Hv;pV#Eq-`@5#Bv;<{aB3k$zc+>HWZ& zg@1-%tgHyC?b(_LpTiv{kk8=@avFinwg^fJ&;M4!)-@G$qYFJol2(%o2S}X3I0^{y zLMILx!kz~LgODDJi?KNCv+Cb572z@pBEJ8Ksin+{gtfN**LQ|w$hFV@!!8~olFkp+ z+U(OCXxM(laC(2_%q`4uc8JbR3oF#?kb;m{No@J~XPtU1?(tgyS84(li=DZkR_xaD z>6jQN{}uTgeS?&<3lNWJ(ymGqF!l2XGTr;%los3Vfv+z5Kh}8`lykE1AvBLQ8{ac; zZuG`qUse+xE-Qs3wnduO7v!ArzJ{h`+1$yU1Qc9z0*3w5v& z;y4paV|pB4Rh)`1WHTR$1`qBpWmiQAxjPwnwd_7{-7tL1g*pC;bEJg?OPJ!MCfrA^ zAXZz3bX8Wi@~So8;3dPP=Cxlt_N7_&@LpC{%VV@{;F2F#d#ILL_Z;YP7d5>Oeb)6z z--Fa2{Z6|13~nuY{F3AmFg)4Ya=}pdAc>g&9n@F*dpQ}*JUn90!Isn_tM>f?;`vdr zV9S{>>5m8!*yNZ1eP`RHBj*xke5X*n&`Xqq=>;RioKkT1SKx_fL4tf(8+KtU=V@rw zbpf_i;ua1&H{%Y&-hwd3?nlu~OyEv2W(!%~ zo&?!H>&=4FYI2^08I==hjR@zn302AJ$iY{vlzL~h(3D={lexijDK0T;w`2rhRtQCL zN^pgBEAva}(MB337p2`Fa7o!V?m0KOb<8tQPOzf~V;mA?^eRm>)b~Jw1AlKD`}yuZ zI3>)BFIkjOACv8{xxVNa(bRam{ou(2nvh)MhKYrfSRd0D8o8=bD+j3~F*uZ1mLl4s z1Rr5q#aH)tY=wubiokqV#=dVe5}o=cVWrj18DF7&=P>ZLOajho+p1eEpMf)o_BbwD ze@Am5U2PvQs2Nf%upxR=o*ZHd@rV?tEUw{rj)bXYyeR`SEcjc$!Zo|}Bfpkd^|OHo z)r{tbx+yeJ)mGwh6D3t)yd}gfn3S>SX;kpH(SJ*8#YqLwFOwq+aD zp&R%2^zB}F%V{8QNkst^zM(;rrC#IR6 zl2N2W34xHO#6nlWJ{Z^K+wE)S$-ldwB)4cK5juA65R342B&ZU;fYtZj9r|OBpZ`o{ z3bEqa*#Q}LloATT0q>>Tw<=m98ep7LsS@Z9$l@&9-PQ0WP3|i^Wk*?v%U){O7l$4Q3NieW1!Q@GIp6`X%oSM1;d&Q>WkW=d9 z7S?+=WOSbJpVNlw^uXtPf9dt-9q(eu_-68wC-unhiwp-_RNizav@+jF6~xsOd{PRj^Mqb24om*1>eip zn#V+yo}+TGs-;2|qxuGje_Op2&o?90+S{F}I*CB$y`VSeHiA}~=&>Hkq|dJP^|;(T zAQE-;+RpT>m|!l6zcTTV>XWDdmHb?ut%Zcq2|rVPZw~6KiUPh*i^#SJj?M7CMSGin zEN&gvypX%ZD4!Qe`uHs{k+1i+HWaY+eqioHd)v3tqpWa7Vx^t}VZyicWV!FZ%%v1p z2UWALlRJ?>oBi-~|98t&s?v9jH=YKDgYczjRC`Qzc5$wZSeH;zyFR}dj=XRgq$FF2IdQ*lQo#=gg8)%60 zDsejwG&0$a>J!Bu1JV#QK{CNSI&gbX^{BZs|FhtZ`~w*&>}eav5Xt9FmqN5!#`oc$ zkT^|N^3%&j_{=91-!>wW)d7eWI07+pmCxh7%Ak8RN0c$$h@X5s z0_61w7IBMWBS}iVXoctZ3sKn?b91gyBEFzP9oE=LqG;I{g-WW?&ZOI-IcWabJS0S> z_I5P@wtD3yjx?a1Pg}P441G7KSvCS7$7Ej77thVQrmLC<1PBuFqbCvx#At>c!nJ>y9@ICRP*3- z7adhKO)#S#O!Yl!Nievq$Rr6=%O$LW-1fX)FqH0aa_|YLlh#lB>=zyUPlWBx2i|8j z)Gw&rMxvIyd^OaL@;WPabD!u3_sWp_`*t*HttfUj#g97Lt5+bRv z2C~10-Rp)*dO+hcoAGpFlLIRw)qi6<+S64o8hxKdJ8PpqcDp_co8Yf;-cMh7O2E+2 zVM0E+-l$4gp58n-R4$9Po?fh?yFJJ~u~N`jT^$u!`<~2PlE>>NrkW|a2Qe)bg%nKO z;38xd3C~@KhJ9bnmriVeMGdB&D>V$TKg!wu#3>$2hokDZ&mxJR9v`$+v>Sx=CEo%RtMKwC z=l?*=(L%M>_79SCTMM3uJ>H%nHJB31sw1#bScGlREy@S#{2P^8j6me7Y*zy@eu%L! zKNrG6^|s`D`606~&|qO4A}$$nOwzdM#9M4R9qJ%anTv9H%#fGU^Go&1;*x8v&2n8= zJV@=Y22LG4CM3@w^Q$iAsVLsmVoX%CpK$wl%(f}fnwZ;St-Y4CQfzu)C5@SWG%fxjp1U2tT(x&+2M=`2MN{B+oz%@ zthd!dVkP`6TsPGqmZi5OV(Y%t$uGHBhldZdH6kf!=hG5|sT2x?I-wmsz@ayH#P$1j zgzM5d!#1gH5uzz<$aEAw?CJT#@Zi;6p4WI&>0N%sUj?Mp)>p^O z>Y+(z=2+3e*1Mp*%#^DB%}|Oz?H!dP^_oEWf<#>OONO#d(FBVoI%|-dNkq2QvRF;v0S2o-5gsgi^^7&$^P$* zsz6t~nR9lzfD{hl8Tb{WWA3KGpq2?#G6co>;L#+u-_q-F1POmQc#HW~2aT$pxodOA z*Ze7Y38>f&G6K;b2>tLnc1dg)CnEboOU%Ce%+NtBwI<*}Mu&ARUpV-{s7gdGlc$BK zwUl*6sq>$J)sorcYhuA4(PFz1kZ%~!bP{mp1OAW&`?xQGWFj+MD3XkkU3+-ws%rxF z*JA&KyEKN&qdxXw4D(2VNvd;%x6w6!TVH#c8x^HX4_7AfP_(ZlUX^*{PF&3!zO{`5XOT+C50reb!hBxN8uX0mea zpA`7kb<|f~-3K;Msz!cfXZuj$8^!+RsWXAlxGp`--~wOYBfEDAe)v5_{SJwNRbY_w zq>Yqu;p^K{$OgI%g9Kmhj6mx7Zc)4+#)bhDb(y24Kh^e$*Q zO_&~EP(LPwKpdZIl00|1DYvUlW5MwEa<%Ax0F9nP8d*nj7^EE)NWAwG%SRod1Fx&+ zqx>}MINIgymUZj4M-*em>XVYU;wCzuE>=vEmXy}j{Ni-uDeD<7f)z@@a3U)av60nf zbJfaNZA+wP~~L!rV`yaWpR(VzDIt#_a>T4Y$G!-il1@*n>72&8WL}!qm$|ivlZ*Zy@OoYk(?B zoBEX_8}En=d{ z=iiYh1Cyi4+vnAa*k9gWrMX)pvwpDSVJiPG4mZ{KhwX&E_*L}II_z-lC=GeYt748n*FLQ8ZD+nvmk>l2A2xt4A<_II_Qm>WbgoI><#L2p070 z-@Bt=1-+T2f?4ewB+`|D9z0h^XyKtG!HH`?ys~TSApA z7HZ+qG=Z)^eoW@;)9zL4sb`eenLlY?+mnteUNgg*0}n_c_1EpHcjnCOW%XCrnQPEf5ZM-JDfvSr;|4#ANh1sQ@U2~s{11?qp-d8>E1wq3+m?iGU# z5c32UimQu0PtR16cgV$9ohoJ24M&>9A$A)3_9iMpXH|7W^ROXA@+7v{N&blMC$c+# z?NwoNl0*jEq79=Q2_nDBO?8N=TQzCQ@jhA>4$CXp zF`f?iSFPnzu^`cT^ULTim)7Ow;%I1n+pBRfPh9~qm9#s62{hFE`0y$s_)8>*VVhKH)-^e#jx#S)9d17I0~f~9(uNBs$S74z9z`G)*n z@>f0S$}jik>`A?LoWo#O4E^IQorFdS1r3%fbkIewr}hge2t(M{x2k(h!+VNyXqM0H zx4z4HO_WZIu0+|UxT9fuTfCua#LKr00uxdUH&UU+!qq+AZ#&#HHK_xLb^a^o;wouY z>W@>0NVdc~j)wX4cVPYU%gV4RvXY#9LcVdG=B0UgupV zF#sEXBX*x%j_YTyG&#t?talKP^UX^LW^@;p;SD_qMOe$_`Fi#`DK+a}M0hS|Vp4>( zzlI7(i);`R6HCo+8sxoELsJ_$H)4D$=iACK7+Mn*gf%Z;*dk}_xm_I_dh%5s-=}At zE6C>0eF1j%xqgP%VR^%rgQ_9tt(n>#HN82l> z@qlk5*QkO&JUs->RlN$t`-S9v>*dpoxF4^-RyHA`#l}*~*hkgq+jvFga@__qfXmS` z^|jF*Ea5voyz_SkRw@OY0q}x!lNJ&(-27x zD)s!|v>YiNE%C_;(;4esg))=`%DPp@I;hPvwijQwx+(SLdC|L=A8{}PpWbp6}jcm$(w$*P&H i2=0}v_I8m6@4G4YG~^ literal 6610 zcmb`Mc{J4D|Hmt#$X6-JQrb|2kVKYHCL>ERGu9a;Yekl6vSdUhWy>zhD2Zmq42rRh ztt8t>Op{$%h8a6!jA7>Y?(^-t{C?;B&iS41`Mv*`^M22H-Fx5n-sfw%k9UlX6-Z1( zMr6yDEn?=EFJ9ZSWvec5Ke}TZ@XKy~!rHP$I@A23vEBXt*&K`8lCYO833o2U;u}|w zhHv>yij$C#Fg==h)I#jG+5V$9_j-HuyhtpYhNvrE+fN3UF)qF7cnu@RJnAK9z9`#y zSkzr0_EF-6gJX{#T|6CrVdmEE@a-ypbIq`ww}sH{sAM_>!sAQX5JH(~CXTzwIA6#Z zp1-Fbx;m5PS9fIh_Ec-XI*tbjBZK` z!9V{2PodfOfD2C~qWPO_SINjW#Wuz*BKiAt+fUZwSc}odg1{eR299WkClnWNu8k%9 zF;pSeni$VA7y8B~X|eFyMX zR#v(C!QbxL*oYw)e>KO%>>LQaZks~w?(Tj{jTV=ubaZ@ZQ5IzNm*0{{Z5ZayT5QgP5^` zYbqqA4;)ba04i-`z)@^v#iCYrb0ei?z0z8g`{tObs+uu88Mto%!9f7E4-vI6Q8b5Nr;4J>TPr9 zlQ=+JG4`8%5MyW$@VYX}FK4uW_0;A0l+LWhU~)&4vxw_AEKZp!{fsY3#$7Y@mUSDo zaT0^IG3JJ9jzPVz78H~p#!0EeYeQH*Hx%qypWx{+hGiflF^~%&umj7%0`}tu z{xf4)?tH}AyfZkz`pwm}YU9fe2W4bl=lPD*4P8&Qf=;KDuN^oSr(%z6mYrG;z7tJ# zjXtp4{#xU1iRGjyrC=3;lfe6G+r+dpMn?||Qi-_b<>gL~_XW2sb~-m=j~&7u_n$C3 zCj{+M<_~vgPxW8R`=obo<90d0*Z6m%hK7cFusdboUzL%NCYIR;I}|+-#9PLe$(jPvZ%$#pjGrZcfgFh0(2bdkbw{%bR`;7oLey zac32z!=HU_0Nm!{uSiDg76Nc5a#Fy~y4qh5w>yRCY-8ZvEQvR<(cTU{QY5ntx7$wa zA!G;kiK80}*rf{8fyhTP2MMO|_{r$(bFNU{1IMUfH_ z{`y)J#8iWJ7&huhlgGZV-$K4I>02d+mLJVgZ7@ zdz+0u@Qy$}m))*4d}C~lTkl80fo90gIfiU%ugKVe+RO7lQPv5p%iI=t)K%{4t9nn_ z84~~KE21puAQlgnV)B&|a7ZZZ%hRkN%EB0`Fc->GxdDVK{zSYQlfJaSr)IKqWGkq{+R?Ycu(#kBGC1 zC`A#dLG;q~xmQ%;Ec>i^3^?^RH1vmU{o(5e&?rnuLW?vj zlU$p0L0ePKDGsVEEdWX=a-|~XCT8=-!?bfuT4|lb?CewOZORjjQ@Uf~4k!JRqk=ZT z_f@zGXIoQZm<^5Hb7Hti324F#71)>31;pQQwO42#eP%SRRu6311~0w(%O; z5t46g)|5zA-uDZB2&#MF-3_3BUIgi9&cf2_5Ifyn`w3(LluRl^+(^EXS?#&^kooIa zYL7wBhu7aYhl&YDV$+z|wG$v7B`v6$tU2+D;o`>d_dp)cZh5<_FI54Lt9EdIu-$Z5 zFJvdQkNFap-FiT4-X{S99!;gf%f1E1K73IHuY74Ba4Jcq$(cT1JEf<>&b744j{6|HL)cF;Z-GDk_? z2#xUPQ@wVzq%ePc&Gamq(Ywnyw-BWq5cYJny3OK4ij_sfmNn zgYVzB?@^<4buqPc#t^J(J0!Z7YTx0i{jr`=1xKPwWS&doJ=S0bG~Apx)J-Fbx{Hsc zhfsmgaLS|POPWi`+^b|2ghGX8&Z_pL9wKRJX^D!8dS{E2 zefnln9L||YFV&zws0m>)fP`wmzgu8}ZaR&B4lx=+j_dWXlzbfXD3}3R*aT0D7|8SN zt}+`ybtY@<|M6z~h<2AH>gCr?53P>*>FMc*54W~4IyO5+!a?ofkzdnY&u_VLkemvc6FKr+Iu~8^XzjI_}Vdm;#4(ku3=l#M58bKZAD5~%t%?wf_n zD&~@NeK#pu9HR3C2di_?opyiliH`pGJi1K1G4c(Ahy8-FOQQz4fDvC)FxEoquiWci zhDLl~Em6WJB-l%z>1mo9I9?S7%gw5(cZ`7#|5LDGz9;u<*>^4wLkO@TdHm-aLO5w2 zq>F{+M*T;+zI}fG4ha!*t((S}j^-%B5#9Tree}1u-U94fG)u*diaXxeu9HnX{=2_G2fINTKO92 z?Q65BZ#+bzcw~I}60bG9igVC^Vxw6_8tnpzmeU$p7EY@j3W{MRO3W5Gt9f8V>`Iky zBMXYGF{k$z@UCqp-oMkbe12CeM~ZNGx2k~mx z?B34k$ZU_U>qSCN;8*stw1ok1}QhwDEpGkcUy{Cu{~6ybuv zTwLyaK}WvELhw?&V_MLP#+fc3o^&+r>4y&npwugzUViSg_+>p*eRH(Sy7S)b_M`Ze zIrQo2fR-1@B9v4X4yWrWH~h4)gIsITrd+;(*L{^qoymv4;8kDj3p>}>ZrvA_O2<@b zF3=ocf<_KDAFE{suFH%xKTOz1i#y>E6!$PtEg`jr@R|M*94@QukutJ}vW5=n|jbG5%Q#4UoibZ3AyCUylR=y@OHc++YU)w z{)ED%vh}1U6Tb5r(%hq{HwPwW6mdLw#RxNVAS<UZU-?m+tox};v)xVpU^j+m)ql*g96kP;FOC?iu zdEn3-(RqyM2tt)yE6V>O77`3=mB%=hF^SVW<-%RZiC1B(JfDGxqONS!%<^N4zK=S`*2_cP?EHk%>A z%&Fj3N69HUrHQW9;$(RN&o$;S`Z1Z3%;S(L3LE)*^!Ie_IkReJk^RJHsQtX5kfHVP z)x_tEdyz05(@}P9X&P&nLZn&sGE}(8#pY#E&SJ`Xn4orbd z#L|M{PWK$3?yCq3_4&2@K}@`fFWw_$v;>=|X21A=osQxQ9{w_kX$cK0DcR}b+#20zIqm=z) z^bsI>y0}X69&h}cfqOP2oJhZ09OOqxK@Usixo?iCuvVI&Q(b-oIeeF};I!{Fnz~DM z5Tp0qifIx)gfhI;oe$!2llMeW&)%Rgn@@RN$bXX_^vfT~TRe1z5&8nhL{j)>L9gKS zB)pocs!M%%j@pzftLd?*l2!K9+}vs&D{U|DW!B{seikWgtxM`wsrJs&aYJVOwAR1**W>c{_fYeg~CEY5(N-J+=iB; z$K3b)be$tH6kk8F93yo@>WOJcj=$HNP;(p>*EE)&O|@^^x1hd!AOm9WwwD(Y61?2M zhgO`9Dw7KQnr*cZD6AZE-IIk%S%t9&pmJy+dhESZ^PHuD-;RS3;Q+SrIV0nZHXzq( zIq_((=|yqyfz0Sj6)#oYk`}!2bRTYD!ZQ`x3)GQsjTON56S>`&J=*zg?4`-o zejbpppFxbD_s`@Xogl92oC|QA0kie!_q{R1kZ%tTW`qi!TcNGWN>7hvR++mqum_GC zU2fGVIo%x?4!%-Nt9V`AHi8D6g;SVnLZ(=>`=}LN91DZ2#Ku}GYa%-5%T-bQ(>+Ga z?TSo!OQ#iJ1ACeJJPADP@jMaWh=bM0=Pt>UP%3hCTw1ko!YCy8rai^fr+V;=k z!+$RYAJyFZ%hdo#Vgm4x>IUTvQBKtVFhIvSP}$XOkKw~Mn+k19 zAw}BIBRk3z03=J@4IopW9RQ=LQ&dtSy40j`KP)aT0*up=y9IzYi2?pp5#_A_xp9`R zWC*23Kz8_;J3EU3a8G%AId(h2O@Z#V6Oi^ueZ3wO zieSgT_9C&4?zRJ!f5zHMn(Mf$RxCU+EOTp#?^Ju%?XiF&f!?sw`8vzvO4hmCt(QJj zm72*93=Y0&w;Do5?9yRF*U)87#$VH}wj-(UVsEzW{RIQnU(vIWbqTsz^Ha)D#Dz9# zw&1mP(ccAWuP`+CmiNuWYYyK(H8^oQzFOoCM8P2^E6d5zu}wz6*7tkv%#R7%iKFBA zRgI%7-3Xl_@DI!HA3;&kI`8epa%T-HHs8_5+f|FRTqXO==X~z% zO6}8F+*OBN7%Dk1u(+UF#xqq|k)iwnIZ?`>QV9gYZD@XyjGExGZMAC74#Mjyv1 zFgIFSB(srMq}%Bu^nu+guxY;`JHYCG^W%a`scF#P7=N!jvMbkM4=$(-T!{Z;GfWOW2F>c6+}P0nJA~KM z*Pkiv@9XPZ9Bqv1>vQ>YZ2o7!IJ0~eo0fb~!rU-f6cF9**ZBDO_-kPA zt4MnnIJ_>9Ze?zW*=}r8R99EG$z_A^zycYfc^iH2J+oq`FhTB>qpJ1y7bDdk@vo_` zB6dW6V@yrC@{wljL!-yPsFqk^yNSPXfIo zHDHrpfIKPzFzxpHW5V@`D;w=@D$hP%)Ja{lPc6zJl y>ue7x2rw`2QUTW{mExFfSr^hDY;##d-@mlYQqMwd8TeMS#r%@hMS_WI;4_E=kjBqV6h;pO4G&TuT)$R|E+bM|m?8&a15TK#= zNP<{4P`Eu4?<3iCje@*hJ;f4}jE@+;6J8WIYr7TpFy>%sPFJIT>L_6XyS)?I9lh^0 z%R1Qg7omFA8R+W^h-=)y1+@qwLJ6!eHGJ*zlu`zwqTPdy{cF2AZGWJ5Y3a`X`19*q z01)|Cuc3>K{)ftoSy?|J%0H|^K)rOj2zz(e)M@OD>4P#St2IqD+{?;E>Fb^2MRm~Q zPTV>V+g|W*GC0kShum;`HdDaCw;zDsvgt>umF(S?PTxzFN_a z`M|(SzUGk@Np-6b-&{-AI^SpNMTj+Cx?|!j(9R&20>~na4z92@6;5fZQH9Wb=l$x2ztO&sHeiE4T-5^8)H-xau z?NzHHJvyb`HBi>5-aX^kV-fqo_rlGv@X^rar#y)h#_bbEz{Rp{fJTJInuj%_h22oK z2k}v`W)Wuq5pE$X--_E;e~*h=#E2@(Z^Wx~9NEak|6V8R$us6FVF-gcN^ zeF5*r6LaShhp!9g3+9f*dG=#qx#IfUpJ#{L)T|eR zEX=B#uERZ~vI&-jctGKoTMHGGcA1wXpt%&%Q&?F!F!PE+&>@!)v({|H!thy2k0O`- zr+Rt%ISK*2*RFEjfa&Z`b?Pgk*}J%b?~05j-DVL%(i1j#8~IiCH5-8z1C2ladKS() z;kceI6|XW~;t`?{ys(q96(%@)b#qp>TD(B?-DNbR40*1*^T_ai%ZJX%mW+PCo*$X; zhH<#>8$kA+wPVhmPRWDrgWi@-x=Za?vHH#@Q4y$0RJ>Ci7ggjpYRn64Om|1(^7Z<~ zzWJVHXaBet9UU^i>21Atxx=t8f|cDpc&Hz~jziHtE>)i+G1bTx8Yxd8!NuaQ&ss!X z1)mYK#8HLoI?1YPuNQhlU7g3+D_W`SO8#5u-~4zMybPm~(1&jUA#a)5>Hg2VhS|I; zO8f#3AsDwNG6g-l+sZdTff?VR@m&B71cpURJ}sx}7zwuIS-Glw^5u5TEfoIs`R?@I z)a~5dfwxDEs#AIr+kYO{+HZ8;A4p#tASn%swlQ9))@I7YACtByIswVNk=ST(WvljO zep2k%z);SR$$L8SlKSgD$%5@2?x~gw5(WKTn=24@#Z4LRzU9ag)v~G!o-U|4UfX~) z8@Sk&Y^0?Cw(na=*Og-Z%fmu?eK)oEyIi6(KIq10gmCkO@tW*c2gaD-rMF*}l#m`s zXq=iIekbIFO%$aA$ewv0`A$gu%0+B{LFsj{XDZF$k+ zDZcl)s65>ew9l?Oe)} zzcpnrBb{7I0J(Dvy@7I*EcoIDkAhzPVq3QaztE1B1I=7w|Aav*4qR| z)G6)hfar1$X zpY0K#`B0SL4@LWz&xjAolzl!QClg7K+aXR%PHxZv5p_oO1Fj+Sy#pe-q)I67)PgeQ zORbHRrY6U58^@OMbSb=M;cA1}2GNgun&cO!hXMW^juam0wQx0l6&Kv6V^Z5GLRY!*=;@HuP}jS0Ec)T}$W0fND4$Op`KRii z9N-+B(g|%5x-;@@X#8}oZK`-O4~VYGPrGQF12L$`+yc?%(jD=^Q^03-71#&G>0(@p z6xEf4SVM;gGv44f#;6nJF^)~9)E}AZM*V?fhkHuzW@d$chcHlwetxC<1=^AEIU(TI z^wP}NaZqv`UZ?nd&&Rg#+c-2KbmR1B5_3P?*xwM7XmU)(I99Nrpx^~raU9diKR^qh zwF1HtNF<>~7pv#YMsGa~)zfj!xl{q77LAdm2l4sX!cGdm=~=7HxgH>$>_V6ACi=EK zo*o~6x^vDaAiyQ+n_jFYiLqXN*EeuwSnkI$Z6o@yL`I}@qxK4mg;TI3`#*6)b1)=gY8L9yt-J~>DjcsfA}Q+mroe)ql$agK-?|#{6}Nl>md0jS-k7^@-tOV4;4v z{n%=K4*d{%0on65*j$qF4(#Ia$c7FqKYyxmp+#x!Pv1B=oo(9lvNC%)Uu&T$%{Vw% zuXM3RWsoVQOO;c3Z|5U3Bs6xXYYHDMO@@ka(!QH8(&P$GOq-3)raE5qQX_LJP@c+% z%;FP(G4Tqog)O;?6vrnf26op!Rv*NGQ%}Z@uJsZ?>64R_Ds!)}Ap2q?^-d#N=lsM{ zrga%H#*G%x*&P!{K;}e|9uW`AQYG98?v?isn&)$*R$6Cw10vM&Y`c#_?=}XA&aH%S QK4AbWb9=KI6OZ`+0HgoB=l}o! literal 1391 zcmV-#1(5oQP)WWlZ+94|)GFM&NsbjK4oja7ZOEN?P zg`h+c?SQCTsS@2Hp>zt|U{GujCivXD^S^g@@18lp@4esg{VX}ZyG!23zk7GOZ+;}H zX0yo>N(ycyfg4TWMiaQv1a35e8%^Lw6S&a?ZZv@#P1L!qtgP6!T`HB5=H`g4t*tp5 zlarIm^i;TY#abxS8@O9QOr_pn-GpMw^akiA5mTc#D7U_13iR-NqY2z-0ymn#jV9;M zZF6&Te0)6K@3j5m!NdRV{QT`F-I0x7zgxWg!;dp#;UgE=e0#ie5EBiK_5WkHwzeiF zCRDpcPte)(=jW{>duIs;4R!NXCwyqR=xTE(2?q^z3zf}xfU|euU+34t9CwIt&;&P4 zzzuGu0XMjr#!1|C&p8ID8{CWnZg4XVxWO%wz`LpYamjMGuFVTxp$Wa4wrADV=)H9J zq5{#^5XcllgSy>3ufp7XvAockQ83B!LY_Xc51A}TS~vO`Ui9Me&Aju$5)GQ@#uv+V zWWL)8?YeEqi$Hq4$?HZwd+jW@-hxB+8W*_1%{1T!H`74&>UT?W-QcDlxWUad;0Cuy z&Qtc<4iXZdy>^nUBxJAK(m;-Oh8MUdmzZw>(av63?_T0vtc$)zO5%0n;TBSOgx-1! z{9Q+Io{7m`yALa5uW^AJ+)M**a5D{LuYR}bBd{Q@ovA5=W@BBp^R>YNREygb;s>y{AU2%67N=Ie_d&BzInsGE_+*7 z*{e_42j1r2|FHY7{ig``%1_bY=1quM?A9u~H_g5;w5Rp>8+PR#yZ)U0^acCsB75|d z{l=Xn+$%ptQ{DUpbW6uN8|C((EBw*%_VR<$(kXT8)h#qppAwVqZvilpl1-Ubf2)nAk@o+6#~_RC%N*@fU#1UEfSiO7AD zd$_e|fA`^s6<;nI&o_O*4Q{3ZxAW$fuEAzlfw9?rul_E(?k90GEY-f(Kn;Tx@|TTR|74%8>!@#lK;Nr-4O-z_ z0QtIk_sN3jrvM^W4wdyL5sRE9k-k^%+1AE)%Mbn|3+Q`|1Ki+d8gPS~X`t`b@0R4c z!A(DKgPUo<4Q>L2*{dXwb)oTYD$HJ^1KE!E$+B15w)gh-4h{|)jYcMu86F<4)oN<9 zS0)-PoI&!QOa`5ldm_mZn4GKX|h+PZo=&K&bBC!Eu2C2 zs%5IdxN*a|vVC z-v32%#{b@HwOUn`PYSbFCW=)3Uk2g6SAj^<`d)?e)ZRZCUrZbE+>!y@XacwREH5vw zudnw#Y-(z1c6OGS+i~;;DmGX*x!$0~2JRN6r$9`FTUbwxm?Ae`PnnoHx0ass#-&V5 xshfJ>MiaQv1a35e8%^Lw6S&a?ZZt`<+y6Pi6BtT3Bo6=p002ovPDHLkV1jRV!)yQm