From 0d8acbbff7e212c89619187028f3c8f06ac6b430 Mon Sep 17 00:00:00 2001 From: Timothee Cezard Date: Tue, 12 Sep 2023 14:51:53 +0100 Subject: [PATCH] Fix from submission (#168) * Ensure unique analysis when writing to spreadsheet * Fix link retrieval from upload single file to ENA * Fix validation of date in metadata * Update the reference assembly in the metadata spreadsheet before brokering --- .../ENA_submission/upload_to_ENA.py | 4 +- eva_submission/eload_submission.py | 14 ++++--- eva_submission/xlsx/xlsx_validation.py | 16 +++++++- tests/resources/metadata_2_analysis.xlsx | Bin 40874 -> 40596 bytes tests/test_eload_brokering.py | 36 +++++++++++------- tests/test_upload_to_ENA.py | 2 +- tests/test_xlsx_validation.py | 20 ++++++++++ 7 files changed, 69 insertions(+), 23 deletions(-) diff --git a/eva_submission/ENA_submission/upload_to_ENA.py b/eva_submission/ENA_submission/upload_to_ENA.py index b81fe541..7f35b859 100644 --- a/eva_submission/ENA_submission/upload_to_ENA.py +++ b/eva_submission/ENA_submission/upload_to_ENA.py @@ -129,8 +129,8 @@ def upload_xml_files_to_ena(self, dry_ena_upload=False): response = self._post_xml_file_to_ena(cfg.query('ena', 'submit_async'), file_dict) if response.status_code == 200: json_data = response.json() - if 'links' in json_data: - xml_link = [link_dict['href'] for link_dict in json_data['links'] if link_dict['rel'] == 'poll-xml'][0] + if '_links' in json_data: + xml_link = [link_dict['href'] for link_dict in json_data['_links'] if link_dict['rel'] == 'poll-xml'][0] self.results['submissionId'] = json_data['submissionId'] self.results['poll-links'] = xml_link self.monitor_results() diff --git a/eva_submission/eload_submission.py b/eva_submission/eload_submission.py index c58b6cd3..141d4f39 100755 --- a/eva_submission/eload_submission.py +++ b/eva_submission/eload_submission.py @@ -122,6 +122,7 @@ def update_metadata_spreadsheet(self, input_spreadsheet, output_spreadsheet=None 'Sample Accession': self.eload_cfg['brokering']['Biosamples']['Samples'][sample_row.get('Sample Name')] }) else: + sample_row['Analysis Alias'] = self._unique_alias(sample_row['Analysis Alias']) sample_rows.append(sample_row) file_rows = [] @@ -131,7 +132,7 @@ def update_metadata_spreadsheet(self, input_spreadsheet, output_spreadsheet=None vcf_file_info = self.eload_cfg['brokering']['analyses'][analysis]['vcf_files'][vcf_file_name] # Add the vcf file file_rows.append({ - 'Analysis Alias': analysis, + 'Analysis Alias': self._unique_alias(analysis), 'File Name': self.eload + '/' + os.path.basename(vcf_file_name), 'File Type': 'vcf', 'MD5': vcf_file_info['md5'] @@ -139,7 +140,7 @@ def update_metadata_spreadsheet(self, input_spreadsheet, output_spreadsheet=None # Add the index file file_rows.append({ - 'Analysis Alias': analysis, + 'Analysis Alias': self._unique_alias(analysis), 'File Name': self.eload + '/' + os.path.basename(vcf_file_info['csi']), 'File Type': 'csi', 'MD5': vcf_file_info['csi_md5'] @@ -154,9 +155,12 @@ def update_metadata_spreadsheet(self, input_spreadsheet, output_spreadsheet=None analysis_rows = reader.analysis for analysis_row in analysis_rows: - if self.eload not in analysis_row['Analysis Alias']: - # Add the eload id to ensure that the analysis alias is unique - analysis_row['Analysis Alias'] = self._unique_alias(analysis_row['Analysis Alias']) + # Add the eload id to ensure that the analysis alias is unique + analysis_row['Analysis Alias'] = self._unique_alias(analysis_row['Analysis Alias']) + # Ensure that the reference used in the brokering is the same as the one used during validation + analysis_row['Reference'] = self.eload_cfg.query( + 'brokering', 'analyses', analysis_row['Analysis Alias'], 'assembly_accession' + ) if output_spreadsheet: eva_xls_writer = EvaXlsxWriter(input_spreadsheet, output_spreadsheet) diff --git a/eva_submission/xlsx/xlsx_validation.py b/eva_submission/xlsx/xlsx_validation.py index a6aae6c5..ad4b38cc 100644 --- a/eva_submission/xlsx/xlsx_validation.py +++ b/eva_submission/xlsx/xlsx_validation.py @@ -1,5 +1,5 @@ import os -from datetime import datetime +import datetime import yaml from cerberus import Validator @@ -153,8 +153,20 @@ def check_date(self, row, key, required=True): if required and key not in row: self.error_list.append(f'In row {row.get("row_num")}, {key} is required and missing') return - if key in row and (isinstance(row[key], datetime) or str(row[key]).lower() in not_provided_check_list): + if key in row and ( + isinstance(row[key], datetime.date) or + isinstance(row[key], datetime.datetime) or + self._check_date_str_format(row[key]) or + str(row[key]).lower() in not_provided_check_list + ): return self.error_list.append(f'In row {row.get("row_num")}, {key} is not a date or "not provided": ' f'it is set to "{row.get(key)}"') + def _check_date_str_format(self, d): + try: + datetime.datetime.strptime(d, "%Y-%m-%d") + return True + except ValueError: + return False + diff --git a/tests/resources/metadata_2_analysis.xlsx b/tests/resources/metadata_2_analysis.xlsx index 3e31fe0533cf95580471c3dbe083219e61463cb8..ea207f402b556c2e083be13935185ad9acd8cbac 100644 GIT binary patch delta 16145 zcma*OWmFzZvo?&o1$POM;2vCqySuwPB=`hR@Nnar;O-LK-7UC#fS|$UyJ7FM_j#W4 z{`gpHSVMPF)75p=H9cL`MQu=VEl?E>h``QR*?T2u2#EIx5D@4P5D*@A%pV; zZJ9jm?Q+x?9TvGUd<~7B{MV)~JHFE_hS7`BVjC(!TN`&<-)fCxlT>~cW0by`%zA1S zrPVNNf~_hwQq8j189s7y`{R&kX+>G{wdgZT%Lxl6tmYR6Qp)>%zn?_LW(@S035CFW zF%M=GzmE@BhMKy$nHn+z6c99WL8`VxF&JH{U)f#1%P4;`D|H)Xu=_*Fnv2W8T8P0p z_W9Toav+((DG=k=tWm)q9T!&R=0R~|A`C`03ko05;3V<5%Ol~BwEg^|L+AKJh|1XH znma=5?6lDHzW3I3gXBjfBw6Vph7bVot7C(V-+ymdovA@XqVxz>81!bZ`o2(-Mu4v4 zcQahMC?N(T=j5M?NE!Gx0`+kdSZ1T?J5vs%>7oYA_oseX_H(^En+L_U!`-5y`rU(P zltcRYY!Pf0ha6uus9v=Ol`e#3<2BMb(k1)Hc~Q!+HaP4zk5~Aw^d;jo8fioT>c;*y zW8a@>OKlFFi#~PlDctKyGp-#%1e23!5uncxG9<|>=T;+t6yeS&6T%(k-kMeJ(oWsH zFD?(z73~iBBUd|^>sU{G=h8{OAsK#cC-mA!7hM6@#8 ztj!X+c`APo9Xlb?k5g=SyW|E>vJUBXEqCF6gogPmI9|@6^ZK`dp} z?s7v1&ieOiU0Kw4m#J4AEGA2Xkv}ZyF`8g}6UBp~vobj*#@2o{Y}0s6BDRq>#z^=| ziu)?z)=zoxh<}{&2(UPB+7>|Z+HLubD#7da`+~nPT5{HDAK!A_bNG;Za-nxIimvR)6P)Y@1uF8w|YdoP`DrD?Ae8jAHB=d;iaVHIF$R}NssbeIj8MEC=cwx zM&LB2ydun}3J5z;Q9B^GIrU}5|Ju*15ij=($zls8VQFl&EtRxpegXAUc+B@I_9|xw zE@{jmu5U?^f6(ZBswO1>)=*%Cw~`OK1cjU$#2_Co#;W`^#n|N5X>Ufx$z#%|{F}?W zFOUPoJC0l?mb#ohcjL4cb$833Y->fsa$`Evp=iHgXY!ZR+s~<(EKBm5@$(Y$v)^x* z%KZRxb6~g@e#M7>GH>sR`5R`us-C}kgU7YVJ&#h^lI$MkS+ifIB_qJRmVsALEck@35wrEKL zH5#kjppyY2g{*khnkue+m4i~?fuKiqtCrl~yGabC3zt@Ik@H+nv zX=3N!Wgy>!ZmQHh2X(HQ!s|eeKNce>?PWNVeU(>cDI{m8oSkmyH1SIxWug)ERJAST znO#})F50k$eSel>A?33{(t4d1AK+#ENf7sHv0y)D6-7QPTNfnPd3g(__@^f@%|AUw zfOOFU$uU6r=Da<&!PGdxb%deXi7IYknNXF;d=PZ84kb*BSX6vNBHQHW4!H z>(2IO5qkn7&fdyIoO4aJ)7uldXzP&Ea5)_p+caw*7_+MK8x=nhq|R%p#%Ta2B(FQn zl7RChNM=O?GaZO5*@8)JeU%VdQK472)Zf?%Y;?Wz&j@*w(QR!tTBg~Ygf8e=72aSu z#Frf*PMQX*t8BDozDrLm$tAA5#W8f=ES1k8k0poe$|ms>Qw|dsPJ2S_8k$jPWt_!4 z=~OkWl+RmocQ~}; zRuPvm8SC3xVu>#i2L4QzG10bSpl6&S$U_D+e|=s&?}zC!6QGpRaSIEb@MoySi8zgH z8r`NrnH)+d$DF&vNUx6Q_DIlB_$=~Vf(#j9I|{O5OcdfG6e1;8IU(2iGE-`9+P8>X zjvr?C2?>^3v=V@&J% zf{uJ?(I4~FpZXb*t`Nl^hV5JzYo1z7LC7l9xbFgpL0e74z}w;DC>aTF7L7eG5v#OV z1e-E?<#N2OyZXL~II*9VjV3Cy736O#wtioN;USWW*97VGif#IX2K7F99 zt20;iK}a{*F|Q|aF0GTQ#8&yCN>2TCV|%LcX9y$prEiXDZ+3QvV#sQ9JmRb&Ep10+ zo!7RBnZjs>VZD&71>z>j)WIYC#JIDG5y0&8NkILQQ`T+L*<3*TQKBk~@_f;JFueeG zOL2jivSd1QQknNOKYWw9Azc#+>r!7FP6PSOKOxgKc4@Th{vN}r0`H)|a+_Uh4NWO9 zcCY^DuVi+_%zFr#=7bHayYKoo4;$->*G6HyobAnMn+k{Pq*Q{BpA(MCzeUK#$pgI0 zL+%IbtPwYOSd7WR-i$!lpnWsV7doxVbhn2dYyOdEipy!bQ701&&~hYxkF-QDWM}T~ z1u^72IANLQiLNJ$-R+ta1n4?T&9hF6W+(R4;OB!Wjt@+6ksK%N7}co4C5%pN2%l3i zKWP!Iag)Fha|xHAvh)d-Yjp!~0hmAGVzvY0VmKijZ&w`PAWx&2AS&y^s*7Z~w2X2wSss5i;vrpGa!dhNATGqT7`D91W%MZ|rCm5C-=_hm}(Yy%Kn z9JkKoB|!(-n&w;oL^h~R398>GdttJdUvY8z3SBH1LFJe?5CD||aeir7>N=x%ROt8qNvr&AIGn;C_=o9BYit!q|n4wXhqT znoH~2!#ciu+Yex8x4fyC4Ko!!NA062+D!o8ko0}p@eWB2*ny9N9EnCzO;9_>nzb~V z#K=|6ID6Wn?W`T2@Bdh6G$H;;!5U9|8%j8qV6m@M5IbFxw zMAe$aI*>^4!WCuS@DLEgI;7l|rmJ+-uXm&Sq@%u`mlP+nr5BtSaQoDIJUO(!`*5T~!4LI*mu|^x zHPQL-g~tIfk<&+3rg(bP7SH{~<8%rL114Y|M-Q4@>3rsK50+;hNB@V%6*xv5|C7fb zAbO)lSz#9xJZ3%=SwerGNL-G1!NFnnzG_@g@9D%u@Oo>W zX(xm6IFb$5(+QVY-2ZE0dO6D%L2U7_Qw(G0uhS4P|lBdmiDdx5z?Zk+$PF)y*&=AV!^D0K)wOkOX_jR2GcBRmFvm!p-PL zsWI@>r9~Pumli2?4&FzfK;NK7S*&B_?|wHyqs7p@s#gvxmwvojySp)R_a0^66_0;2 z)3ac1u*O^T**zAwsrGJj-kOwD=Z zbGnl3kzZZl8nUR)6m4Dg;R)`@7K*-0mIcwmgP{4bfvcD*7|m2&p|H;ODvI$qLyKJR z$wHm-f?fSBdqujC&hDydav^iS9vla}FuP0R#4Q2vNU#CFwoo9~BNahu?5TW37nljG z$`e#PHhqEPggI-H5>3q#{AmX;rblx8GO%o$%vmtinw6f`AgwNXa{4_2iw?6n^?S(i z_Ch+h$rm;jffE5y_e~2PkXw1=Qk5%+@(f$Qb2bSZGdmU2>7UzfHj%DLpgQckI|pwN)j|Ce0SPJ15rirX>6)_~!7UOfgFX8pj=aP4{p-1`N^Tg$1KN(>2x$cLpXZeofJxFT zYO9(X#geQ|Jzw&$Q|_l60o7$mK>>2+0nZY4mVUgt$LaC;Gy~IaE2;wH zt_<(K>ZKa-w%PBb%v91~5oil0s3J=4c@M3~?qBkr5|Ika2=8v?Pr0V15ZTl9&1Of7 zkl)jBy3lV!4!nlUH~jsV;P&o_y98x>}k5!5<&5Tu{Ag;A;D7`fO!C+IhMxvT^h! z;HzpX&)x>~ zyS_m_rEUOx&4aIf@O1;e5EWAD2ozE-uob&v^kNAZlHOjmJE?r}YedbKBwpodh8JJC& z@-@*8r2(Qo2IpOQXnN%GdX@5eRnJZce=Msn%KliCedUd3X5}nKrY8BfExvP!E$Bpi z_Z8(u*^Wio$9yCW(E5GWDgyH8?o)L!vEE&cv9~$ax-!yJbqTR~+8@gkM{7#cry7&$ zdO&5eyHEzn*1AdqZ_DWE0FojDp{cr0vEA;lxnI0meKv_gU1JdxUoJukGhqVw z5MiTXaF{46{v;>xG&$zT%eReT2m>wfA*IZc-+*8yhJ|zkC%0b#1=+iNtn!kYYdsDa zU%eaPYMm0ZQn#wOerNPP*l>M@dGfm2glk@Nyo3`RPg*Gx+0QE`*sD8n$bUPlGJf}t zM&D&b82YJ#?+xK~U(2_zzo#=l1X=|M9qZ?RExS%^@sF-SYW?j;TpHlWN4AUR*3)+E zlg4-AYugxUW6bXJ4JhU*#YA&L=O5orBR!Hg6rFWl5JT~O=O&Ub--F+iy=oSr%zrE2 z_k4?0jnkRFWNT~kPqZ6z+3nnp1=6`RBu?qjm1+ z=gC^V&XJoBhgu%xEJrmJ{y}=tE|_b?VK90+mwN=tnB$W=R4gOp6kOlH&9B2?NDr+u zEQI+cuO_vrDpUi5_FB?l@RMFc)}y(jypMAbl6Cyro=@wRc~2_IEZJm0f*~%mU1OA* zZ{<(N2TcBsps}_hV9<&AN$5(+H{^m@fvQfWGVM;aL!jK)KVYXd7d|dVIgY|^OOb7KgsCH+?80`3Hq#L+P7@j;Yd^|)tFaK+khI?tsBRrn#$a1S6qWg(l%3tI4q_- zo%+to)-s9FZ1oPJ#RRgQGOf#X-r$C*n}bGswD&^gNX(HJwfEEx>qJ^SUAE(y0(!+k z{9#AU4Z+gu`JW}&4ZffSU%la*a_%!fGCscLh?{GEtP(Rv9l^8){y6g8D>Aw}xr3)CNMLO$t;8dY2)q*#n}OzwBpY9?+Hmk>?<=87ys21cUv zNmeS-%a8o=&5L|a+y3U!EJEYjFm(mk4K1>NHTR7wRFTchk|0zcQZHtyY+Zu2oU5HV zknzbDoUCLRCA75T#=oxrShxse=Er`#o6~+Dy!^kL|EE=afYcal=TW7h>Sf{LOY8NK z*n9B-!QcmfuA5l<5t*-xO?36q6Ah`(NZx*Ke4=$iH1nwr=wC*`GgJT3vmSo#oXeNJ zL*_DXQ8Y_FckoDmqb~z@5b3Ca#;>&ucaaV6W{rySIfF~*% z2eoh4$dZdm>8U~#c4>uno^sfMIbBz+WcNmEPkH-N@c0tKJKrqR!n-V1n+iPT7bvTm z4Zabh*06_ZZRzP0i+s=1NHH-j!(c*dXry(P)#fe71-$}P9)kP8{^%_cewiK7=h=xe zkFMC2Z+&qR`v1(#m|^c2O!Xn`v!i_rT<-AGv!NW0wJ&3i1e*TxXSDlU937r>0f8R^ ziSLG$Ha7&oa0v%{DD=fc+K_x#GM5PS&+Z|!9Rg3+COrVbLua(BN6sc%hyJgNL?7+Y zD|YD;l8ycvb)L%hCB?IeOts0+$Xq7Hw5L;dU}las!^8jKtAg%!4mF4}FZh?|-{2G` zmj4Ls*^AJCxCDc?f^LfSpZ^#)D{P<7xO&HK=I!@j`3ji(LGTwW7MmBL4|P|zUcCS8 zxU&G+5hz*v`rThy`IXh1x957F`2Oj%e}=%O*2jWRi}gNrp>~=4%qJ5drAZs4t7CSwXg2>B`a_KbI%5U|7Ch?%l>7I)oMiXQmg!t zkEKTYk@^=>v%9Ee10!3Fu#BybFD|Qws?b#TdiEG+fp8WNz5WYoah$x>bK&O=)b|m= ztilT{z6iUjtx2~QO$OSHIf^m97|~k%w};D%F31TB9qps)@uX&8{cm5wd8)pBh82SZK zS#NLtW6&9fIC?KU<7@alA)>HG;K3nSfI|u#t$B+tG3=@ao{j%Kio3sJ_^(ks6d3e9 zW8p}<(BNW*i%Yq+1=m8??`>#sO0LMlFss-ed!J|7c{)pA$NjsVc@aA-k#2uL1j8$3bS$QeF zUvwmyGgpYfVvcBkUF|OV{z95n?OK-zU`K%8G~y0IYR~aLB7+3~Jh5QyFaBM8313$= z748DC!_bOk6kiPbrxo~rH@~z-{)MyWKn?wSaGlQzz!+Qddm(_-cxs#$LCBzRZ+}#}7^^|QlK%xf zKJY;PvQFdKI%UXuFr;Hh_#Mw)Xy`%f83&TEOJF#Qd;lwdf$skw4b6Ys27rz0`#;9L z3?cRJQ1J)G9seSD)Bhbo6esh4kz4e0wEYk4z?1(M_)|sWmsf)<`^ibwzLReL%I7rW zh9i@E*Rx7oB=_`&Ulzg6F#f>UPekdD*DEeW93H^6pz1O8gn@zuP_GHS`K~V1MA5~H zh;sw(Sb$gxvPA5_6^{RH?6;O#sQcOhbMP4IcZMI-BXcz)rv?;~v{H;JEO>Xg0O5I8 z0hGs02-p`F{jn&zoY2RLFvT`yAeXPQerkb#>-<{0C`*TPF6lh&s(t9*Az%06b*X9| zJ!?3PL={$^%5qV68z3OZ7Lm5A-=jMJM3Vc$$eE?CeEnCmx&y@&QuS1M9MmbrXaE^Pa7(c9FC9cr$8L$CQ8IFkx}`wB z*@BgHE1ji)siiWm2QmC*Xp=&n?JH<(O2)80bxQ`rI;E>9YQ1mi!F(Z>UNYV+Gf~v2%82J>dPN^a{72;O(j&33cj6 zNg#R_#tWB__q(s zG^S})5{R`*#VEFdrGK!oJ5&4A9M=K`D>4V( zr|8e{Ws>N%@mq9SYbj@x(G?`>z&*|CLSAAh#Fev_xPGwrtHHSeazIu0IcxNs75L<# zSV1ydTgpANP^4p+XESRV;2Z(f3+=Kv{nQHmC0*ug-t%7L=v6xMYVzt)yqK;-$+&*- zrghM(U5xIh-sodgj1`! ze2%6-Xpij-?8wJuv9m#4%BrtPvlcB805WPg$SErzY2 z*@fwg<`-x?-XcyF!9Qm^NuX#Y!s5q@6^I(+Vy*-gXhprD9idk3oUksL`Dr^M>KdI@ zjo$PnF;6i|iO>)wGo81Ey;1nGuDi~BA{XDxoO2CWY{`t8Rey{%r%Yx}q~*#gJ6YYk zkTZ&Uz>t4E{$2~!vfP6eo!65!ydirCp0QR0Ee=)_oHi2Mr6ZPi4A1J{eA#a7u}(1p zqv4e{GR7BX6t?EVll&je(d>?x41P$h)s8>+qJRD(%8mt2v*O3mUeyHR-KreaaseSQ zz-uz1#5B(V3Z$t7At%J0D}sx`<29rNQz}w!u|Gd|RjnfN0u!cP`cD!I^bgWa)Xqa3 za`+r~rhF2_s<|5o(A$13TQX@dVnfBg7x`@N>#>y}VtM^5$cBZHLK^=oW^0$ooEzEB z@_-@lNEOE*|GP!4{27eTipDSjq)-?;kk}rn`oTd%LX8p4;aJ>HWN|^?o*=8?g?gY+ z-^Hr!GGahLNZ3O_5P-hngwEh$bJH0ArlkTWtE2@Hw8R$57zhP&ij7yiA{e#{qW}0;q?gZ~4(Q{mlEw4~= zjUu~(D67aa%am>}p1j#+3;>bj5)O!x>ywOlvqT2N4{7`dJxh}tBJX4dYl=tga(myZZ#z{ z#V!0eQe1n-|F(guQpFh2Ifz5$ax~X^rgm%P zUanp$T6%k21vS!Hv8|tV4grch1Al zh>6(9z5HS%w?gwm80S)C0g;yR0@z#_YDa%?cY}7L23qP8HNNVLvQfEuX2HZQDyzW7 zmh70V!ZXtT$!+(lobcH&+d5imAPVlBT=jgFbgo6!{fHURk#A3c54F#T3x%wJ^VENdwA+;eh=Rs4`VFKE>QDg`m z7Oc3tuE{S>1I!gO!Q}XOf@2j6*iuL0LcOV~Y1D>yT;B_Iu^DA2RU%!EddmVR@DOxWuaf`V za)q#RaF}x|;rJH(F+Zx5gp(c&IVvq_f%QOLBYa=QloaC_*9z%#;dpmu4}AMo6gwkE zg8P}beF0fWtAkrV@yi9t@TR!d$QvxO`P z*`)Y(7&C^(pMxt6w`Re1gd>2oBH|W@&J>X#og&AQJLv$vy#2LdGy2M z6Phw76BS(NdH$+I;F>5VdhRn%t>{j|H*R`zgdcK3iMpFqzz7qOtp3I(gN{;0qlw*k zvuD0phRgQ`EN3F^v|IKp|7V$2&?vI}?&WFiaUe z%(?zZiSQtE;y3-)#L%*7`)6iapWxMZ22oUEwsMlgU=nQJ)ae(yCBR+0e{_f&*SZ(= z)P~w=f8x2d0exdT#l?3xOhlDHBeSo*_GMn_+#oa2=v$dAeT3X=wta-uYterMWz(s% zud^cx9xVmq0K)?f*A&)tkiY3%_=)1C`VC=^|6F^fMMlch-hQh#&KdRf-b#zry zixz}Qnu45`zOiFBQwSX(l`oB)qxIW1gCA2WN*XpnZbdK=r$4%Z{cHN;?66MBHldbg zNq)Z9cRI%)q#GMX!D?JtB!~XIgsyK4;_a;UNLGfeoj_TpPCH(xtHHx|e?8sr*b}9O z`az$*S1aTx5wL3`Fr8BI7qtDg4d8m}FDpoC+<+=>DE~;2_j*a29Ba^OP zu<@`tQ19CIqv|m7qiXq9qN9c3-4lyeQ@b#KLYH={+FCuX@Scln3BC{!S*sG^G0k~q z>`BHuH(u*Ok$x!t76kT<-jCtu=p}{MGe5l-0)P;x#%3w+^DDUw%u)qI3*RJ^EF}2CTwK3G)fc-5Qm3m2sMh&5M zuWsT6VM(^CX>Es#7ZF4L?AnYFF8qG2a0*(8T3IMtF>1opq7hHaj$7@18nm5=BXqq# zN@GsQcWYkOcOx#<1oE@&KSady^A4PDfJ~9d9-=y{37gy)}+N-RS zLo4hCFU1ma?DS1h^&M#njmIx6@JswEVAB`WnlvrzFIc%!C+6tU#M?QGc&JRU&|j=k37dd7&MHg_>XYegg3!TwQfDQ4!NBI(7rstXb~t?1-^rfo#EXB+s{gsQOGB)z*qr7}vMJxTSK@UJfqx-Ck^vgCo1iZJ9EZ zKnni24h4T)BWdARPK@6|cL!{c9(;^ET>6sNBfvd!_fp#;{$Cf8x!25`_o6`Sk~%__;rY} zf(v_UYIJCTUZAUrtMd#Jw{8fRNIU+*(WhC0`>pY3$x{v#yjdaMOm$2}ZZ~m;Y3hd< z>~N}VJHZ3!3)Rk1{gMGP(+jQ+93QkVs!7}U)x;`|92O)7fXEeo2O9S07`#sBg-$FQ zp9fR6-khi3EuDmsb8Bu5f(?RK1CJ&Hv3wqEzYg31H9g^jza6kZG4B!rWPP3PAj(bzj0f;5c0fjD28I7he< zG`Rfa)qLyyQ1iW%#XijswyyD(=ethnr;FOV^YxQm9)5TG`JQQIvZ;y8q0P3v>bH$H zi_M+rFzk;$$7|!*S7o%lz(`N_MD058`T&Qdq2TI^T*DV6{`L=HqMfu#O+A{oRA;J4 z5^19oZd-&rH2jmmy$i69$uVEL|-eNdk-BArF6M!Bf~S4p*sH|BX8QivrlLeg)WZ$NuX;sN?bDg+Ovmfn(grC(DL^}b=q)SoW5Ig{4GHv2gNo; zM&|gc77b?x=B^6GwbcWZ@CJd0UM{W5r>Ps*YLk#9D5Q0)JF7wPsR~ZSmogf*mol2T zMR27zM#wS!AClLrAa4JW_hMS5AHcNhN^D{?BBOl)^$9^H3%gDCiVxAG~46vQNWWfz=B5TdG~w#Z5M0(erhM zI0kLMO~!NF4e{15~w}p!qEw&Ev8t6gkTPj ziVvP^An7eJ1#kR8+=JMX^XU8U4B(}uR6+7N)67$J`yOz8IrkBBRou}%sQGn%LgYSaY%LO6IhD(y z;D}+e7=U5Q+}tM3{VNEc&p07H7`eiM$>&IOsy7P=;Oku>x%wrO{(}$(pRdE}dbR9| z1jZD8;CQUb$Mn~A{``lq+n;V}r?nQ;-)H}-&wi-{iHJQy>IBzVJDR5<_siE``XkK< zmWj&kY4#8o{}z-q_3Zv;7|kC1WMZ=W zMijEJcQ^iuq!^vf8*+ar9csgqg;t~)h7yqt|CDt`+G|B_Wp0y+7&7ra)(A-e3HqTc z`eZY}r)`4hA3}0d98%~K23bUGA{m}o4E+F?j&tL`gaqqLNPy&@UtJ-`@wa3Q;4*P7 z8nGbtCi)tB^_ikf%f4g`WIhG^YVh%gt0*kYm>=IF1LO~rEmtZn6RzM(`{}jb%BN3w z5GzB~vILiK5j>pw3Z$rR@RuW($)OSm1Y}oxmX04q0vcg4lM%U{jhZ zt$}a7>62O`0)7jqu92_?H3~YFRACl!uG&*kF$=o*c?`LqBq=`-+N_E&(EL_zD>mEo zO2MsP3mQ#}I6S^+g3_y8ck*a6PKR(SE#MNm5%|M(e|FNon54;x` z;S|+{ksj)IOs3Dc$m>~IoV$AysN9R$G{D~2`!-3rPN%9PFGdS(9pQ5@TQ=F|1#L16 z=;ua$P)pObVzafN=suY+El01~6S&9_k<{T9x~~1?hB}UUA*e^`w1IU|*t=IQ3n0hD z{;cHP{qUO-2pd}nurEJX>1nhN$CGvW4N-kZjcjQAWSj&g)2jN|%uP1-R+{4rXuslS z<}g#(fi9Yfoqtg&&Dz-q=4}PN(gHUkVUThXC-|i{zN|HUKR$ZLWKe~$?2BT(nK#Gd z=*GMav!{3ZSw}O?dv@O~BEaFS7dSYElB5X5B9CG^YeXB-Iemis2Q)QF>kb<%D1C;o ze;_{vO?IlqIE-_Y`*XW3hDKtUH#OA@WC{y;W*l)}3aK3p?Yk|Lm4({7 z^E{>KaV8JGIU4KoMqbU(IPnE-&u?8%7>qgY_;~W^@qt$9gouI6)~ET*h0T4EIiI3x zdv`a|Rvx_65-m%1sxhfB;SW-7`2AVLCJ`rb5e3O; zfVRvNda+KKQ?3Qvt_0;B54`4tgntJg5*Pw4D;z6$ar$ZWchv3UMY`*r=MPp2-;qg4 zESFm;wPC{;9Slk-%Fnq}v`{sF<_?bZa%PDT2T%~L?fw}hRrLma^ej(knlW6^rhdgH z>YIn@MZ_w+9Ncb%NdyyG=`bZU=1vcQeKMPqbfpwRAj_| z{o8swW(+tEEZY>BGLws*OE)b zNMOiHtH8V?16tG3-zcT&3afo5&%zY{)_8?e8X*=b#wlVQCKqrM$q?9eXK@i-VjJMf%Da_4h0JrZpDfr2mdefw$G$!9z`Br?>EZ~l#XO2e z1})r!zsZo=3#LiD`CG@GTHn~{>p^l1iUYR1L4Dm5JOP!mo8ucZL8@00#BM54VbEle z(!}>g)*Owm;M3!?H`?(`FyR47tLMK-qE~+X?rXXfwa4i}r+$nDhBwCGfPXRXrn=|? zX2J)YNCS4p1m;t77WO30p!bD^1UhGL(rQb)>msP$lC-u~h1T&Gcui(3&+tr=%A3P} zQ|Z9j3OmJ}Xxs`YESjH$Gf5K|74qorEy$|k9dDeSyRpROOm058%dbr(|3!XZ*Ndq~38qYFOsAwyiZ?`Jv-ZqbEtLYtpxi+U@fzp_aYyerIM^ zt3o56h&R>N&{;vS)3stZwW~c`ESO5&9tv4Oz}n&&y@TWz`_6P4XSp9l)MbcQS>5dG zRMXwxzs^riC$MJsELhYA>SY@U$@olZi^Rda(HmkbdaZ-QTJ*XLE2`+t(~1x0krkq0 zA&oY@GHNhs(w~Vd7R-{8N4T($nWHx!g-lJOx^P3-=9FF_nSg<^Ci*qCs{RL96mJSQ;uqX5ZIfm)q07qApw2GE^_?fWBGe@ z)GLzQDIRG}tas)!_JK|QwQsQ9C=;S#4Q;U7q^7|HI<4He*>A8gE02Yhu_dmHsp zLU5!VS?O?g7GK6^SNd9btTGI@%4ts`OBLXqZjY(0S{DJe6 z->oTGj?E11d)wS6euwp^=)&$Om&~kWdGqcp+OOVM8=W;u@D4_57I3V#<9O8ctw~_w0 zQ0J=`p>VL!KL?$_35fsHWQh+JA_V8Ifk z|C==bZ=ohG&{u9kP(d07@jtoM|1+FRz86jVU`_v#So_y>@ZE**ix6`<3zU{J$T*#v z=)ZF;|B4fXzNeED|Fc!$0s(>jZzuTf+z9mB7#H*|9fSBkwkiHYD9iulfgBkuQ23!B zi;Q=~|9&d{x0y_zUu1_faESk1JpLb{h!-KuOlAyX5Cnvoqp6aMqmwJMv6B;sH65Gy ZpU8xQfOz#EL*YmO`DaqX9Vb1v{(mqA$_W4f delta 16395 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