From 3c3806b476ec739e205244648596bac1debb877f Mon Sep 17 00:00:00 2001 From: Thomas <thomas.musset@pasteur.fr> Date: Thu, 4 Jul 2024 14:06:06 +0200 Subject: [PATCH] updated pom to v2.0.0-a.1, fix classes accordingly to new architecture, added icon, updated .gitignore --- .gitignore | 42 ++++++++++++-- pom.xml | 17 +++--- .../TrackProcessorExportTrackToXLS.java | 54 +++++++++--------- .../processors/TrackXLSExport.java | 21 ++++--- .../resources/track-processor-xls-export.png | Bin 0 -> 13199 bytes 5 files changed, 83 insertions(+), 51 deletions(-) create mode 100644 src/main/resources/track-processor-xls-export.png diff --git a/.gitignore b/.gitignore index 8d47cac..57f16fb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,41 @@ -.idea/ +/build* +/workspace +setting.xml +release/ target/ -.settings/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +icy.log + +### IntelliJ IDEA ### +.idea/ +*.iws *.iml -.project +*.ipr + +### Eclipse ### +.apt_generated .classpath -**/.DS_Store \ No newline at end of file +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +**/.DS_Store +Icon? \ No newline at end of file diff --git a/pom.xml b/pom.xml index 35269f7..b84e39d 100644 --- a/pom.xml +++ b/pom.xml @@ -8,12 +8,12 @@ <parent> <artifactId>pom-icy</artifactId> <groupId>org.bioimageanalysis.icy</groupId> - <version>2.2.0</version> + <version>3.0.0-a.1</version> </parent> <!-- Project Information --> <artifactId>track-processor-excel-export</artifactId> - <version>2.0.0</version> + <version>2.0.0-a.1</version> <name>Track Processor Export Track to Excel</name> <description>This processor exports the tracks in an xls file (compatible with Protocols)</description> @@ -53,16 +53,18 @@ <!-- List of project's dependencies --> <dependencies> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>ezplug</artifactId> + </dependency> <dependency> <groupId>org.bioimageanalysis.icy</groupId> <artifactId>protocols</artifactId> </dependency> - <dependency> - <groupId>net.sourceforge.jexcelapi</groupId> - <artifactId>jxl</artifactId> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>spot-detection-utilities</artifactId> </dependency> - <dependency> <groupId>org.bioimageanalysis.icy</groupId> <artifactId>track-manager</artifactId> @@ -73,8 +75,7 @@ <repositories> <repository> <id>icy</id> - <name>Icy's Nexus</name> - <url>https://icy-nexus.pasteur.fr/repository/Icy/</url> + <url>https://nexus-icy.pasteur.cloud/repository/icy/</url> </repository> </repositories> </project> diff --git a/src/main/java/plugins/fab/trackmanager/processors/TrackProcessorExportTrackToXLS.java b/src/main/java/plugins/fab/trackmanager/processors/TrackProcessorExportTrackToXLS.java index 2d9ddf8..4290328 100644 --- a/src/main/java/plugins/fab/trackmanager/processors/TrackProcessorExportTrackToXLS.java +++ b/src/main/java/plugins/fab/trackmanager/processors/TrackProcessorExportTrackToXLS.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2023. Institut Pasteur. + * Copyright (c) 2010-2024. Institut Pasteur. * * This file is part of Icy. * Icy is free software: you can redistribute it and/or modify @@ -18,18 +18,17 @@ package plugins.fab.trackmanager.processors; -import icy.gui.dialog.MessageDialog; -import icy.gui.util.GuiUtil; -import icy.main.Icy; -import icy.system.IcyExceptionHandler; -import icy.util.XLSUtil; -import jxl.write.WritableSheet; -import jxl.write.WritableWorkbook; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.bioimageanalysis.icy.gui.GuiUtil; +import org.bioimageanalysis.icy.io.xls.XLSXUtil; +import org.bioimageanalysis.icy.system.logging.IcyLogger; import plugins.fab.trackmanager.PluginTrackManagerProcessor; import plugins.fab.trackmanager.TrackSegment; import plugins.nchenouard.spot.Detection; import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; @@ -68,7 +67,9 @@ public class TrackProcessorExportTrackToXLS extends PluginTrackManagerProcessor private static void exportToXLS(final List<TrackSegment> tracks) { final JFileChooser chooser = new JFileChooser(); - chooser.setDialogTitle("Select xls file."); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + chooser.setFileFilter(new FileNameExtensionFilter("Excel files", "xlsx")); + chooser.setDialogTitle("Select xlsx file."); final int returnVal = chooser.showOpenDialog(null); if (returnVal != JFileChooser.APPROVE_OPTION) @@ -79,45 +80,42 @@ public class TrackProcessorExportTrackToXLS extends PluginTrackManagerProcessor public static boolean exportToXLS(final List<TrackSegment> trackSegmentList, final File file) { try { - final WritableWorkbook doc = XLSUtil.loadWorkbookForWrite(file); - final WritableSheet sh = XLSUtil.createNewPage(doc, "Tracks"); + final Workbook doc = XLSXUtil.loadWorkbookForWrite(file); + final Sheet sh = XLSXUtil.createNewPage(doc, "Tracks"); int cursorY = 0; for (final TrackSegment ts : trackSegmentList) { cursorY++; - XLSUtil.setCellString(sh, 0, cursorY, "track #"); - XLSUtil.setCellNumber(sh, 1, cursorY, trackSegmentList.indexOf(ts)); + XLSXUtil.setCellString(sh, 0, cursorY, "track #"); + XLSXUtil.setCellNumber(sh, 1, cursorY, trackSegmentList.indexOf(ts)); cursorY++; - XLSUtil.setCellString(sh, 2, cursorY, "t"); - XLSUtil.setCellString(sh, 3, cursorY, "x"); - XLSUtil.setCellString(sh, 4, cursorY, "y"); - XLSUtil.setCellString(sh, 5, cursorY, "z"); - XLSUtil.setCellString(sh, 6, cursorY, "virtual"); + XLSXUtil.setCellString(sh, 2, cursorY, "t"); + XLSXUtil.setCellString(sh, 3, cursorY, "x"); + XLSXUtil.setCellString(sh, 4, cursorY, "y"); + XLSXUtil.setCellString(sh, 5, cursorY, "z"); + XLSXUtil.setCellString(sh, 6, cursorY, "virtual"); cursorY++; final ArrayList<Detection> detectionList = ts.getDetectionList(); for (final Detection d : detectionList) { if (d.isEnabled()) { - XLSUtil.setCellNumber(sh, 2, cursorY, d.getT()); - XLSUtil.setCellNumber(sh, 3, cursorY, d.getX()); - XLSUtil.setCellNumber(sh, 4, cursorY, d.getY()); - XLSUtil.setCellNumber(sh, 5, cursorY, d.getZ()); - XLSUtil.setCellNumber(sh, 6, cursorY, (d.getDetectionType() == Detection.DETECTIONTYPE_VIRTUAL_DETECTION) ? 1 : 0); + XLSXUtil.setCellNumber(sh, 2, cursorY, d.getT()); + XLSXUtil.setCellNumber(sh, 3, cursorY, d.getX()); + XLSXUtil.setCellNumber(sh, 4, cursorY, d.getY()); + XLSXUtil.setCellNumber(sh, 5, cursorY, d.getZ()); + XLSXUtil.setCellNumber(sh, 6, cursorY, (d.getDetectionType() == Detection.DETECTIONTYPE_VIRTUAL_DETECTION) ? 1 : 0); cursorY++; } } } - XLSUtil.saveAndClose(doc); + XLSXUtil.saveAndClose(doc, file); } catch (final Exception e) { - if (Icy.getMainInterface().isHeadLess()) - IcyExceptionHandler.showErrorMessage(e, true); - else - MessageDialog.showDialog("Cannot open file.", MessageDialog.ERROR_MESSAGE); + IcyLogger.error(TrackProcessorExportTrackToXLS.class, e); return false; } diff --git a/src/main/java/plugins/fab/trackmanager/processors/TrackXLSExport.java b/src/main/java/plugins/fab/trackmanager/processors/TrackXLSExport.java index 055ac95..cfd6a05 100644 --- a/src/main/java/plugins/fab/trackmanager/processors/TrackXLSExport.java +++ b/src/main/java/plugins/fab/trackmanager/processors/TrackXLSExport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2023. Institut Pasteur. + * Copyright (c) 2010-2024. Institut Pasteur. * * This file is part of Icy. * Icy is free software: you can redistribute it and/or modify @@ -18,8 +18,10 @@ package plugins.fab.trackmanager.processors; -import icy.plugin.abstract_.Plugin; -import icy.plugin.interface_.PluginBundled; +import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.lang.Block; import plugins.adufour.blocks.util.VarList; import plugins.adufour.vars.lang.Var; @@ -31,9 +33,11 @@ import java.io.File; /** * Block (Protocols) to export Tracks (TrackGroup) in XLS format. * - * @author Stephane + * @author Stephane Dallongeville */ -public class TrackXLSExport extends Plugin implements Block, PluginBundled { +@IcyPluginName("Track XLSX Export") +@IcyPluginIcon(path = "/track-processor-xls-export.png") +public class TrackXLSExport extends Plugin implements Block { public final VarMutable file; public final Var<TrackGroup> tracks; @@ -50,7 +54,7 @@ public class TrackXLSExport extends Plugin implements Block, PluginBundled { } @Override - public void declareInput(final VarList inputMap) { + public void declareInput(final @NotNull VarList inputMap) { inputMap.add("tracks", tracks); inputMap.add("file", file); } @@ -76,9 +80,4 @@ public class TrackXLSExport extends Plugin implements Block, PluginBundled { TrackProcessorExportTrackToXLS.exportToXLS(tg.getTrackSegmentList(), f); } } - - @Override - public String getMainPluginClassName() { - return TrackProcessorExportTrackToXLS.class.getName(); - } } diff --git a/src/main/resources/track-processor-xls-export.png b/src/main/resources/track-processor-xls-export.png new file mode 100644 index 0000000000000000000000000000000000000000..413f16fe3ba1af24be12131dda2d4911a945c760 GIT binary patch literal 13199 zcmV;AGjPm_P)<h;3K|Lk000e1NJLTq003YB003YJ0ssI2ZTjGE001*qNkl<Zc%1CL z=aXgEbuYHp4kz5)d3w4h0~mk+m>^Q5p0b}T%JwVki$A#RDwnJ5zrp{GUF9#Xa+SY5 z%aTLACp|rq0!4}hKq3q<v2(cL#2wah?S0O@eY+<B6j{$-e1Pe>eZ#ruti8hTx56Ho zRj2I#KVE)FV)WZM4=_f};U9$G836dd{X_pP;ibg~Xz7!e&l7&a^DkX`0<OLc?6-3x zR}YEwo1Qn^JZl8Pg#_Tx3WWtpHRlILmu?AID<ztrW&UUJzQv`5=a(M0CttquuW}R5 z$$ROQm%b*6@GG4ARbPt?2_0ulh)Bvv@`y8mgh<9ZgG4|ega9D`1cZy>3>H@u<VaqA z{z}k!Rl}ff*r+2iWQ4%{U;g{N2r;~afMF{e|Clqz{hO}}1unjcT~^JxroO_AB>nmt z1apl>LLw)nN;<;`(#n-*(}VGBZ&sXEI&-cjM%+t-an2d%0Gu-+KnWo^aLxti!V8uQ z$(0aFa>cm<&V_$#cqfm9kU|K~fCB(X!6k6u5X21&4Q*}~s1*e@MjdRv(L@TW(EQ#! zpm6=o|6cuJZl=o;k^c<SovSwpE;vM-L#6Zc>hO5-<nZ*tc(zy66Gv76S2C6&3c6wa z_4%dZK*C!gYvd-utCrwg3ZVoKvg2NS5|jifMC_lJLIi;VC;^gtnMuJ_kdePJ4m>P^ z7ps5lzX^c6(Fe(e2Sm`WEi5!RoP=3t8Zo^<gI-~oFA+|&Fn)m|86~PSEzUl9`VXHx z{`>K4ubcKaN4Iu2-Wzr|(_|E>#9uCuaR$+wn?q}@woV&cJ7<YG@=rQrYwK!ltJ-AF zId4=B(OE=o&^T{-=#7ZlXy6Ub-?U&}I3T&?LIyRIG6<b>rFbM|B6*@@BxR6nSOzI# zDU}pa#FI#+QYkM_47UbNY*{jw^J4$2iwA%?G>n*1Ng54`a{TF&AAh>{{;W9e#=Wi4 zovoESgWg6Qb^Jn-bIb;(fav{)zokaA+koa*Irtt#Bo{>D)jpUmI{)$TBzcL2HEI4h zf1oA*5pNv9c3e0EA#>j9!r{;A9hX-euT_2}AbfW)QUAZFs=Ax5-M{s{)&7=qh5&*? zge497HB5{U83!Si0tRQ3N1r|Y$p>Hjo2)v!eeK<E-22m;TkimfX?1*_J)6xA%j!hi z!jcP;4cFtnh!7A-o_g!!(p!zcTp`24COnZM5lr|c<-i1&JQCnF0u~VufV_ecG3P}< zL1bi{v)1~s;K(9bi_VzJ*wSL<e5|mD);cuC8fy@(BUjq;!w3JqDh)98-kbk2jZ<T_ zaTdI1oC^rieKp<jT8M~A+!Ioro<IHfKmT7I?EUD*wRisLTmRL~^{*q;PtSgFGW$H& zr`l>q2EYbQ3BEP>1?H$-8j_9gnE&p5xOYjxSp=8i<rcoyyKtCaLlCs|vS!{%Hy(xi z!}~AJ0>}U+fJcz<wC^R$y}Jw=Bf*=bm#_EsQdMSpdb<C^pa1Xw_~HM(z54o_cfRSv zF4|>O^%XS;99qFetWpmA$-zfI`PIKZ8GrHStv~qs>wmVpaX&B5_s1XZkAIn0r;fD0 z2QIh>w-GFx=HaEW5+u7oJ#Fx%h4=SA=fZ1b1d9+I#MeYL9?YhZWbpA^aW73CM9aMd zgpY|lJQH5>THIiaNOmHzk+5DjS+6Sd%TIpt`tDC}Zr}5t=OXw!wh+))Is6BFhyn3v z{}(^|^si4RPu{-sr@#BwzhZ*EIQ;SB<DX>uSb$Kf8$-8|#RY<73%iCUq{t?cv^X2) zH$M+CZLsARfczr<w&B~u$ay$*<e1X|OJ2YtY|&+dRXxsvut?4!GS^Sm*L$~}6<IlD zR-BEGKKRuSZ*1SafA3pK+{vq%fcD!Zu`dCN4Ook0%orV?Kl;&!|J&*0@t=L?zrTOu zk0#}l2S@+*WcGjpN)#ZxAM}3n$_Y4IrWyW9p;@E_iV0|`4IlGxE0*v!V;A8i`1S=r zZ)FSfkF>fb7H@8s34;DH%Z;&B8V}QWa9kV}`Gi>yLq7iOXDh?a>)UrXM%#=WwR%hP zD)hX3G(pu7#!+`NJNn5de>Eu%-g)hhzjo`7jLSdS|Gy5Vzd~j^(a-}5;^@OR0xVsA zP{51(h9C?ddgdIhIo#Fw%J~wHYfr^5B;HCB=CTv>3x><m4DaWSpgoi#;>f9^MzQSG z`m>@MGm?=|XJ;oLe*FH|-~Rp1n>`V*n?(okWk|X~AA(D5^s|#sKim89>o>mphu{2f z3Vr_3)4$rA{6eWTl|vtxJydaUvF5O}_H^-+Ud$?K&fMm=$LIy*mM)ayC9ZRc1H;9` zIhiBm{yGVzNH|1gJt?b<p#q4kEsswQKK}HdcD8PBZS2&hLbTj-%U3#ShbWbbWV(Oy z;Pd^T^?QRicE6X3!6zqwvp4y<;EI7jw2j4IEM5a)FG*#g@r^<dTmh(XNr9HR=%rho zUst;T^Cvi47}WD`UJ~D&=qb_RJju(vtV(hM5uC%iDktNUy3RcjvJC;`U+SbufRH>o zI{RWg-Mhd0FRrh?b~5|y+4!GIbKXy{1!`jhZ*1<6v-aL_evv?I;g8$PB(`wLi<`N+ zPQ={&HL>9LmtMcHP+0o8oJV<X5&WzEv{J@`$+E7i+EC!WhzMMDyMri-&||mOlYWJK z5TSFXtj{8;Uf=#c7x3}kzb*8+5RrFgA#Ovf8hmN3u5idJmkWdoA3{sc1+IwTlApRH zpv6c0$3v*OA`U)3;d0`@V{4Cfg#yO4skJfa&r04_WU{ul-RTaj)y*OXCylRg(%w`Y z+S;BY*x_Jf*xSzZ)BVW@#%TeuL3=?Ng5wSM;NwLDe88W(Ne{ttiorvFn%f98;hA%S zrIf_7kHvYkqATK?zsF%KuM0a3Ru4=5yRllYE0RYNyc@1{rt2CVpz{|R#c{vik7R_l z#psCmDib3j!4(qDiW329*uBQUOv=5iK9eHlTzTTd8gsdX`Yw_Xa{|a=4u<_p&?tH% zS7;rHb4&N`-w$Fbk+U!*zAT`*lxP7~E(8=b2riV;Kl0>`kr$9q&RVTYV>Dufp0DvV z>U2AODV5QhmXP$T4k47WRaTw@Q=Mp3=+mq^_DUxfsP~cs34h~rioH;bR!o6Gw({bw ziV<B3`XH`a+`?*>jtf9Ew@12I-uZXi_PtCva-4A`Q^95BimI-xwM3CaCxq;#gKlRa zrL3v~=FsXDRKs7f;G!m%Rp*ScM0Lx0oK>fmjBtiC88S}|0$Xr`perp)Xvw<g>(ppj zyUy5NvG+|hk42u4EP-jjx!0WsL{F;1N9Rb?<C-fM4Hp7xq6E!@yuUhhwctrA2LQ6D zre&Esi{t>UQ!?uJSGs9ma8Br$XtC2Pa8Lu+!I901bID>QlU$DrbMAdJGj!>*{;m+w zqH*3aVI!=NzEVwUA<#(vT#7ze`a(vHHii$o){Tb@ZIFn&h->XLI1dX;?rAPETF{h> z??kk~p`(V3Xqum7#mrg+B4=GE?GFd5X_5p4W*N%H4Zc!9VG*3OMLF(A8%jnqJt@sJ zEF%)LbIS(|AWU$Tsv!p%vJGWO#{}TP0!3bMu?59~)_FHx`-)XAMK!vN%Nzd!YzYX# zg?QwpXK3NJco4b;fFvFu+G%!F6a_ls44tz{lCBI_l=6-h8S%MTB=J|77~{;Lt@N}P zt#K|&J=Qkk90LEajRb?O8SC^)@8->w@2+-kJJPf2pw?MwW|f;5GpSr<uy$0VLqcjZ z8J=iM0h}|%y#WPtgA3s61DrPzT4aJ2s?bV-o(o>{m*zMXfL!a{IUyRxA&R=%)#L2g zXagh=(V<DwbU0jLf*V55m3RwfU#UUC4O?flErElSQk$u<WgsX`%Bppc&N*vMEQXtd z``d%Jh+%1_*4D<A8gpZ^+7`7djLk}&)iyJjTUS}Et*fmwUUn=;Z@Cl{OM1a^5%Tn$ zH?@%9&gW9N0+BA<`2w>5!ICyY6VZ^6gNkLhtn+Dk=ItvKz7ScObo>1Q09fZ}5r4k4 zs^Oe7wsNRN$XnHRYD_6bmjG#wPeR$i5xGcoyoqrM!22S3?o`IQveL7{jw?H<O{UGP zHnY-ZwJB;hHLh}4TQqIX*_*fx>BEbBSs)c{?DNm?h4DRao^aU=n}QOPB2Hv~nxD;z zGiM!;4BUfv(q6we^tjL3Cb!!P=w<5DWce)C+LjEM<buf7K^KIGFUlz)XgM;#SR%WL z4-i))OLGXJgix{S_u1CG-r{+qrP|oCHhE=cwVjq`T9|36$Ca5F>lMw|!jbW0AY`>! z$chQ_z8`1-juvsVDRMP2jF#LK0U~h{GLkaZburCOgDiL;rL5QO_j)S;+<6iY3!8l@ z4r;QV)*53f0g({GQmJj}NHg!AedKOJb%1<U$|O<4SalokPD{At!Wjb(f8=s7i&>vV ztO+p|EA1+63+)PR3hN4Oi^|T7&9y6P|Fbl%vi@gjoz~8HDYM{%L#{UD4+U^3xa6=v z@Vo)BLa0cjz<6bfs-7XWr8Fs3r`PXxdttR5yPULtk^WGF;kedCZHh>wLI~|L<0>K> zbO&jk5_M>hTu1fNXjO{10SEvW(S&G`PsL>`U>9U5WbV0)crTJY7GJs;gSE9~ZSy*q zWMw9$o)l(W+F5OLYYXqo(Bqkqu5+OvXqy|QHj%)Q95PfqRy=lSXQekW>nxEXMv+Q; zok5zUp)heNNiT_BkhDjlP=r&Jo>h99MjatkX)^6f&r*=h1;hcsI1RwN(Rw#tn}58? zA<i?OEh7MS5pP-@UP^E*=f5r;{;r}pjfM-u^mmKSlBsQO?5r|bWu~>wDl;qfv^G=i zX4>W2RiPM%;JK)_XjQT$MaMXk6{mSVMiWlYd7AWkonaKkMCiQZ<8#+cFEcUke+BT$ zyN0}zt|+MrkD+U7Er^<u6EU!^iezut+3h83bG>MFVu?B}bh9b=+Bv%lrJ%qekhNLn z3-y}!hcrgYL3jqj)Z%Qtup|ymFuK~f%EwI~E{obugU2kjt%$UCS!s%XdTo^Mc$cS3 zLaB8%K0m5;6>r6HEQDmnSW89*^>4oV<vz%3rmS?Pb+IzKBZVr9b95%S<OTs@bN@(M ziD<QVs}nAly!LTK%<8ctE2WgYDZ0y0;R4}rQq1LbVQ~u;Tb5_bfoUnSGq#jJfKYN% zf~#0vy#;40?P_fc=d{MWvRR~h{dmpVdVA&d_wN5^&(f2<XU~dqva@}AZFMWuGfb1X zS!C(t3!}WZ4B;V3UC)fkddYxuS?Do33m!G-U^^i%>LDj4(O}fwO=RC&uqS@1($z0M z|977q{g@)XIk>esyg5kM2g&9jUhSwpn^)$-DcEyRgJ?O$e<{uU99MaH?Oeztl}Q>8 z+jbG}8U5K%nQy-S7x!=c$!s<`JwM3uu@KSq>o+9z6bL4{rv~%ZhL__YZ$enx+&P^_ z0}`gvGqjFEjVw4<(Ku`X)luvHXv?E4|B}a`K8QH=`O^<SpS-`daeZU7n@0U%XKmD3 zA9U6R$$Ap?yV1%hx!#M`1jq(WHK}MGz~O>r%p0>DTqxR73K14rTw2z<#ylI$(Q?3f zVqf?pNut5ZVDskA>&_Z$Jx61lMNx;8L$p~ntuZ6;KInxBGk;;uf3!kINi?kStg18P zh!`i{CV?DU=X4~8y?8s3gT}i<APA9+?rneL`WJ6~@aXTpupb^yzu;UZsYsKwlMV)* z)imyplFgmr+i!3D%kBPs*5)OAEDOSN#4uz+M02ODJA<pMcv17Xn&oaR0WaHT`?f~r z4c_5W#!}6FqQ|#rUFJ&X5G2W^1i>ZMCC^f8V`~N?iF#Feme(_jjx*tqH;&jd3}=SX zaFkw`Lbad`xN}xYwZ69X?(N@yu=mr4#rvkhZkm$88my!9%1%MBN1#7F{d<P6n%s<4 zx(ITmn~cpPhh@SC9kDKXM~MzRcmIK>0lVC4Hm}3B-hT0(EBRb#vET(DT+V74Yid&> zGZDNbY45ojF>Nd7jN(#BWl>iqL+89F3&m>!aE@8$y3zV-=a%4V{ypvbaKXQJ=evg| z|LWvtk0!-|N>Z?n1A!oCNFb}J%B%6O4*&Lg|J^q?e~$~vkQMsyasIb^<@-oBg;6X< z3VIRmM|>3XffR{^G?s%j8cH57#B|}qo8}E@>$Wd*P}DS)1pNZGsPlShp<}hFohzAe z4CD(0M2sXzVo;fa2xA!ofVO$9Gk?yYIHBE5guE^9r(3JtTO1T!XfY2hcr+TWef_oH z|Hse%W^#0tmy-x&lqgUCNeYNNJaSMyJ^$$Ed;fZ8@Wvon&&=_&{NFsv{`yQmAisJE zco3ri6Hfh@4HWMuV$_Sb6zg$JBC)zLygBM^1dr)L0};#3VeQV8NR;Rah~{~y&_)s- zw`p<^qIGk)T;q1mX<IX9n>hI*4I<)FSRW)O04#|Hh*VZtU6-K)4v<2D5RG$A@U$Cm z_0o;tlH39}V>nnOuWjD>=G{L#E%y(Lk4g5pS2XJ!Lu5iSE~9aF@cH5UkJf*7ZT0$o z^`nFGhb24d#hVRV@iwf{n!=b2%~Q0%c_c-8d~`HBw!6dM{iARFm!tlMr(li*=MK$L z@xy1?-v}NjVkDs(c`*$YAH-r1%dQkX1%1K0N_JY>*tVLs#%NL3ws0J|@C4;0CI*to zl=T!Cr11zzS9+$cRzii^4u(vlA;vmtb&zZ+88@=$ODqdKgtKYd`OaH^{^;a`ryqYL zI!4)qTxc{R6T+QjP90D8e*ENry+=1h=fsMs5^2nbF63z}SRx+^1feIApwG?^&d$#B zF>Q3dc4PCc(O{#={03agw3|$-PmYTBIgcaW112OS0um01f}RqI;HiHgQ_j1>ZLKD6 zt@U?9XIC4ntkcGoz`YCi?EeK8)`oDGSLd9|PCU}K$m_8~l$;SZtxQmxiZR|FZV%Ee zAD#pMVAO`^Cd4}DA}MZOzx(c;KlpV2{bT*8)Op0yfTIbJF-MAbtGfRAlmDldH{ZH@ zZ`9cgy-=Yg%>r5uC?yGW)>gW%2=hUr2e-Dq@$EPNldr%2{WwWHr2<quB68FEaaQje z=kbe1?MMR~6SLmp=hY|96j#n@Y0vMzv;AMM4Q{ZOfBMTZwzgP<Yy|XzoU{*(f^$Th z*QZiOz0TUKnoNr`be>|NC5s3QW_gjQ{z~Ugzq7@b80iuoX{6@y$Gi9b#s2xj|MP?Y zaZ>H8PNHjamQf67Q7SLTs?Z0A)2-F=#`Zu;$W4XLp>e1ov|8}0oE$tmHif)4eEZv9 z``-QA-`!ff8L6l#>QX@U7ORuugOlR3O6LMdcu%O83N8))<RRZZD`sd;*Y%2<w-fll zVw}~kMrJ}c9H&>*#Vnelo~-w8_R`V8`1472iUtfJdGCY_xUNiBrJIA-2I*FlT?Duq zbOYD-^m=1$=X-Dc;Nz!1%=S+VmShE4iPouzW9((fDLy`!JxupEN9(<`OU5|Ee4LUv z$<Fup4`*j)q;B86{X4JS`kmda`=h~X<6oU~3#e^ubvXOzG<#${;jB1!9$Nul!bnY* z5LH!Xs?K`n-mrUZ5m<cSHrlwFfm@);=LOWF2J1{^ib$rNsGpUmvwVz}n^1#r=tDeX zqL-|$4{oJV&&RbF;i;gd=$uuty0!hrd-wigTpsObA4!%lCQR+nF^4216M|31<A)D% zcjNla>mA7xO}Z?r*)%^pp5&*n65apy>pyt!?LY1HJtEasGbG+nU9Z_5n$7glVgAc; zxvxY&B&}L^xm0kYKnD4=IE%2ibM0&Eqnq>F=H9+cZBe(yB6_ia!dsC-r><5qRD1GC zS<aY`ls--(5R!>hy3*Yqb~k}DXRzttdY-s6PY}5{>3sYCpFcYP#s058U>rGsb<7wq zZmB>iavH~H`6r)0NuuG#$_5}E?ma$udJ^O2x9|O@-+c2=Hdk*XaT-Eo=uZzJ2+@g< z<TY5I6dxbu52kwBkJHfR!rH>h@^t}m4wI}{k!p}^c9TKVgv$do(Y8daLroXxc>#qs z?<Uk)YirIhRxyCc%So+E&J`D&a~|?#x|<HyM!Vgl-}G2ro-b$*WZoSMP(E4_OS_cD zLSPj7R*741$j~s)@GOFp8ridFC+nkASL4%%&+;+5HTwP=yWfA~?sqoVuZPTrr$0?H zZw{kFB7{Scj~_n!=#x)BJ+JiY@UiEEiV1(oLh{gi=xt3lb?u^J-GBp>0@h}4xJ7GB ziDZPhlu^9W5#Ybty4u)MavrG!5sPY~Z564`oKB;2rk}2Ctlo^HB<L`*=c%?Acjzqz zUe(o1KiQl8*s-%=vX;3Ck`_XGFJgVfH--QN0!_|lj~_iVQ)g#`JL_Nn?z?|+@76nh z&5ZU28T##?Z>*xwd?@s&r@x`AC!8~br4gE>CGI#kVH6^KfHN-Gbj;S$eyUbHtS8r0 zZLKxNRm3a@xd=Iz1r$OZ2T|LqHhDk|u`zY2XBO*(_ZT3|`!V{R^|k&@$s>l1>!VAp zIYIj)83X6Jo;*JL(f;iH!X5XA@$Tl$2m2puQ$~>>41M3;mwTLM$<|f<@WJDi*Y5t{ zd;i_->u+_EUQ@gb^jIwSb2i_{J>zklcrRZ6*4_VnJ$-vTJD8PcCzEI6?Af$BoYlv< zJt^?aQbvG=d+;ZUxYyeq^j4VvI7!iZ6=Wt9=wQ*8_5vpjAdMaS8&F-r<I3dP=8Rb` zcv}zg+ACLj+v~lXz@$TL>+>OHLF5=fBod*xLpsYI>`(sj+4QF~a{vItQGaK9d;fH= zE(#{Bzh#7ZkcFmobv!-G%j)K}w}$<-z^wy@0p2uf`|tNAwJ3OoD32&bw6(UgG2E$Z zombhc7#HPvp(lAUn^k97b&^--r5>Lb2jk)_9gSY!{=H78+xT1#U=X#{1ojGrlb7<s zUKKd!(wNfNvXcy@hzdP1u52_bv>!NPl&J2gyFE-d8G&^M=Ik)^s&dX10939x&OUv7 z{`W_-pKB_l>;Up8QKR+##`<P;Fg2zCh=t%yyQKei;hjcp%A@JSj~@Q*x8D5YNG6;q zU|a;R)0h`}Nx4gLg)t;=r99?otkS{iI$OPX-7#IWqR8@cdOF!ZK7XoIw7Y#z1sLV8 z8Ck9CsxCu&)rILcT<ntLXnL+IlN(p9^tU)y<Jl8!t7aI9F^(R(u}-u)=v<4Uj`OV4 zhGeBzE*=J(IAhcL<l*@5o=tw7SBDOfi#TNHtZ|h}_|En1tT;b7&6RRoa%Y={Dgp{@ zAH>1&!@vHA|4H-XH}8H^P*1pSCt6jq*Q5+M@c^&rN?W6soooBhVbS#nj0qN{Eb8<| z*xTB^=G;4>gI^Gl)+Vq>D(k$`8AQZ|SRSFfWMa^^8uHTS+LrxfoijGh4~^A<C{vgm z(vr*d;qFTBnt#qU^*;~B!fX%As<X5F;a>KO{p=@MeIQ84Knp_wi>kU5Qm$?EH^-Zk z@z`QP+{jQUYv(SAB`VRn{P`z;tGaouzDSc{%2#^Hx)R;lG;>w7z4F%Da7U@AF|MF} z$S#KPU_K_(0-u1E0%qb6rh?*zPHU~vD=(+OoGjLg2ScHk2xzeqmC1~&`|%nhI?whk znviLykS;MY>0DpCx7y!k^R6-q@SryNwA$aB{&au#^ND`ysPJwcB4pNL+r<=6rd5$# z-xy8CTYJZkt<#Z;=Iv>S1WI`VR959DUwj}s)16zJv5f0ObXuJs*FAPSersiIxYLly zhB<Ojp`kv&F$zPDu*fVhY-X<76~LxqwJ86ES|K57CQO^Xe5rr}DtBa!$r)iMSuOQ+ zoF5=ME~F1(0kEd3cWwB3Ki$MIxdh;`1`$0u{l&*8|HqmBm<bb!B;pYx9>#23lR|~2 z;}e-SqCZmCZmgV65A$4u0^rCwEyN@wQ!W~xlusX>t#7PoQ9gcnWM=(q-FM!&`~7RH zca>DmnYn-94SYi;f^=+XJPkutP2Vpq29BHD1}v2XJj1X~JE}Q%98_qpq?ZXOWQ?qF zt_BW~N~h&<UY&-{Yt^&@axOZZ(WrMLk{xGFVDKR!g*2X=K79OOtRD--k|-65Nkt+8 z6)CBt3}v5Yz0ld<t)tP(psH%4EpQMLkVphX1Hj@)=}Mm-Wsg6dtc|W+Pu{$~_3oYR zcW-RH*6XgeO?zIcxpi4?&Vg|SLm&k#Vx;E%Y>vo=;)3;fhZcQlFfZSEks51|S+NA5 zU*dy;XwlZ5#R`u;wJpkO8pfBRMpYvf4?A1k&Iaea)@1{~LV1=3>Gd1^-|J_$N_SRQ zV^if;R1g^vl`>*7%=?8AN#x!i3zf3#HwSf<pB|4@thfN%xZXCw=Y+znm_GP)f9vhv z{p0Waw{P6~dgG*xF~*u^M1!23n$J%3j}WOVZV1+sY#?ADpu-`8FgV45he;{bHo`4t zjpoCwUO?cQv8yXwNiO*w5+De%)&(I(A_d?cQs|sB5L^;@tk8)^tKA!&XcU5@4?UbW z{rz<F+WnpNdsSKH)pSxGpJ)4%{9v3POegz=J+(AJHQ}*UDa8r5Ak#Ftwv(2#K|U)3 z4)iPuIeA+PZkG#=x-N@s)Z4tXbDt}wYh!I~eGIceN>E(l*-`bAz3Q(tP9wf0AW_hj zd=!bbh_5BE62pq(D@qI%^o5MPvb(msuxWpD-W)3u&TAH36_LD%l;nf7bGFh`Vl0mO zL=@tE$$U(d7L6m@>#S}JZ^klVwAebJJ!ukmAZ5M&VBKyR`+8Z=ifWRVlUaFQ)Z?N) zo#~_89G3dHD$mC>ovJEIGUGA_`DBs_&eAji8A&b~3UrK<vX-=|9v%MTlgB@~yYo$l zRFo6JBL>*C2<7H@Tz!`7Lrr<bb$}^cfZ~t}=qlDxyf2|Ic`p+Eh;4WH-9dCi2^HE@ zf(1HbSrtfvWb8_}-(?dMLON$kJ>|gDc<7w2>X|{UAPoZYg6MZP)`mBQkci8L1b-A& z&e~#=P*U~>{lT!$*ls|>tg7rRKR=)DolTyc&GyE{URE5L;-tf->-|ABd916<Fz{fX z3<WF*Z3L{||M+iW)%!30^nch~y&b|j0$>>Nb)`L+nP(Oyzz8Vy?4CKtYGgUlVSx2v zm;s0jM$<d%><4e(xSmFRYbqZaLgk8>2?Hja7_yi6pr%|RiBVZkBv-w7MVlh8&(R@| zM40hH!TBKF8gzEhQ@grt)123Nmc(U^))#|tjaMN`qGW6J&c^7bHAd?qtESU(T$#!F zX#ZjQ@!rwr<LTb4ILggLQ%1}PUIG_N$+PV2qep-DX#X!p-Hk}4=rkfp;10{FesWrW z;V2g@25^9jeiEE-;t<dY)VeD2qYm(M+C?D*YLWmhG$?XT&_Z3tUgm?Eu6++cOeT5M zjfSPki+UQ;QQ#vcpi*ffN8BZOUKm@qotCWaWnCx~T{IjlMl8eVE*C;XQbdtRx^chP z*;p~gqOqIB-D}?+Pmd>)qw(zUY<6	Zbr@EI%o#Nofk5?LYYZmw)~5{^wZq-@N-h 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 B@HhYf literal 0 HcmV?d00001 -- GitLab