From cae73e3c02ad1c53f8e2239dd168e538dfcc4e7b Mon Sep 17 00:00:00 2001 From: Geeta Mandakini Ayyalasomayajula <45559635+gmandakini@users.noreply.github.com> Date: Mon, 8 Jul 2019 11:03:22 +0100 Subject: [PATCH] [C310199][C310142]- empty form , required data and invalid form data validations (#4900) * C310199, C310142, empty form validations, Form validations with required field and invalid data.Added a new form to candidatebaseapp, 'FormToTestValidations' * using BrowserActions --- .../task-form-cloud-component.e2e.ts | 75 +++++++++++++++++- e2e/resources/activiti7/candidatebaseapp.zip | Bin 9206 -> 11154 bytes .../core/actions/identity/tasks.service.ts | 19 +++++ .../pages/task-form-cloud-component.page.ts | 33 ++++++++ 4 files changed, 124 insertions(+), 3 deletions(-) diff --git a/e2e/process-services-cloud/task-form-cloud-component.e2e.ts b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts index 3a391b755b..55200764bd 100644 --- a/e2e/process-services-cloud/task-form-cloud-component.e2e.ts +++ b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts @@ -17,8 +17,18 @@ import { browser } from 'protractor'; import { - AppListCloudPage, StringUtil, ApiService, LoginSSOPage, TasksService, QueryService, - ProcessDefinitionsService, ProcessInstancesService, SettingsPage, TaskHeaderCloudPage, TaskFormCloudComponent + AppListCloudPage, + StringUtil, + ApiService, + LoginSSOPage, + TasksService, + QueryService, + ProcessDefinitionsService, + ProcessInstancesService, + SettingsPage, + TaskHeaderCloudPage, + TaskFormCloudComponent, + Widget } from '@alfresco/adf-testing'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; @@ -34,13 +44,15 @@ describe('Task form cloud component', () => { const taskHeaderCloudPage = new TaskHeaderCloudPage(); const taskFormCloudComponent = new TaskFormCloudComponent(); const settingsPage = new SettingsPage(); + const widget = new Widget(); + const formToTestValidationsKey = 'form-49904910-603c-48e9-8c8c-1d442c0fa524'; let tasksService: TasksService; let processDefinitionService: ProcessDefinitionsService; let processInstancesService: ProcessInstancesService; let queryService: QueryService; - let completedTask, createdTask, assigneeTask, toBeCompletedTask, completedProcess, claimedTask; + let completedTask, createdTask, assigneeTask, toBeCompletedTask, completedProcess, claimedTask, formValidationsTask; const candidateBaseApp = resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name; const completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(); @@ -55,6 +67,9 @@ describe('Task form cloud component', () => { assigneeTask = await tasksService.createStandaloneTask(StringUtil.generateRandomString(), candidateBaseApp); await tasksService.claimTask(assigneeTask.entry.id, candidateBaseApp); + formValidationsTask = await tasksService.createStandaloneTaskWithForm(StringUtil.generateRandomString(), candidateBaseApp, formToTestValidationsKey); + await tasksService.claimTask(formValidationsTask.entry.id, candidateBaseApp); + toBeCompletedTask = await tasksService.createStandaloneTask(StringUtil.generateRandomString(), candidateBaseApp); await tasksService.claimTask(toBeCompletedTask.entry.id, candidateBaseApp); @@ -89,6 +104,60 @@ describe('Task form cloud component', () => { expect(taskFormCloudComponent.getReleaseButtonText()).toBe('RELEASE'); }); + it('[C310142] Empty content is displayed when having a task without form', async () => { + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.goToApp(candidateBaseApp); + tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(assigneeTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().selectRow(assigneeTask.entry.name); + taskFormCloudComponent.checkFormIsNotDisplayed(); + expect(taskFormCloudComponent.getFormTitle()).toBe(assigneeTask.entry.name); + taskFormCloudComponent.checkFormContentIsEmpty(); + expect(taskFormCloudComponent.getEmptyFormContentTitle()).toBe(`No form available`); + expect(taskFormCloudComponent.getEmptyFormContentSubtitle()).toBe(`Attach a form that can be viewed later`); + }); + + it('[C310199] Should not be able to complete a task when required field is empty or invalid data is added to a field', async () => { + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.goToApp(candidateBaseApp); + tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(formValidationsTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().selectRow(formValidationsTask.entry.name); + taskFormCloudComponent.checkFormIsDisplayed(); + taskFormCloudComponent.formFields().checkFormIsDisplayed(); + taskFormCloudComponent.formFields().checkWidgetIsVisible('Text0tma8h'); + taskFormCloudComponent.formFields().checkWidgetIsVisible('Date0m1moq'); + taskFormCloudComponent.formFields().checkWidgetIsVisible('Number0klykr'); + taskFormCloudComponent.formFields().checkWidgetIsVisible('Amount0mtp1h'); + + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(false); + widget.textWidget().setValue('Text0tma8h', 'Some random text'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(true); + + widget.dateWidget().setDateInput('Date0m1moq', 'invalid date'); + widget.dateWidget().clickOutsideWidget('Date0m1moq'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(false); + + widget.dateWidget().setDateInput('Date0m1moq', '20-10-2018'); + widget.dateWidget().clickOutsideWidget('Date0m1moq'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(true); + + widget.numberWidget().setFieldValue('Number0klykr', 'invalid number'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(false); + + widget.numberWidget().setFieldValue('Number0klykr', '26'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(true); + + widget.amountWidget().setFieldValue('Amount0mtp1h', 'invalid amount'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(false); + + widget.amountWidget().setFieldValue('Amount0mtp1h', '660'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(true); + + }); + describe('Complete task - cloud directive', () => { beforeEach((done) => { diff --git a/e2e/resources/activiti7/candidatebaseapp.zip b/e2e/resources/activiti7/candidatebaseapp.zip index 5df5689ba428776b1047e36b78c0eb31b04c2557..1f8e86b76cb308ade5b3543dda5dc1b4d6ef5b69 100644 GIT binary patch delta 8459 zcma)h1z1#T*EZcbbceK*Gzf|`Lzi@S#~?5u3|-Pgmo!LsBTA<_H#e?ic8r9ZERHqL?l8uG&D50Vu!7GY!=8cMi)1p^iM|p ztOWUm=|T0S)&pFIQ9=aYdEys65Kk#2yjW;bwH`w{7_4~XKm=nsd-~TyiVOLhpZjK->8Q7<$v!*4;{iUgct%a$(t+Nw|(+=e9 z)S;>LW|153jw?@=!l44%*OC-0=J=c?R~3kB?voil6Q)fb7996;r6x;?)kk+%{q4C` z0r)t&Pb6X%d`9&&7M=s1)w=hTLGw{E#GH*|i0AQ;sKU;?WEL?d`;>G?$y7TlhORZo zhy@+M^dl_|cFlBtpw3B^~=kr-6t*=cY)yJg4O~S}zUv&`W8PJN-b) zxlW-M($K`(iu7LgBu7kkYomffi&wZbH6zxJF=vetZrM2!qj53IaQ6MgNz%`QAvpkr zMf=eVAC26f3zeBi*u#cH13myS!|GZ94^Q=H=}0WmL7 zKJ^#zM84sTol$35Vh5Xbv5mzx^%d+VCD;Lw_GxWLpDNew9dVqhu4Xr}8QxE8+iBc# zA9&#mA{OgVt3pviY_GoKJ}eupxvrWOcsRH(NdHw%tm&bhr zQgdmc=EHWnSLI0(ye&@Y>$BgC&?~vpC6V_wPaH`K@EERlMHqRV2epC zgfpj`a|e-RM_rC$+h@Ks(abl=Q~DYPn~(|vc@X=sz-l&A9c?HQS*mKN9Ng2F*Zc|r zY9GF#lH3fcQY7$>0rKKDgnM>wNX6KwQA0ki+UBc;xEnKO?P@&|dr2gsO?AGFz@^qN zK&FTnfkF6DSP=1m9hD8>5ozh!W_acpsWb94M-<^Q3XnsF;o;&+kDZyW`I57W;0)rW znrNZGEfJMR$+$$=+reRzfD%6FV(b!={uxw`5}W<3eWKnkxfs5Q)+cF9rg#}=nV1i| z%pNRLx0pt;Z1P0VWW7;z+II91tT2Zr_+%VkUKi`T*hV}ievmU*&tl4v?#Mr84v!FP zG=*~b6v0A!B?W>mOaXy2t-bgP+Jh|KR68FTrCbL}+z0NqNp&V;t~&X23JQs`%D}x+ z^5y8rxm16B)M8VzpK|CQ{M2>RZCyWRYNYlpLKWN)&Mn)uS3sC$>jHVH!*yem{8D4F zJs-y@oZkntG1oNA?;9U7g<^mWXCf$6JIh&fBGlP>g$GY!e;EF-O2cdU9FqpgMw_1D4L3Ln zgB$D4T#QaT-&$?|-1+tk!qn-V%?Ai@aP=7f#y~5&48%r4@}Oa_rO5ANEqiE?oB@tN zD1__trVlhtm`;e4?vSD;+*@_bVVvb~w}>x6TL?=TEO}oU-B7^c9@iORZ-3MNwhCNH zzp;Q68O+F|^0S5fTf8vvbKVE9#*7{xoTU=?YBL}mCrQ#N;=_I-Vrk9e2?Jx)-+)B_ zhee?g7*Y@|vIbtmLq%(cx%oz3Uywwzcq4%2W8U2b1%jHY{mkK~uN3m128Eeh40esV z@>@=ESRXy1DzO??CCU-HM8iheKbxwU)v5|3@x^^DA>a2xaUE+2#V*w{BL4uK-L%1C z(`%bkhg9vy+W{Hp=;n)Rv^=BNa$m9{Uys3pTBfIDR$KI(EBIJaNP;CXdQW z=r_oz2@CK`4j2iUHPVYkCKJFH@nlHK^{q<`@QF1UhmrUGHwm>Hd2(~=7dBdBdbkvD zRMQgNrpA&*d$xY4KMdP8TR(efg`DCc5}jPbBc~=CIHgCY_>+*i?YtINAfXLz zCgi&3qv%8&4PMyv7UG>THC|=czD5o@N3Vfs2l!Q@@FMC@xS=oJ^rn{%cy`54QLae` zH^%Ldkh={7;Y*rMcwr)EY_4aCgkI=z=xdH2GtibkZMKi7W~_aBy=v%Ng7JogHPm?R zxX$pUzs^#zPKpq4=JlBm)(-Ye-^47D=hw`_&liyVql2q2Uk|h{B3{gQW#;L~T5dxy zDH=|`7MNAI%`|3x!bdJlB^{&N_@c}K*^_l}kI5){+mFYn@0Z@ha)IPB`x;z&cO8=# z_EhjB&|48b0EupO_q6o-X1ixtLRbe!bFn_Mct*UzA?W#u!n?XTrVGau*@ab(2&>>_ zy<2*jxsu*BC8aOBuPkxue&D)&)jWO)iCNx%b|6wIvg$=;&h?qIs3Qx=#QLqSBd&tG zXK;co0{u8`3FHGhKU|n_7Dt_L=n0#T9toM@rLS7t+KFe}%CTL%<F@LA~UNw|x5y zuO;xdziBCzc(n1>;Hw|~^=iA(k1U#d_y;JsD!RI#!f=U*^$#vl{t76epRg4mj4ulC zefazGqwfNd1wtiFHMl4EZrgI2z`SW`RDogWUJ5a8#CjWQb_YH4*_q=*e1!%0G6^-P zmNJQtuvDKZR`5SRN;#=y&zg{Ja67Cm{w`ULiB9bokaP6pb#+ZCs4sTSHuN4n?5x{ z{fNVDW@?7U4bVNqXMSGGpklp%1UFO4j?u}*&3`R`D zUyrl_s^Aw;zYp|^(_IZ0d=`1Gpbe*-hrkX}L&fe(mU|))3zV@G>tvBAtOCx@1A2SnD4>iH!OaSi z?=DIt=1SfjfHBk-#x**nmsQ|*F1S-Jq@?+Ee|XAM{}@3-$CgklSx)MdN4@};kQ~st zILbbA4E^A0svw;^v=ULD&Nh|^A&qDa>1Ovc?G7TMFq=+%CgP$0qq+kEBTd>4Y?`pW z_xmEPzc{l8H{Dc3gtwj`;w?=G-^jRMfPk$;?|A~gn^;AQhVYHpE<>A}Yw^*5DI2)OTHpJHZ!jNlz%BwV+JIrR=nu~P z71<6EQ$X+VnIJE4x@ZZdj!)+p-@VM;n{9S7--Ks@*y$t!Omc0T+j54ln0P^PmgECr z%d|4^ImVyM5!}Qg6pD!_?B(e6U!IO+wU#E618HI>)2TNPpN&Zib!eH^n-7buli?Tr zw30tjc9}ThoOGGyij8Au+YS{t?08j0vwe&FU|)tc3CP(82Gsb!dGtRt+6oYbVv=A% zTrkl}rbB>_CpZ@x)mP&p!c3Bc=0CH3yLu|%D$i0_zu;S!1+w}S6)Q_-;0$fJz-TdH zrCIRnuH#r!1CqstT~2LQ5G>5)m%)cHZYt8t=?tuy*;Eyb+*G#BJCNG~1Sds3q*3C1 zc-z`M5y!6DJ;vRR{i2yQe8%>ik;_gX0!m7lqGO(KkBe|8FaR6eoDA#ulsf02WO%4t ztv2CJA2(`x-2lKT&Q58*@KqFqoI23v{E4GzWt^X;ytUhmT&nyLPbz?#gdtSHF3d4G zNY&FTX8X!p>C>Z8GO2Ibwf)8YvC#M{e%Y;IZ4glqy zs7h1ea*l7gbh^~71Li&qH^^!y^ADWzbphNf-45Zzn{y^613pc9>Wvlp1 z`3tlia^57F<4ZoJ_sU3=^8&<;UBaujq&m>CG3b`#KRQEj7Z?en9^T#}YMy4LS!o2V zQe!W5TL*po?%n0L8bj}K32Q3;ej+7{7f zR8On;Ku@S>UAnH4R0h{*nYmKs+noZm>GBF1F9cfAr$qQqNfIz^TOEB=Mln@b$6l)y zVEFjvGgE`W^o;g`3)`aWV-%-7ejOq%q# zZXV|_nWkjM$p)1JSKEtK>oP;`N@qLd^uVKJxaxV7%2t?>^s^Y^{7w?`JHKn1^G?vA z8uqc_U4{K_eHX+Nn}D1KlCit>jVFoa_LgC*gmiW_&M=uLlcw|nb@UK;fSYsnbtUAh z-Y9V26DSb0uQ-V@h6kp;TL&L0s+9PNylWY|E zz-OLk;uu*&&$CZ%h6)#hd_duY-ty7h6gYi6Zf0Y0tss256kJUSmBA8AS`GhnA!e;Il1>`fVMwAo_6g{1iqB!qPeiPP#n zdxGq0;JpTksrl<}44<9bH?Y1M_&wku0r}!Mh@U^WAX;vRQF;!17@reu}@vWuOoQD60=vr~x>lst+$9Ay%}+$MzQAg!W2}jWW9uAX+7;QjBEFxc)P;j#V*&Nn_ko>1^Db3s0 z()U|=w}XeAtg}TSn1U;YWMcV|xf8`DJjX(%&A47DiR!+*9_0UdRH^8?h|HJN9?G2fIQFywT-w{NL+kfXPakAh+^cHsR8D?rx%a zE5p3j439tZMC}){iE~~K4gF}U74oMu=Zlh`kJ2S;2LQyjn z?OoZabri1aIcO$CJF;XgUy2m@2_q2Ce2e$?n9VyEX`O3~eF`Ck&Z<`q0XR64pQ>LT zrAbN-HsjPTbk$?jI;9*at9fqGF1m1|2e_wB)ZgAAkWf@Gf& zBQjg&vX*s+mWqK5$LA$q(`i(7=Tk;slalPa;C1@;O+Z#}H@F@)lIeuRLUu$rINm?# z{ohs4e>M_ci15QEA$`pAiXDvLx>3)*XenViA2~R(;1gcVKSu&d1a{>5A66N{ygMV5C^t=IUb(&!M&o>ByCs%; zHUOOSxfGx7Ip;7zUj$IPYF`jW^rHl`9N8#Ku_*)2lnOo^eOu~uX_Nr))%iD@1>#!v zF^|zO4jk3XQmq zNE6jJp{EzXTTL#JoU0KyH_mL#PK61k&yJn)tpO}5_8qPd;YRW3L!BGq*YyUTG$UDv z7jMpc=x=50>2*mvJW&{;cRI@a$jso7{Uwu)qwg^qFw`28df*gbA#bE96C+(v{-eD^ zIlhwB_)04IZ8d~?cf$nl+g+vLW<|AJzl&i%zZD#)`>d6BOE_6pr19C;jJ74Mnp*!` zWRm0BY5P}cdNheQPt%|@YNmxOzwT@Q$Jpba`4vBxv9xBR_=>ScqH`ASVo@4 zzDl*CH$pC9`XDW z>Kr4STML^lgsm znar2>X$^yV6j&7kYwoXI9I?)a2YbT<#{e(U@aB*nt(%Ln!}gZ+;q6*z-wWnZM5y&z zn)cb^Q-VjBxe!i|kwu!R`RMmwu(UH9ycF~&xFwRmyZeBSL+}WK7~5$hQ1yxLGPQyt zw5zr0+`CI~33r6wK*?F>5~=k2&-F(MX!m^;Gn6R`xRfRX3^*p6iX>jY%vT}tifrBB z2%<{7$e{d%}aY(M82nOAFaIDMaYnlx+f9DCsRbPkKNd5rd2+Oc>zLNGd8k{r|5 zwof``arz(5V_QZ|+kOLOOO0wvnkR$@?_uExz6`10aV z)H*aXx+Bf2S#Ql8&~*L9QW(SH#8jhMmI^$HnAc+X&f~SDm(O}U&1Qk7em#YOZU2kDcG_pUQ5Qz*` zp<(`2R{+ych`d65NL`%GEkPhl5G+#p)6n0WSpt8ksX~SNqp(2lvGJfZ^nX3`_p1Ms zKZKLeV8Xmm9J;>*f3L{1{vo)E35}-}M1Sz$SFI8{K}&>Cfd%`K0@_SR^2@dV6b#|u zxc<2N1Q&XOPXtw=WBH}wS49QtPe+6>g!lI!SWrFMzqDjn|EHS4`G*!HLYOf3KVJQw z0sd+1;)5V9)SjM1`oZAeQ>uqJ?mq_x>F;y=_iX=nq6o#Mr~I{~evcLZwC&)3r|GwB z?cZvz3Gy;a3rN$N=h1~6r>vuDcypAwD2SM zzW4P0dyGBSj&IF1*Vy};-<&h?@rfd?rYbTD2?zrN1N6jxHUSp`3}SWi-~=ufKCUR( z+ij-%Sk}-cJtYU(1!M`n&kqtnyA3~ZKkJn(Omndmo!5mCZ#yzLdQU0rEkf{r>Z9b6 zsTFqE?bwy%1z~*bK>dJBS^d;-s$cp%{bu_8xl?s{?8_!aQH(LVgmoKf(mnVEfuL%#cJA4&Zabqj6zxD-ezLOS=^ec=ok{qSQ+Uc5a{6c z{L}Mq{K&T(sMSQ41OK{!Ya)}^R-%p~-Q5JE3*C*a=&C>`1A)Rm-%cV-_Ak#_iWI>U z6y%t`JY*y_0o)fU+lOs_Qq*4P%-tkhYg~0&uAA>jR1DY)C<~;0YdX`f1LPvMb1+3A z*-8};7c0lT_0vrZUj)(g!N)>(Tf1aZNQ_;sof=5muw71q_+w_TDLF_r#3u3dVn&Zv z6yF6PX{u7AV-SqJYzVsDK-#}I0nfwG1fc2R7$p-j#VU2OcK3eZQqDeVC1QV>3BLSM zo7u?H4$0ZO?>W?TN^`j?bK{frAO_!%Cvh}r%adljoy00~#LMKp_@aKUw?ykE^OXW* z3EYj-kz;Sdma&oGz@5^sp8P4ZJklZA+-6aYp3Y&|g?3}?XfI+v|9f}2@Mv@b8Q_G_ z6&Q9gy!>H$h(eqJeyRBhDa@-&=2@)(g|xb4=!i!6f@X$ymUir`;YgYtbN9F2;Lxv& zw)t8i?z1eko0ClQLZm*{w8vXu4XvJOkt`5Z3d5(KIUM6PR4YEyh$oJ3r)!@T2eRiO zL(B%~q0#zyU(p_D6v*V=0w}&4L4-kzVNcg=WFdX#vSze?hies zeW6h?>XF^ESLxrP9%%qGXG;WvsC2hrd{jFK<)Bjkhkfegfo8IfG33Ie%j&TuQ~6k# z`9&2Q97yNMSts|m1F(ecteY#@IZH*T=Pg*}2b6fCh_ytB3mbd5_VPL$HZ7>K_hxIQW ztHbxO<$)(yXl;TL(-Yj%`Z(y1mtAel&tBw8ycbGKBMuHhTCV2q<(gw^G45B-5vb7o zOSlcyZmaB-noTpw#Dq=n1 z5UN5@AXiBBor8b56RLkv=XJ}*n7_%b6;j%|r+#X29LlU7JSQ^yRVFXtfp0W^@LVb2+75c8RG@CN_%22DO|n z9vjhvWt2Zb)s}Gje742=i8Q8<#GO8BeTg2|w8k{~>3MZf@-*C*!l8ePJ^&}2`Q575 zJq4;(;L2cxtBdDHO2jD2Fry4rE|)AxSMnM#lxPyle>fEDNZ~5uY^5y6TH|%{`HcwL zX<`pl@;X(JVnS(gr-0c2cg%l2*JBi#?Q}r%0wEein72d}=G-^f&Z!(kO6nP7*<4xn zAx2AZ0}F!7=qpE9g|c+NRXBkx%7e|bvJ!p(9GXB>$a2n6!Z@P6APTKS0@1vEaxU2} zaVosll=qE&p5LfwH7iq@(?M-?htuOL;%4hbsh-5;BI1Z`hJFl8%>+5M=$Uku&+C!) z$sWVHS0YGE3|*US1r3pmt!(PQ_UkvJFm@MueJ@5F(Auy~u)SWIfL$8-w-_#^;Eb^Y z-NvXFO;l>Q_VQ(>}ok|4b>MI+q zH<;wv&%!dM-wq-s%eIL_YQntbtMU4PK61h5D_i;>4c1B>#EcoRRCsv}rMm|+pI(o} zf7v7wdL#uGQSrPIaMIew{91Q@2)q1FE02HbxWf7)jSrn@=v-ksb9pC)Sn73uM``g) zk*;`!Z>c5qRn#+;%r@RP`_1B`*8$1`%)8Ue?7TGjWFbNi)4Dt?@W#*4MNUdz0PH;h z9?#rqGo7A!(aK8A-7gBsRAJ*d7!Ua?lc&3XR5S{6KW)y<*Y|jDX4DC)hpF{U^-iDHNMQ;zqyqs zbd21G3}r{R)I`Sl4>i&M$qwMx_^QB~Nyp6b^OzpN6YTmb3cN5}lRVqA7tr|qM^@_~ zYZGuBR7b^3XX4aVI+su}HwFgo;g5dwRKjo-v!Z?kdd)LAb(s3L!K0#cWg%3-DWgN} zl)||6O3_YjUrn;e^PD)Z#!pVC_&Ve)s5>gq87yJwpfO>Y%UP78y<&^2 z-0)tAlKntj{9c_1d2E?wJJSrG)qw^3~j{z-2{T>e!>m&wYkT&BHd9Vt4X&?T8G8cR(y z&4F+L@}!b7vWSvs?}_XQW`TP>6d)v($Uaq_hOsmMJZSE=Mk(YDY{fpdYjPf>aSW&b zU&e}VNd_KaECX3u#&lL00@0T67q40 zFrCbsgpbqiG!G-`J*OqP9RXvQ)4&wOV)+4X;RG|5QGQY7h6qSmR^um`r4*9;j_HG) z>S(hX(HAac-g1}(C&+pwvl}0jMNVuO$Y-mcza|4_Vs-lkMVYX4PmBu|VBSSno-EsB zGx}GbKDC#8G087F9_4QtivUE<@Ffkl9L{WtFH3he@%MliwEV+P;ai&nf2j*ENMPBf zcBtcdD#sv>mkDdowcXyj9;1&ad#)|3*V<(@P2A(!kC>WHW?e1Vyl%>iuf3R9+>*2Ccilw!mAb!O48>>fKnH*J%$X$MQZX%-u$M9U;In} zf$;v!%i+7&)Nn2m61WNnHt)hYc)JS-5a7*-kNatX&2zZ)seFic$iJMU!LI2 z-;&PI%KFL~$t>JNQ}ChrP;IqCiX}o7UXrq&Fvv$U(@=JaK8uP6@&~4C_klrj)uUd@ zeM;MdK0A3gBx1t%kOqAV>?3cQK)2X}sJ z<&)5NZAKN0J!oChXZKZ3!lF%BsQf!jkfigARpnMR_j|I-@2mXBAhJ6C6*wC;?^JoK z%ZxQ&ufS>hfvGh5OHJjHy%6qq>T7SvJl}C9cSRALPFhX)z;gCWY`67$cyw6x1EIAq%evAF~dD*nMz()A1b=;WC)eF1DMH`K-9;xY-=-n!YDw#jo z#vIFbAs-NUkIn}pzDHdVmV749m)|*6H2A=Ofq${+0XXz`T~=OCJ;Z4p{m>GQ8a?yK z-P6mKorpdotZv{h7fgJ8mF}y*3Z-nnO{)N4BdbeV1n#i*_6x2Zs7Hq@Y7?Y+QTJH? zB*(5pvT9CPk9b3ve{op(JGS-o^^z5Er=DeaXuLDG1U1(gDfgG-idR6Gd#skF@tYD@^+K6!1EUN{y6TI6Bl&nvG?v<9o50%Z_hcao7 zgl!21y&<3U=v_8hWRS0-U}Zb*BAFXacyzQsofeX_(|CE?dTTL1>xSvEWjh>DesU0E zX05N&v28bvnUea4s#F-egPmIew_HuWJ^v`7ZzBjbJeC6;Uc*TX&!WWznuIXHoF2Jl zllAk@XKxA0md2v@xv*O2>;AMLFH5_&bc<7c8o%4nfT@Xd?ZA2;I}C;VT=SuCc&RiU z8Q~B-_u|5}_gLi>gNIW zKIyhzy@&QBjcml({Djm4;PF>!EqMo+BC#){wLV(ZgjN;V2wDf#l|o-x$jh&WDn>UC zzuuXEk#6ls4j&Q&da_CMbr^n9&er9m3ahqp=3+BA3{!?escDrCjS1Fo@`K(F&Xbg3 z!nh+_UuwS{w0!PovTL32s=Cm*C;EFNSpq@zzD_8_?`?GRDs|p+lErcn-s-5{SV5E8 z;I?@Z32S@`QVr&TR&6ZGizBmYN7)_I=VP7ynmL>WC1nHwfNbk*@w=pMbl*}hdIN-d znazh;w}x-9Ij6^E+l;X-y68UU1TOkcMUtmqy&PYaI%Y@9mA#tmPa;e5T=3 z_-6Q6Rg!6x)xOy;O9%GtU`t(Via2O|$eNG7AEM`WQ(tlv3E}w4Vi~n-cb#9~PWWie zQUpdjzRZ5|4ydLH$^4=@vx%$hpRyKpe0qO0scQctx5b%)D%z}WEZ%fgA>Q~6zUawZ zOTPKyJbCQO4CeK`Fq>A5T~UabEa%eq@eoEaGiM-3&oT&cvP|ac_Zi{vE`ZvdWS(ly z#a)rV*eA-OsV+{*Q6?_&y=2m{>9J=ox$-yhmxHwnnH-mwi9gLJp91=de;2LTEOu$c z$RNy#ox=KoPZhp~^$1rsR{E5x)+>N_i#sC^UoM8)Jv~eO!LGzy=$C}M?|9wS28O= zmBR55Nn$)>hjSfs(fwcQ`y>GoF&(e+cl8R(z!~u&xutX5|D$v^qY%(`tGcgwNc?YA zH-J4gUXCOQwweiGnIma&V1bcFrL4(;_C zjSeHH&tR?NETkaWVJ9@yZXQ~j_AMM^3olp4dcBdNStqA3x*k88YdvzVCRK6@v0Y@= zl;8N54Q&}Hjl2%L%YfMLdo3)ck!Z(H{ux%G zp%3+ugUPy*y)iJ7#EVr5jp6MhXnkA~E~QOr6HG2rBxNhSJRMUj>Ls(R0pjoXSf-_z zuO<-S9=;c8YBE2*QCYmkF=Alt%{UC-KORJ13yG^xwFzUJEKcz%5<5xX#7NV`e}lX? z!a9;ykP?&NiV95(81zoSWX9Xd$M;Jy}F}CDYGsmZ*n4;#dam#Wt5bBP8{7ns3UX zzof{2<(V*93NxpyjxbweuvIC7soh zidOAKwtCuP#rx=}WJ=j-{ zTk}^sEO^l)XI&_A9YIBP6Oa==wN_j#E+M+s)hO}JY@@`q$|%kIrkUbB&BSn;%fSo5 z4`=AV@@d1u5Ei0aN+a&%8VO7S`fo2>{jS#x$7U53x=pWd`(q}^){;fcF3cGK+djC z=9X@5mjBPP`tL1d!QW-HfvJOx6I@$1E}0v(P7Ap>{d!Wl?N;SV5?y9syo z3j7&_6r7It&kG#52s`=RlD}0Apa*{}IZ1d6=K1dieow0Y