From f7868789e25276aa5d11a5dfe571ddc375e16f76 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal Select two or more workouts on the left, set your plot settings,
- and press submit
- You can use the date and search forms to search through all
- workouts from this team.
-
- TIP: Agree with your team members to put tags (e.g. '8x500m')
- in the notes section of
- your workouts. That makes it easy to search.
-
- {% csrf_token %}
- *(XTU1S2bhe^*EY{r6s5Jn`1C5O?D+`BHw|y<^Sq!*BCoRN8K7vy
zW=5lZO)@Xmq-P7HA&)p2-M&R>hsitR1%oC^%Y;Sk`8koV$ezy@8e7#o&x|Hcggmx+
z{%-P|b8i`tG@hLFqLj?Kwyyc@M
{{ team.name }} Compare Workouts
-
-
-
-
- {{ chartform.as_table }}
-
-
- -
- - - - -{% endblock %} - -{% block sidebar %} -{% include 'menu_workouts.html' %} -{% endblock %} diff --git a/rowers/templates/teambuttons.html b/rowers/templates/teambuttons.html index e45b807e..828d1769 100644 --- a/rowers/templates/teambuttons.html +++ b/rowers/templates/teambuttons.html @@ -6,7 +6,7 @@&{?(IrcJ{@=P;C27%?BdF6 z^5FdZWOdZ_>8D@57?SXD=pI)y{US9s(-_rY-4!!blK5Ti~{U=>AI}5IU{(867 zI&JpyX}|4;%SZdg`43*Cn?C$?d9v&_%fumn`tazk+}FXAZhidt(c#a}GMnw6yY0WE zxA@uX(?6E!&H(NK?EXJkT=`=6uIcmVC4TW=dT7J%RLD-1uh4~tUg!o!Q} zx@eOwHbBxX+MwIF#ne_E?b@;-O)mZSOG>HZBp$TK-XS;x<{_{~bJKit$aClM*KaQ` z4qh)e+tt {c`i9>$_jO?eZY)yxx9w__FV>j~0tJ zZ{C>mZgaU>o71byMf!4k`f_>MZ5MYRzIaWC`%@fsZ~wwszB%nzuUGx=-@WaZ>wJT^ zPVjcS`rr(2*j#PS7X*NdU!FhvX?Kb*R_krwtxuQfsO{=#f8J+Tr(M7MwfDM#1N~92 z$-Ld3{rQ1^@A}8x#nooD+%8_@pYQ)$*Prh9U*22_|JtPn0p0h|{ck)xd311a{O$py zpOHVl-|+jvPuEwQ{;R`(_Ai&4!~K`(>!)WY1n9m1`GVjD@{z?Oawa |gF1vpF!*cU{wSLtv|J~pE5$QBPcNedgCuq|}_J6*=!s3og-1_=?_jYyp>hk|| z1LE$ufjcg7>+7fM-K*OFezJQjmWk}mmfH{VY?&VL31NPW`@e5d+^o*e)2%K0mse*e z&%5=j?jlkAVC(I@yVL)EaQC|{*H^1`e|vNOBE18D;a%MA_TiBqy%J*V@N2R=;DH2g zQy~8dg*}P85q$7~;g09K+u>&P+J17`7eD;+muG@I$MBEOn9ljHuJ4oB#N);OuaB>} zNEiM1=iPma`9-)3ua-K4NzyJ>K^@uPG_dCfT@iP36>(1x5nNDkr=&L( SISAon;M?#@=kJtld#;x*i3NqJ|O4R>D=cT2l*-YK}-V5lH>d;oW> zihF>HxJ%-mgi52$d*dd;y)JnVToHF~f(NJ3=bbBQ#xc!@yRV14fbjvXM&7*`nF#mF z#`%iuIAIgPMh*8MCGGb)$$O}XyE6_5G qWb)N *(XTU1S2bhe^*EY{r6s5Jn`1C5O?D+`BHw|y<^Sq!*BCoRN8K7vy zW=5lZO)@Xmq-P7HA&)p2-M&R>hsitR1%oC^%Y;Sk`8koV$ezy@8e7#o&x|Hcggmx+ z{%-P|b8i`tG@hLFqLj?Kwyyc@MqmXw7BZ^Aqqb=&aZ8AR&`Caa G#tO4)o_9rSX=g=V zDk2|D;;zcTv}G$Q1)9u{LEfTC8mA*w%hRI0Ze>PQ)M6_l&&E4ll-9;rGACzF g`w&8)0cU%CM4ZnCG)my z)^%*Pw4;#sMpzfI5h+W)`S3;{Zxd{T-m0>$#WnKxC2uPtPbPR>b(MIWOnkn{{4jYj zmQYn)C82CxUF(544*6gRQPnv?V%ZuS-*o#i$Rn7D#2W9d18ljs)0cT j{Ubc989`#F)XX|#_95Q8Q@@0f~KQTrC3AA@|(y$u*NeQ%wmqPe$o zB43d`Pu7q_R?YK5lgYj1RzE*T-W#+?s?pw2QG0$y y+8K}+10bp{=Pq)K(oTQ0XKzGwoe(`V^7kcQk#29nuosml$D=K& z;XNo1uW5M0 LD+fYiU($T6ig1KR+j#uSvrbHeLudK0NPSNx%K9=J|^3`6Ry_NmXOx zy=xVf_at9YlvbhvCQyy`!A(ZDZ{FJh@^S=dywZo~W6@Q}XC?De5qWDYh)U)I6kUsY zRx7r4B=Xi!`lljKMc1*(^`|W}V+8U(=i#aP;YBXGj*ZwEbw90%d^EvfRLOkd zY%JUQ-i|@ul5wJ|u8M`TvF5ZcZADSqB)`H+-QKyPR^6P)SLDgD!B8a7 `I} {LSK<9 zM`BL6hoC}F(9qwr|7kVjy~~|%UDS>D2#iHj?jM34Dnl<7p_kk+1#| =N4HW zRp^78jMP_#o?SiYlbvP*fmNZ8zNnfvrvV=;LeFWgCs57x2w^hlYa8%ul6q$tkW_O$ zV%c(=Iicr@(8sLdN1fD{UA3^G9|wKzgz8w8nT2V_Y8w6w&`TchRUunMp`y|HIjMOS z8Fw5Ec?>EIA6@h2-PgDa^`K8 9js z(ffp6*F+;{a}`C;4gDzSqls4O(jjm~jXP@IyfM%xWj&&<>;@@2{+rZK9=#anwdkpA ztF$>uJye7~7!gu6z(z_Ip>OD??b7kNGp2PSD&vllf*=!VpMz~#`a$&8u-CQE$qQpl zrgKuW>xa>MLqURW!1qwJupXP5HwJo40<0{!Lkc*Vj=0#;G6&JKL8t4Qg%pb}Tso@( zpDIG{3|P`- !HH)!dDNK4(}8>gwxR%C=LXrsj=;o{a!Toz%N9 znE@YLg4Q5 {M z@U0jSW#N@Ym`uFBwq)#zg0?nkY)CPx&=a+}e){MIOjIshjFzcr z%ad8&tT}Rr(eGL&dX<`I#Wt7D^c}gomWk+fbG?(vBxtp?%mMUa*D?`wOWvUM(u}*Q z+w~#0Otd1Xa^%|3s&DR#K2(H0 ~Xc@UvFT4u5Wg@0+I`jc2(@>?Uc?0NUZkY&(QD@gjYH67>K+h(C(wpa@ z>~hA?dg+XU-evSrW!HP;qBVEWjJr|LN8?eMhwrIu2?n&F?HK5hazhoR)N|Pq3}`{y zQP4|ns6slaw^B562Tjcz1${6q7<5uEu4t-8Q}aeaPsz9=WorfRTyx}3-K7(A%S6zw zY3se8%v?_`Xgi2L7g;l?!Z$wnX4lUEeKeA+JDt==KN-88nwmF+p2>){y6{ba(Cqpd zpqE^D1v>Ot6n$PQs15idpbrKZb^Y)|PTrpgdTQRhA@q4AYrvpG&v7#7+xqpx=-C7z zUF0skC?z%g+=-&09|65Ho^4dQbb`Z@E}dDSmx|EGyrwPaq~2rE0pGV0j4{v)8D}x5 zvUEZyT50 LPa$iY|6GD-FMvEFFQ} zO4fj0<;aaFlX2-l>zg--ez%gfZk@YGWrMcR=K4|4`&@maM9+RQt6R3Yeh__L$(oT= z-n?ji(drv&ee*^^&$~s;RmNSE*jBfkxHm7Oce(INiQdJcQr{Y-j)Okt!YiF!9|N@J zX%qM6CG@+Mtd)_w7_oK6o&kDm(oC;f0EGZrkKFsB_hX@dxAl(=$BSp(_05OxulnWo z KAV&8OA= z`{T!(#PMqLZr|^_^!9A7-fX+|S$A= 84M9TwW}@?J{x5pWZ#XTlaPRtXrQyeRA^M_nFP^&;9lv z(p&uftIJ=P>COPY0NDS3ytwtn{>kqi)5)V9>eV_uhsO!!a`PlTjbGEHPagdbzIRor H#DD<+Fv>s- diff --git a/rowers/urls.py b/rowers/urls.py index 6f55af06..cffc7775 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -316,9 +316,12 @@ urlpatterns = [ re_path(r'^workouts-join/user/(?P \d+)$',views.workouts_join_view,name='workouts_join_view'), re_path(r'^workouts-join-select/$',views.workouts_join_select,name='workouts_join_select'), re_path(r'^workouts-join-select/user/(?P \d+)/$',views.workouts_join_select,name='workouts_join_select'), + re_path(r'^user-analysis-select/(?P \w.*)/team/(?P \d+)/workout/(?P \b[0-9A-Fa-f]+\b)/$',views.analysis_new,name='analysis_new'), + re_path(r'^user-analysis-select/(?P \w.*)/session/(?P \d+)/workout/(?P \b[0-9A-Fa-f]+\b)/$',views.analysis_new,name='analysis_new'), re_path(r'^user-analysis-select/(?P \w.*)/workout/(?P \b[0-9A-Fa-f]+\b)/$',views.analysis_new,name='analysis_new'), re_path(r'^user-analysis-select/(?P \w.*)/user/(?P \d+)/$',views.analysis_new,name='analysis_new'), re_path(r'^user-analysis-select/(?P \w.*)/team/(?P \d+)/$',views.analysis_new,name='analysis_new'), + re_path(r'^user-analysis-select/team/(?P \d+)/workout/(?P \b[0-9A-Fa-f]+\b)/$',views.analysis_new,name='analysis_new'), re_path(r'^user-analysis-select/user/(?P \d+)/$',views.analysis_new,name='analysis_new'), re_path(r'^user-analysis-select/team/(?P \d+)/$',views.analysis_new,name='analysis_new'), re_path(r'^user-analysis-select/(?P \w.*)/$',views.analysis_new,name='analysis_new'), diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 9f62d9bf..03af6174 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -8,6 +8,7 @@ from rowers.views.statements import * import collections import simplejson from jinja2 import Template,Environment,FileSystemLoader +from rowers.rower_rules import can_view_session def floatformat(x,prec=2): # pragma: no cover return '{x}'.format(x=round(x,prec)) @@ -35,7 +36,7 @@ defaultoptions = { message="This functionality requires a Pro plan or higher. If you are already a Pro user, please log in to access this functionality", redirect_field_name=None) @permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True) -def analysis_new(request,userid=0,function='boxplot',teamid=0,id=''): +def analysis_new(request,userid=0,function='boxplot',teamid=0,id='',session=0): r = getrequestrower(request, userid=userid) user = r.user userid = user.id @@ -53,6 +54,13 @@ def analysis_new(request,userid=0,function='boxplot',teamid=0,id=''): except Team.DoesNotExist: theteam = None + try: + thesession = PlannedSession.objects.get(id=session) + if not can_view_session(user,thesession): + raise PermissionDenied("you cannot view this session") + except PlannedSession.DoesNotExist: + thesession = None + if 'options' in request.session: options = request.session['options'] @@ -211,6 +219,8 @@ def analysis_new(request,userid=0,function='boxplot',teamid=0,id=''): startdatetime__lte=enddate, workouttype__in=modalities, ) + elif thesession is not None: + workouts = get_workouts_session(r,thesession) else: workouts = Workout.objects.filter(user=r, startdatetime__gte=startdate, diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 2a8b783d..5bdc17ef 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -2047,9 +2047,14 @@ def plannedsession_compare_view(request,id=0,userid=0): request.session['plottype'] = plottype request.session['ps'] = ps.id + teams = ps.team.all() + if ids: - url = reverse('multi_compare_view', - kwargs={'userid':userid,'id':encoder.encode_hex(ids[0])}) + url = reverse('analysis_new', + kwargs={ + 'session':ps.id, + 'id':encoder.encode_hex(ids[0]), + 'function':'compare'}) else: url = reverse('plannedsession_view',kwargs={'id':ps.id}) From 47a56b0cc4e426bc53d0573f4dd56d661c7d5aed Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 28 Dec 2021 13:06:37 +0100 Subject: [PATCH 6/6] solves #465 --- rowers/templates/coachrequestemail.html | 5 ++- rowers/templates/teams.html | 50 ++++++++++++------------ rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 0 bytes 3 files changed, 29 insertions(+), 26 deletions(-) delete mode 100644 rowers/tests/testdata/testdata.tcx.gz diff --git a/rowers/templates/coachrequestemail.html b/rowers/templates/coachrequestemail.html index 19965e7a..58e641b6 100644 --- a/rowers/templates/coachrequestemail.html +++ b/rowers/templates/coachrequestemail.html @@ -13,13 +13,14 @@ on behalf of {{ name }}. - By accepting the invite, you are agreeing with the sharing + By accepting the invite, you are agreeing with the sharing of personal data according to our privacy policy.
To accept the login to the site and you will find the invitation here on the Teams page: - {{ siteurl }}/rowers/me/teams + {{ siteurl }}/rowers/me/teams, + including the email address of {{ name }}, if you need a contact.
You can also click the direct link: diff --git a/rowers/templates/teams.html b/rowers/templates/teams.html index 22e6ef47..be96301f 100644 --- a/rowers/templates/teams.html +++ b/rowers/templates/teams.html @@ -21,7 +21,7 @@ {{ team.name }}
- Leave + Leave {% endfor %} @@ -29,7 +29,7 @@ {% endif %} - + {% if otherteams %}Open Groups
@@ -73,7 +73,7 @@ {{ team.name }}- Delete + Delete {% endfor %} @@ -98,7 +98,7 @@ {{ coach.user.first_name }} {{ coach.user.last_name }}- Remove @@ -124,7 +124,7 @@ {{ coachee.user.first_name }} {{ coachee.user.last_name }}- Remove @@ -138,11 +138,11 @@+ {% endif %} {% if potentialcoaches %} Group Invitations and Requests
This section lists open invites to join a group. By accepting - a group invite, you are agreeing with the sharing + a group invite, you are agreeing with the sharing of personal data between group members and coaches according to our privacy policy.
- +As a group manager, by accepting a group invite, you are agreeing with our privacy policy regarding groups and personal data owned by group members.
@@ -163,10 +163,10 @@{{ i.team.name }} {{ i.team.manager.first_name }} {{ i.team.manager.last_name }} {{ user.first_name }} {{ user.last_name }} -Accept + Accept - Reject + Reject {% endfor %} @@ -184,9 +184,9 @@{{ i.team.name }} {{ i.team.manager.first_name }} {{ i.team.manager.last_name }} {{ i.user.first_name }} {{ i.user.last_name }} -Accept + Accept - Reject + Reject {% endfor %} @@ -201,7 +201,7 @@ {% endif %}- Revoke + Revoke {% endfor %} @@ -218,7 +218,7 @@{{ form.as_table }}
- + {% endif %} {% if mycoachrequests or mycoachoffers or coachoffers or coachrequests %} @@ -226,16 +226,17 @@Coaching Offers and Requests
This section lists open offers and requests related to coaching. By accepting a coaching offer, the coach can run - analysis, add workouts and edit settings on behalf of the athlete. + analysis, add workouts and edit settings on behalf of the athlete. You agree to the sharing of personal data between athletes and coaches according to our privacy policy. -
+-
@@ -245,12 +246,13 @@ Coach User +Action {% endfor %} @@ -261,7 +263,7 @@ {{ i.coach.user.first_name }} {{ i.coach.user.last_name }} {{ i.user.first_name }} {{ i.user.last_name }} +{{ i.user.email }} Accept - Reject + Reject - Revoke + Revoke {% endfor %} @@ -272,7 +274,7 @@Revoke @@ -282,12 +284,12 @@{{ i.coach.user.first_name }} {{ i.coach.user.last_name }} {{ i.user.first_name }} {{ i.user.last_name }} Accept Reject @@ -312,14 +314,14 @@{{ a.user.first_name }} {{ a.user.last_name }} Offer Coaching {% endfor %}@@ -337,7 +339,7 @@ {{ c.first_name }} {{ c.last_name }} Request Coaching diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz deleted file mode 100644 index d0b9235f8e8ec37e6ad81ee04f4a3522d3e02985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4000 zcmV;R4`1*fiwFqD_sU@c|8!+@bYx+4VJ>uIcmVC4TW=Ic7J%RR6&4T4!-|@7sZ$rn zI3keMA^{r(l+D|!ViX@kz0nQq>5qCt z=H2GyUmy7Qu7B8_oL#Jzo5dUa>;3=i`lH?c%gamQw_R!w&`l5B{l>e8clP!UK0JW* zGxEnz8{Y3dKR>(Z@8A7r|7v-0clTxb`ti#{0(AF4?h(8|-nY0<&O}EX;co!@00)b- z)5ravbmx1|`|hHDu{vGezx!9mUS232`r@qbPV!;Tmq%yomzzUjf3Wy!>!$-At#)tF z(`EXxn{=P~UcT7)Y44Bt4iUq_;_}m{9Udf6>yDTISf;!Gwdds{rTw%i)$`%A zh`Z(nuDQgOuOF|suWJAPaQjv)6WPlxS0CidWqQDeg!wV<{=P!-Vs(6+Zf)7WI(vEe zv|GRKP7=k>wqD)4JNoZucfZ|oezscoS2yP`(mU`C@8Wj1&yW1#l@McxUz6 _}XX;Ijt|*F4|t4ws|X=BvxT_~rL+o(ZlU!@oRZI_JN-zE5Hk4;H(>zP#ol zUG&SJcl|Bq7vVa*TIviYNxN7Db!3Cnz@8s;Mcm0%#63Yoa6!SHlHOF1d$>7ws!QIj zRK(pGVpNUtX^7y0+~aJxJ6jR=nB?7x*Km&|<(*+R+ cdn!v$21@Az8>xZ#s{<-dG}&uBHSw* z=PR<~giQn+HQa-gwBP3>@1Y{@&Nv{@=yg$w>htrFcZ7-*JBfx_=cYv{OP+5*p6Vh` z)lBiU56P4hohgSXC4Dz+=Ognh6_K|lCZ%2_^CTt|Brh`}A1flC%sD|0s_={}YR9|z zkhiWL@(9LRB$do3 c7iUDCDkAR;I-L^-oi91hTWF*G zDCC2QBvuoiLmx`|?`}oDjrN1&35_H0s?k1_B|o1C9ZE%39a$rQsM7FaENRcriM$OJ zkxzO$6RMK0AeM~MS(?#kj}?)RCLnmLO1o?1XF#6GxQJ0jJ}2iEBtIj+eNCf1i(v;| zGtZMPOWw|id_@r(4h8_cXvhncjLzHJ`0cq_bwlKn{91>qG%S)>(uX%I@)h~;EE`6& znkXq8av${7B@T0jne*U@|ga+dN-Ul-360)2pbm=OY;3G`y+L^MWRcyvm+ufT9tb z8IATe$-G#To-L4uJmO?@`xd1gChv?F44Nn{6Bf1S=S03Ddp=ueY*q6-GnzON^4RA2 z>&bJ@y=6escyiK y5_eZg}fMG2r8KuDjKnAk3yaeTNKqiAGoN7=bOxrLf#pSC@Ptcwy5{E$^1Cvx4E~f7HGC? zMdhu?WAot+k -(}8}D>cS{q}@oSZq4ucyX_ zbMCG4h?>z}5GEt@&7L179}NYFK}9|`-G2HJ8=>4SMHQtLhNjz3U*^S{kaT;M%-gbA z*Rj>ojzZoWVO_*Vq%8U7!yAFTO|T7mtIE0-*T~ zbMxd3l6N`lTGa{B5f;_$=S04y(LNeL44U}7V=7uj?OS|)4DvbmHek^7y>*s~=HAYU zd`0#=Swjw4HO~u8Cij+G{rn(#Z_pyCMtes^?fDszcT^Gi+&O_*)8F2CE;`T8iF`%6 zebUxAqH5JL7q~@fXFy&IfT+5hyT~m{JN?m~y%EuMLiEtc-;{hsy1fO%UR0hOkG7 W~~oRK|WQGDJ8W06slljGCd zVkbhrHXmN7hrD2}rB$tI;iYK({G4RICJj&6cp=pI@Vs*+{r0n(=PR=3ll*cdRgI1J zu2odtkbFf^T8RdjKsDM2HyPc&d2a{E%RZp-N*|t&MOPu8mCQ>;&x z$-JwGyf+908mlf~n2gLf^26k#acQvEjP`*-QG0$)qkX7{Jd&{%qbBP*aBMPvL-MgA z@?sz;M|)dzrNUWxaw;0_(Hk$K>Xs5*(bY-k (Dz})V7m0*N=kU8Y`&s;UaixQh!7AR1tcgTV#1u zp$~2{QePQ*cJ-i7cA5 YZUgQqA>< zWy@{mgq|xxAG3xZby8n;)xw5;9Q3&ps$*4V7N!}iY4|fhFL}UMg=`Upibm__q~=v* z+;K4EF{m_rbj_Q0Q{yhwgFcPj;BtRF4SHX+5ALlpGNBoFgXpaRAl6BJu#-WL&A1yx z?-P1m6OEkBRTMop^rN7UCR(LShrksz?x=b5#z3Ex^@zH%8>H;`Z&E*b^kSUXqNlR0 z(&i-fP!alIL`c;D8!1_YzM-GCOULKVnAVA?j5|sSf=r}+4z^|K2hm%@Ue`V+FN`sn z&PmO#A4cyD1qr$V-$T*DdTeUm80awxu(IF|Dd1!};$ln797N9sovv#ZQY^Y~>8u8P zstCO^U`dye%fORa KkS^nWkwiOJ^9pH{J@XG<>#Y*SVoqb2kS1oM9=btFLD%+fId=nl}o1HUb!RQt!fK z27GJ@T7&4Fv8Y?i5ZT9~jnk;v^`oGVh9X*>h9Am?Z@78$#z1c=_s`OK^Ek$)=1qUV zw_-q)g;y3~GV%J_lCdia+S;VCA;qXdPt@l6>7y4gQMqt2TBf3ryXM0m2R)nUkaXxR zPiA?u=ExmJzipZ5Rcf9U+gv)+cjRtcCZgBP^-d;}pw-ec2hfLY%S6yEd4twVGw!Bt z*N5CP(TbqTk!wS%zPTy-P!al&J80>;YS>sde8X+P9|Jw2VHT&7dV#Xb)$@$hJg5l0 z-L_Uxsd-YkjnbUz>up8oy&YW1vUM4ONs<&t*$6papG5 zK`*(X3hAWYO3}z2G&OG&^ue%T&`G_xqNy59%^L+hCF72itrfg;&5=8Gmrl$r6G6MC zt@nO1b3L`7?I8MGWX+%o-}vC0T|Wc#(MYoHbW$JvWbArsYTgifCL`AB!Z!gzv+HMo zUUK0T=+I+P^m(bEHsFtdJ{Vxs^}`Q2d4D44sd@8;(C3w`0fP=b$H|~?>(>vXXA^{U zk-PMwl+^HZCyIuC1oX~$wo&EM2@XrTbY_KKDncLgnzo>mdXGg1eBVki#y~G*oW-EZ z(g~qxrR}ZIx0<_Q^pdM@f+{07#G;k9w;J$UFP&lZA+Kqxi`+#hy4cyQH2hk!bOg35 zSp#~NBR8T<#-#(TZ{8sK?Ml|Vb?zdS4cbDR>qkNFbM=i9J^RV5ZrSGgLG*bgYerIe z^P=@dt8b|F%^L+hZx=CF8Fx`)TitTv-n@+7<-#i^dKZgIeQT6D4*Hl2uXJ{O4A7dV zP28K8&~I0=Rz~h(#MT*m2I#FxGrej76ar{Ha&L;>kA?oj){h$w7EikK%MZ`a`sL>E zyOaKhpHG&j%XPo^{dUv$dtJW=@BE*3dGsfDWIOooxc}i`u{+?-?o1zlWBz>kX|? &{?(IrcJ{@=P;C27%?BdF6 z^5FdZWOdZ_>8D@57?SXD=pI)y{US9s(-_rY-4!!blK5Ti~{U=>AI}5IU{(867 zI&JpyX}|4;%SZdg`43*Cn?C$?d9v&_%fumn`tazk+}FXAZhidt(c#a}GMnw6yY0WE zxA@uX(?6E!&H(NK?EXJkT=`=6