From 05f982c86b4e51d89fcc7efe52043a80ba827a5a Mon Sep 17 00:00:00 2001 From: gac-S_Changer Date: Tue, 22 May 2018 16:07:56 +0200 Subject: [PATCH] --- config/devices.properties | 2 +- devices/dispatcher.properties | 11 +++ devices/img.properties | 20 ++-- devices/led_ctrl_1.properties | 2 +- devices/led_ctrl_2.properties | 2 +- devices/led_ctrl_3.properties | 2 +- plugins/Expert.form | 131 +++++++++++++++++++-------- plugins/Expert.java | 119 +++++++++++++++++------- plugins/MXSC-1.9.0.jar | Bin 64577 -> 74216 bytes plugins/NewJPanel.form | 22 ++--- plugins/NewJPanel.java | 20 ++-- script/LN2_Monitoring.scd | 15 +++ script/LevelMonitoring.scd | 10 +- script/devices/Hexiposi.py | 12 +-- script/devices/RobotSC.py | 9 +- script/devices/Wago.py | 3 +- script/imgproc/CameraCalibration2.py | 38 +++++++- script/imgproc/CoverDetection2.py | 79 ++++++++++++++++ script/imgproc/LedDetectionProc.py | 106 +++++++++++++--------- script/imgproc/Utils.py | 30 ++++-- script/local.py | 12 ++- script/motion/mount.py | 16 ++++ script/motion/tools.py | 11 ++- script/motion/unmount.py | 15 +++ script/setup/Layout.py | 110 ++++++++++++++-------- script/test/TestCoverDetection.py | 19 ++++ 26 files changed, 595 insertions(+), 221 deletions(-) create mode 100644 devices/dispatcher.properties create mode 100644 script/LN2_Monitoring.scd create mode 100644 script/imgproc/CoverDetection2.py create mode 100644 script/motion/mount.py create mode 100644 script/motion/unmount.py create mode 100644 script/test/TestCoverDetection.py diff --git a/config/devices.properties b/config/devices.properties index cbd53dc..d9d1e32 100644 --- a/config/devices.properties +++ b/config/devices.properties @@ -1,4 +1,4 @@ -img=ch.psi.pshell.prosilica.Prosilica|25001 "PacketSize=1522"|||false +img=ch.psi.pshell.prosilica.Prosilica|25001 "PacketSize=1522;PixelFormat=Mono8;BinningX=1;BinningY=1;RegionX=300;RegionY=200;Width=1000;Height=1000"|||false microscan=ch.psi.pshell.serial.TcpDevice|129.129.126.200:2001||| microscan_cmd=ch.psi.pshell.serial.TcpDevice|129.129.126.200:2003||| ue=LaserUE|COM4|||false diff --git a/devices/dispatcher.properties b/devices/dispatcher.properties new file mode 100644 index 0000000..5a3e672 --- /dev/null +++ b/devices/dispatcher.properties @@ -0,0 +1,11 @@ +#Thu May 03 11:54:38 CEST 2018 +disableCompression=false +keepListeningOnStop=false +mappingIncomplete=null +parallelHandlerProcessing=true +sendAwaitFirstMessage=false +sendBuildChannelConfig=null +sendStrategy=null +sendSyncTimeout=0 +socketType=DEFAULT +validationInconsistency=null diff --git a/devices/img.properties b/devices/img.properties index 2f441d2..b95a012 100644 --- a/devices/img.properties +++ b/devices/img.properties @@ -1,4 +1,4 @@ -#Mon Apr 09 18:08:09 CEST 2018 +#Mon May 07 14:51:31 CEST 2018 colormap=Grayscale colormapAutomatic=false colormapMax=18.133 @@ -9,16 +9,16 @@ grayscale=false invert=false rescaleFactor=1.0 rescaleOffset=0.0 -roiHeight=-1 -roiWidth=-1 -roiX=0 -roiY=0 -rotation=0.0 +roiHeight=867 +roiWidth=875 +roiX=65 +roiY=55 +rotation=17.927919762007235 rotationCrop=true scale=1.0 -spatialCalOffsetX=NaN -spatialCalOffsetY=NaN -spatialCalScaleX=NaN -spatialCalScaleY=NaN +spatialCalOffsetX=-438.0 +spatialCalOffsetY=-434.0 +spatialCalScaleX=0.5371114316839612 +spatialCalScaleY=0.5416192705243328 spatialCalUnits=mm transpose=false diff --git a/devices/led_ctrl_1.properties b/devices/led_ctrl_1.properties index 0307210..d9e6c8d 100644 --- a/devices/led_ctrl_1.properties +++ b/devices/led_ctrl_1.properties @@ -1,4 +1,4 @@ -#Fri Mar 23 15:41:28 CET 2018 +#Fri May 04 16:52:30 CEST 2018 maxValue=0.4 minValue=0.0 offset=0.0 diff --git a/devices/led_ctrl_2.properties b/devices/led_ctrl_2.properties index 0307210..d9e6c8d 100644 --- a/devices/led_ctrl_2.properties +++ b/devices/led_ctrl_2.properties @@ -1,4 +1,4 @@ -#Fri Mar 23 15:41:28 CET 2018 +#Fri May 04 16:52:30 CEST 2018 maxValue=0.4 minValue=0.0 offset=0.0 diff --git a/devices/led_ctrl_3.properties b/devices/led_ctrl_3.properties index 0307210..d9e6c8d 100644 --- a/devices/led_ctrl_3.properties +++ b/devices/led_ctrl_3.properties @@ -1,4 +1,4 @@ -#Fri Mar 23 15:41:28 CET 2018 +#Fri May 04 16:52:30 CEST 2018 maxValue=0.4 minValue=0.0 offset=0.0 diff --git a/plugins/Expert.form b/plugins/Expert.form index 503794f..98bf7f2 100644 --- a/plugins/Expert.form +++ b/plugins/Expert.form @@ -16,58 +16,60 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + - - - - - - - - - + + + + + + - + - - + + - + + + @@ -86,7 +88,7 @@ - + @@ -163,12 +165,12 @@ - + - + @@ -219,5 +221,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/Expert.java b/plugins/Expert.java index d9eb961..1bef3f0 100644 --- a/plugins/Expert.java +++ b/plugins/Expert.java @@ -85,6 +85,9 @@ public class Expert extends Panel { buttonDisable = new javax.swing.JButton(); buttonReleaseLocal = new javax.swing.JButton(); buttonReleasePsys = new javax.swing.JButton(); + jPanel2 = new javax.swing.JPanel(); + buttonHomingHexiposi = new javax.swing.JButton(); + buttonPositionsHexiposi = new javax.swing.JButton(); buttonEnableAll.setText("Enable All"); buttonEnableAll.addActionListener(new java.awt.event.ActionListener() { @@ -136,11 +139,11 @@ public class Expert extends Panel { jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() - .addContainerGap(59, Short.MAX_VALUE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(buttonEnable) .addComponent(buttonDisable)) - .addContainerGap(75, Short.MAX_VALUE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonDisable, buttonEnable}); @@ -169,39 +172,76 @@ public class Expert extends Panel { } }); + jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Hexiposi")); + + buttonHomingHexiposi.setText("Homing"); + buttonHomingHexiposi.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonHomingHexiposiActionPerformed(evt); + } + }); + + buttonPositionsHexiposi.setText("Positions"); + buttonPositionsHexiposi.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonPositionsHexiposiActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); + jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addContainerGap() + .addComponent(buttonHomingHexiposi) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonPositionsHexiposi) + .addContainerGap()) + ); + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGap(20, 20, 20) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(buttonHomingHexiposi) + .addComponent(buttonPositionsHexiposi)) + .addContainerGap(24, Short.MAX_VALUE)) + ); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addGap(20, 20, 20) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(buttonMount, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(layout.createSequentialGroup() - .addGap(10, 10, 10) - .addComponent(checkFirst))) - .addGap(18, 18, 18) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel3) - .addComponent(jLabel2) - .addComponent(jLabel1)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(spinnerSample, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(spinnerPuck, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(spinnerSegment, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGroup(layout.createSequentialGroup() - .addGap(5, 5, 5) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(buttonEnableAll, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addComponent(buttonReleasePsys) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(buttonReleaseLocal))))) - .addContainerGap(373, Short.MAX_VALUE)) + .addGap(16, 16, 16) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(buttonMount, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addGap(10, 10, 10) + .addComponent(checkFirst))) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel3) + .addComponent(jLabel2) + .addComponent(jLabel1)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(spinnerSample, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(spinnerPuck, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(spinnerSegment, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(buttonEnableAll, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(buttonReleasePsys) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonReleaseLocal)))) + .addContainerGap(377, Short.MAX_VALUE)) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel1, jLabel2, jLabel3}); @@ -211,13 +251,15 @@ public class Expert extends Panel { layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addGap(21, 21, 21) + .addContainerGap() .addComponent(buttonEnableAll) - .addGap(18, 18, 18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonReleaseLocal) .addComponent(buttonReleasePsys)) .addGap(18, 18, 18) + .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) @@ -233,7 +275,7 @@ public class Expert extends Panel { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(spinnerSample, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(24, 24, 24)) + .addContainerGap(175, Short.MAX_VALUE)) ); }// //GEN-END:initComponents @@ -264,11 +306,21 @@ public class Expert extends Panel { execute("release_psys()"); }//GEN-LAST:event_buttonReleasePsysActionPerformed + private void buttonHomingHexiposiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonHomingHexiposiActionPerformed + execute("hexiposi.move_home()"); + }//GEN-LAST:event_buttonHomingHexiposiActionPerformed + + private void buttonPositionsHexiposiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonPositionsHexiposiActionPerformed + this.showDevicePanel("hexiposi"); + }//GEN-LAST:event_buttonPositionsHexiposiActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton buttonDisable; private javax.swing.JButton buttonEnable; private javax.swing.JButton buttonEnableAll; + private javax.swing.JButton buttonHomingHexiposi; private javax.swing.JButton buttonMount; + private javax.swing.JButton buttonPositionsHexiposi; private javax.swing.JButton buttonReleaseLocal; private javax.swing.JButton buttonReleasePsys; private javax.swing.JCheckBox checkFirst; @@ -276,6 +328,7 @@ public class Expert extends Panel { private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; private javax.swing.JSpinner spinnerPuck; private javax.swing.JSpinner spinnerSample; private javax.swing.JSpinner spinnerSegment; diff --git a/plugins/MXSC-1.9.0.jar b/plugins/MXSC-1.9.0.jar index aa965bb109f37c2bac6037ed9b07767ae598c52f..e67d2486f465443150a4d4469f1a49ad4ef79ce4 100644 GIT binary patch delta 56892 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®vjaM zh%$-8Up4(nd-|`M%6t%D#BcCw4$Z&aGB+U856q~^i0IAhhh)g_NRN$gj(P7hwTjN54Azm6bC7Y6aaDy9Ve^B?UhG1~1nqum`=;9rQ}7D_~D8 zuy(|D@6r>mM3P^DJQ_fUvSN2~wPv^Xay4UDbvLv96=e>bAN?A5uf*_P5tjT2WMmNo zs=s~K=$H(-atiQ0W=Ax-4BWMw0m$Fe0-L{G_{!f5uBbZw0)k`!`th$3LE(f9S!V-S z@1XcI$~_ZK(w_sb1}?_`kN+Gyz?+j_hMocCWDkG`KL~;CLHs|mp2jy1d%%HD_c{bZ zd!=5_QxN8)zBJO+Um*WdxdG3RkbvwT^oUk<{U8%hfg(Ya?`ul1%B#q*+nab;IDjea z{~7zhAr@5jR~!s{{;*j6FD2L!Cw}>1Yz`J$fG@_s5JHUOmZ3c@hk5Yv^w)a+(@b+bP5H9sDoud4#RI+X|UFr+Gvsbtnn zL+Cd;t_GNq)?qI;IPQuh7v8)ms*!vV4xTkdHe~b1wjl^@G?jnd6n4rgbv)n%~1lb&h1+%x{r89c}L4qd67;&zEMx7D|G81j0{`3PU01SWlg5Jl!4c{sM#7>8@5{hZ1Dej80x=(kQ@6s z+$;nE0(u7n0wPOh!o*5W14RbdDK0Ca`7>Ot)u9F6li(h&R^n2D;zijXd9o5`8mf^0 z`C3_Jk?D$a#m{<6{vr_#v}E&rk;Iv?bPz_u40Yp?G|3-AGUG^_E^fq4UwG|@wJ$AuYESJ zHTH6di4rw1RkkpRCQb)1++g`gtTFFcYrOJr*PgMiYsRJiEjzTu$(x0RP$yrn__OnB zAg-d{pto&cc+p>SsBNCy^lg_-5&hSFmHn$sGF8OtpAt+ND%pJAw4Pgb>yVoaW<_h& zdUl>wZ%gNxj)kylPfD1PzqJG#S|gQ7q|w{oC>#~7wS>WtFabD#WrR!efq6nU8K)># zfdXdf5;Rk8mn@3+a;A%kt(rUCGG(S;I)`}%Z$Fb0$Yc6p>IA5w9$6bFefeU##%JyO1C z_FL6hNu)`LBGEnItqu16b;7z_xg);iZrObD0frT7Q5IEBjv^juv!6t7j4VA4lH`mS zO)ili{UHs9Sy)Xv!Cknefe1fnCkkqbS}L7Rs-1{gJRz@cLa~S# zN1IWWzUAuF5fnDsfC1=OxcvgWcWK|Z z5(%4XHxzQ#Do-Vk$EX!-DC11JrE|8VBdmgs-NhU2ueT?XXeYf~YjEj`TZD|53NFWJ zap6PVWtY_cF}cAPQ(tWf!-8uUG(3dW#SCgu*$r{;_jV1i?;e&lili>n!fe*gs-RN8V`SLfqGk@3ISkBAKn>hbM?BWFk#+c zooXDu*mnF<0scMPdcITt@ZF#i6uyPf^ps@Y-Pc86#>S8K&=T8?q6mDTD_2FZ5ON%N zsi!Qfs@P_JDc)nUaNPY>ldTe7eqo1o(F7)BWehu9%mHe^o-0mv>JM z`;Z2AGUg4t1jrW7!_pfjocD!b>1S=8WXhSp%bZV`w-B4L;F{O*MQhwyethwkt(R_; zLw=6ZDvX#0YYEhnQ+yI1o-D~z8#x8B29WqVQV}eIN0pb2zfgLNBuh+1jDz7wK#o&v zl_f#=Q9fC=%x1vF<2K&6;X9G0{f$?=js2@9hLN4O1E{8KyWJi<0WlUDNM*Apjf=%J zTyT*4+eil8nE96EtwtytdMSqYlAy1;=xI$E2u1_p08I$h9*S7Dg@qIsE1OgVWwnPH zUwX6*4Lr|7YF^R>o>N$+S0a?pW;I!WyxcDRy=VHsfEyDZTHHMZ9XyYrge8`k#U%Av z6*H9_4oEVw>pd*#BgIi@@sV3`J9{P$VMHP(xJhu)?EdZkw~!$)DqMucL1kPT;GwIS$oPVN z3^FY$9~#SqEEQ!=7Vh#T&p;ZFN%^eCu!6od49HW9Y)0P{s<3ix+&bxt5Yp4HApHO~ zk#o38M;vmZcuFCuD@cg37`Z?$D}Ot?%s%89U8K1yVhbO3^mL9&t(`eG8p@PSLajKU z#e__$$|J#%Z-qEMlu9$R5>Y%GM#G>tSx7ZpoX_TGzyR0;9nlt-&77|j*Q5Eb8_{w-C*QyeKbL8jR@r_d5J zD+FOg5#V zRS@7R$}gD9#h1D+&E=CP2^_IuwKLl10rWM9nMvgmmEYKq3Uh5#))GEsE2S3MC?bEG zqOW9vUYZ!GU3>3ESI#TYm-XUQg3OkxY1F7xOB1DGM^RIuD!%l$9358Mu_EggSXL~YAJY}5Z{fA z=9+OvEOWK$Bkgk*M<8~}A_>Yi02Pt?i|Mk&tjeh0G0yn(V%^fH*`pZpa0ew6ZA-`w z!#7bK`l!LiQpnqEje6G$cYkKAk7A9>DZ(~&tY$2aEbjlAa zziSDz@O&o{AZs{E3XSC6k*a)$OqJ;>0(Xhj-V%SvTAU~vN_S<~n~pZvk9myo+#Yzr zJEx!KaR``}G4_u7kY^D2@l4r&04WarRM<4G7+}{}or%;~Cv?p2`SpF|G^_Cqm5waeLeE`@lL~9bF1bkDj)oLxoDf7N7+v zCr-`~*CfRI*p$I&p2p*}y{eH~y_i;sxC6>AXClO(L_u0%X>=Zl$~ToZBJ5;BC_8;| zCVw1*!VnZE9x~ej$8%Q>dp$146G3A}oUMKmY%{ zoD)gT#?v_lDRid|p5&CWu)|;pYug}-?y$y4h^2z$<9QZFU`^3xYIwf% zb@V}XWd}5i#g2H>gT1OmuwD+w_qTj^Ly$io<=Z+zRVVIZT^4VVuS#^1;C;p6Bqh7@ zyKgq1=5o3=BUs$RKPxK7B^Ozj%#2VIQ;0e2jx38q0;eSl07PDR;fzQr=AQ8R$Cm0H zzUVt$lth+|MZt~05z_d4|4xoXWAkpR#H94m>CpayH@2EKX8{(WIKB5mKx_v}ua@lm z^ToKiZny`M1pj0|h6C*{8q3()V~P>;mC+p=T{Mbrm^tzG#9XRbNaLe)VZ z^d3c^`l2K;fNDP_hwT=Q2pQAPEUVU#H+PA?0JT|wQoGE1R-~!4U;k4jDB-|9a*lT9 zX}NoJrp(OOqhn6PyBC?S4g%xq5&50bj>%&C=2VWvC8*cPFgO}ASCkL^k^PW)DgP`x zVlmr(%C6X>`DEeJNE6pxoN560GN0+acZeh3)AbY>Ak|otV})n^=GqZl*KHih7QSPP zcb8uHl`m?EYTs`}ocPBn`cYXxV}{gmD9(vI5<+6~2)7ZBvoJExu46Oq%30-}6b&%; zw`oO%nu$;cNfR|G(guCJ70;fv4n}}sg5E+|wBC}exuzq!#;~kVtiG<@#!g=BnW|c1uf%a_-e>X<2&k zKenKn;?EG*$9QK~Hb$i!*BlbgT^K>VHwm&yz#z5EI9OdFY`&8#>7_SbK8YP$)1m)T zmP;k8fWfO`be|mJ&uy{?36Y`i&pV40)GbQu!4sjqtQjUGS*> zydS%U3t^sG*IlHK`jk@v(5pHmJEMx2-xR4sf_v&``sgHc^yw0F(N^lA>essqpfMeF zWV}(YAWLyLMgOvyRk@je+gfa9maG-{HUAAjW1KI2Q=!hI8FhhmWugZ#jX#X#q$nR$ z?AT9z;1RH!ac?%0qZN(^nf^P?AHmdCEDr3WB^*S@|4WA>d4XhH!25yW&34bbHCND? zEV6;}RI=FhcX_Et$Fzdj#f{q!P+xRQVJ|G~Amk<)ytmxJ601JmC~#pG2Nz>n7%R+3 zxP?UroQe@3E~6XtaA9PUIpU0|1WFT2Dmq)smdFOVgLq6MVRm|J_{T%d@cE~)dlN*U zekSjIHS60$M`#Nfw`*_;TNha^h=%y?KN&)_e92fuq=zk%jmI4_m9n4%5I1~!eFw24 z*~ostA2qF0VO%4BoRvoBo~DYk-o^&mW96!kRU9p=P|kRfeMRN$ZV61U57bXEZ;AYu3Vh?c`>h+y)NAmO3w;hBvhT2ErJlHlyVT=lX ztMg>kN68<29VLCr8Addl!!N8sSkTKaHj*cwBqZ8=yhG7%?CBfLvCP~S>Yh(l5c%f` zkLR+mqOKe`fNO(~@2FXJ_i}!$1aYVtXyEgid4$h=jr#U)=c|7463hGk1Crdk zUxd}ltcL5D41K3fMt-(v(cH3!xk=~10h|R7l^tN5Z8`&%vH`RUM%P%=!u3{LEN)<3 z6uHyCA;zlHR!0wDg+uecc!0}B}8zckNlZ$t^+e`p?Buw+3(;${U*dXWFq z%ehrprhx+i@x%UC4`5+1u{CmWiPg}tMKeSDG55G!Fx#@1g{7<2jkd4XxkG4`Y6sVB zvnefALUYZC+b-PBbn|Fa6T1(4Kcd%XvX&FO69x~y z&&kZ)U9!jBesY|9pMRfw{tZ9=?R$X;kaes;n?`yt=I-hl0l4`bj!RHv_jEuQF`gZ3 zQ)K_aG+G)qPU*bLcw*_ybJNMVGFh5G(m)2Kvo&eTog_-eC$UFzD#qk(oQ}?RbfGrA zHdi=2CZ?#0&=DH}OUW44uIiH)(i6i*pit3vbmc1r<2_B;!cCWN)m&SB<7u*4cb&aP zYG7l^HX0590w_*kser4AvFXK@NqSUI`g?igu&E=9CLV)2tC(;Pb%pu zl&Ybm&!Cj}!=IA=Ct0Xas5cRkdr}0-IqR zVX)UtVVH)p)X1o z(dBt@i|sHT0`pNF5kn&$BO}Mlc*4cYdV(m*ct#!Oo1b)TV#K(YY8ByzorF}XV5={e z(++UDReHWc?mS2|X5Im0nN8 z>7Q6Cm8U0&!EMB%4n`g(06sszs|~!IkubQfDnD4QnH|n~`&Hc*PCr z0X=B{ZHKzMkv23YkQ1W~!qC!TX7WI8@PN90t1)Eo53pl8B;(U% zWjxZ&8yf6_X-C#(Bzq!MQ}}$aY)s~DKjx)k+fppk%s)aUo~k&{>S$UZxxQt=X*8Xq zuuzTYB?$k~*UAufYnjR)J-jAEu@&f^ZRZTS4(lZ@E<+7Z9Qp z5W^xYgd{XU$~VLmD6QW(e=7V45@0k~T0f-48(R0o*gpXGjZVMAM>zJu8$@iO6+~H5 zJo#o77-r-OG^o`ocSI?_?s|H4$6N;7?V#O@>qbpmN|YZC15P`FT-j(X zibgh3&Hl;Mlup)>J{!;Qh6^L#kknN@t*NigRdWX~DIntuH0k9Vl)OUCivA*;SP;(6 z_tCEZeW5nF&18A8Y-Vjaqf0X-;x^Hm^09h#0zX6fMqPb_b$iSHH;UbIOjkE17;%8t zrt+-oLu$4x*Xne`&~&HM%HGXA{DpvcLUYD5eaI6Yp?8iQbx0xB2a8+bKt$IcI{7M6 z&~5+y1^K^Go{f+T$r6#e+YTq65yNNEvyy^s3`Uw{leIg6v2Sk#m^@~mM@{g->2pI z%YM_lLbhLem0wcbex-}_hi?NyKe6=%Ch8e~Ys2vTGC%`rb)zg!d%X9?F=Z|~wzuE4 zNq!lZk}Gg{M1 z87qpYEopMR0~#v|THTv+jk-kkGN>yxt(0APX?}8gVJI<^5hoL*-;(-Va_nWiFP~vtcCmCVA4O06z}A zxUqIU&^5~$@kPvtcj)XI4W75<_rPGVw+v$Yq?94n$%_H0NNqk9ed8~mZ?e6(+CdRj;SdA)b4ecD90Jv|N$qasM^+7?3Yg#`C z7elvgom$&gP6RoslNQJTzw(WxF;KatD&Ro2wsJ(MX*XktB^kvD)lUc*;lCYiRqZCmrDTrR1g@I$ zB5jt+@NSavg2Zj2yD`vzQu3R+X}$=|l>2{lFPmiX78s z2vAF2(hs5`HZFIhNaB&|rbRt`TN~OZEEfs7>^4sd^n4F;_~<+2uehUhv5yJ664txhR}fyjjd(r z85d;DjPV5dZzP2o7Dk8xL!QeF>sSyOkolQ&#HpAOX_TlrlWbXxb>qJV4FK*sqzz{D zfMe{HH;dzKj!d}!2toqYl91(aA_0FUv#8;g)=~!!?E3J61JC1Fgy;FlP)@6oYo%*S zTxCz1F^xEN82Ol#bM)YBdj*?N__(>PnpHwv#Z$nA{`l45$^fPK7m%Z4W zu!c(oINE;rolP zKR^=(fGk{y?NzC&h|Lbka{ae)5N+PZ3*7>|00SlSEG9|raR4Tdm5P_hZl8&?`n^lJ z+LydkXLRYLXEbYcD6xjymx^wy7RSMwAYJ-u;iw{4er~gvEPcyuQObeOJg1tmzP`ml zYkjG$6n*rsC7{(r0nL)~rNni(jG7*2wHN}|e$wdp<-m=q8aK6E2p1#QLoY^Zk}FsP zKKGr24ETb(gL*s_lIq(}%AbdU&bSq^f8}!mo`HulC2>O$WV(R^O=$ zlJpR+j#4q7;PNIJ6#2rgs6nm-_V2FrU{R{JpWV748DM!i{BKKJc|FE*D~p~ETPxSg z;Xf56eaRz~K~DxFzGBORm9~-=Vb!VZD{pT{PZZqdsPJrha&;>#zcQ^vO`xiKW5lIi zpVzo@_iN1Z`ww2MNMi@wU&1u@r__mQ#OZ8{%khfMhC%ybfBN?l{?2QImb3BI^d%F| zuM=lEVL;vXmLF8XjQZg$H-pE*6HL8&XSsMoon_st4Vil;7g27MqHc8Z!7{tTr$pDrpkRryUG@jiFnLx~JDgZjwm~EbpxIUW&aV01?U?&p~ z?*^H@_n_6zypX}l14@`6PivpSoa`4JRHfwz^Z5r4Ce%Rfo&2Xs=5}G5=9{56c6D6N zA0QRa-JAG!DAph6Bdrfrk>48JQHDyb=1bnVBXy{GkaQC%)*k`j-2bHqH^1zajt)Pp zXr(xxN+ch&4BC#Tc>dik={(tJawE0KcFK1ZPhdd%sd6)j?ItYQZG5-nuv(!95RD?n zV;#qrdKP2t`(H(4rrwM9+WRK2VY0X11H@c?`7UUeUiHZc1%5t0U{7$1P!?AC(=CU@X~f%Y70uqst2(4o zGwNypu@orqi)1bohBInLWiYJCvzf37pjSxhw@n}FO8|5wJXg*wbhW4#i2<8J0Lll; z$zD+>8dzzZh+6zRgmvkAOK#eLnygVs>c$EUAB^VmIB{jxcG0mbVjmqMnayn`RR9?JP}@JWZ1Ru1L%jo55jH&hxz!oc zth2@)Df+7}ZV|UA8)rP1plr>ouojdK>dp8AB#`7VxBIf|-@-o^^W^w1f>58&ODs)F`zB(@pz%!L=#mli4^s ziyu0%4aHP7BA3A@PvIJIPHDzrz=>Um4g?G@8v2MjLI3qN6i#1Y!-%p+Rls)UFkEOm zrJZ908^VZ>2MGzzL7S(yjUa3wIRh0Hixyyp*`1A$X>S5pa#S-V0SS|<-;~X!u95++ zXMsCRk!x#IqAmZ#ekUpFTj!8!5j}SoQF|#%_idj+_X66n1e`R>59<(#=uwj@aVyot zS!#tyYDKUh4&&etpavt`2fRE6{Tw9678BSBMD7Hm?tVc^7)e>`h-myHI^M8#KS8}C zFc*ead|GTOOJ89m*k{s_LPK{ z(-+7*p>(SUT0!axgZQFxNc>@W*=<}?mrlCS1Y4&{31k9_FzQ@90VmR6Dyb%@{Nm;0 z2Y8>&z~Ot#PjGmjf8gR0o#F3#Vff1z9$|V57BDl>d5Ra(0TFeJG0J5*Fuj%ubGpfJ z+9~5^kB*m&7y4fw@K-!?`lLhpMd`IW_XVjen6gUjM~2#UDxJP}kG|0yTvErSCPfho^7J!)+mbAr*a-79S2(Rl0+ z0HgUM7M6f}0L_A$Qk+5I8oz3}UXi@c%+6xlkovKA@#Kx|0~jChD|T1$82TMsoze&@ zXMP!UlHA;KE#opyVN3npn&-ad19$cpFkrwVEQozCpx;ScT7DAAjSj1berXei((mEV z!%9j{_x!v?eXmbG^(DqnT{2u;;VhuIAhGd>SO9n*c-1X1y{pRrbw0n73KeGeCa7Wt# z@;W=C9XVZGY~bmD61!hxv;!^9cfD*Gr|%Z0$C_+&;yh2wd*!l&s*LA zAK!#_ea?yMCw$pW7EwuLGo8n}c;u<6^~qlxoO|zpY(xP649>eZmB)na4ocrNi%Kh0 zwv+QG(ymjQFaGl*$jpbn0D&{0tD^X9HB<7N`mO zcB}K6Cla@f_5sQn&|?BRsU=in$j<~97$iz77VtJ=_jmk7)^R&cl|exE0ZDBGiUtPR z76Z)iM|9W_AZ9dd;_I1tV9<$Kj~t7zr($C2_V} zaCkw#`o#hWoiDv`^Cmp~> z5mgwCUsQHI4IKuAq(FpzDZHuR02ZuKZMlK3WTC=fqKVfEv#q-!#dfJa`ea#1W3Vgxr+O)Fk2{ zP)Y!8F#=3{s3L?pEW&`f_k>C`z6zk3VmGf=mCvs?$=!C#lQz05U6sjVx14W&A0%dfrpBc zH{ls&!IF0z8X}FY>M7kW2zc)q*RzZJ)P0p7r+B=I64am&DmR-sNR9a;r^Jc7Ie~;p zf-c)UJ+(AOQOF9X7qW)`3I_1pbfQ~*@-;#h_3%^sTV#T1DJD0|(jT!`1`~Ki-AM7{ zz!R)?_EV%$TEUvCF^`7fmu_29*1}kSdba*J`Zaa^q1&f6aXPBIN*!Y`xA^s-$eSg; zyqc=QXyDKCooG}rNR*phP~o%|>EG&c*7 zyCcr(FQRQmd_he_+}uxybG!js>=g<>u!Mi2Ls>)lX7Ax0Pvtt5DZum_StR_5f>-hU zOmVGt5A-hij38K=rQ$Zml;V}5YLF?h2~j0EdetOFI8->8({siEW04}?4aAMfK@j-; zUlhxMLLJtOCp+@c0^}W*g^>KVxd_?Ipi4uRRJ3J;h*OzFcA{ts(MqI%5!5;zuC01j z%{iNL1Ku=KVWjZhfWN3lYEWAtv%F7tHy5)x9o*06_YL}id&Zj8Jv}dqWAF)eJk>_+ z(S1Nt`IP@$l@6E-$_z=D4c)KP!E~>kRIX+%iH`LsOPorA0Jd+;3eG`+>upR>Dqd3y zHv+Om-w^@TL$y4D>G#6_e zxG&95!x`(jVYJb1F!#~-tGmXE_|DpxtzBi-kFMJjLH0X&gr3ZUW!4dbM$XP3yaVasD{ zFu&|IK~A>#_q$$SbAuicbBZ-Nm>D`fnpmJ>P@WERCdwVLJW5(|@^{t;b3s=jit~*g z3`G6~uA?WIi{*ICG#flFJLEd>R~8m;ZXMCDI8CVcIoe2XN6EjuS&SB}l6VzxhrN?$IP29OA7Xie($%A~n zfIFojhzF80aWwLYjgvC8!5pzklzLAz;i%6hs8He;5jVx|u47*=Hms!ZyqCIKow}QA z>#ToWa1VKAmkPsbdYa`83rlgSs_RN0w|eqc8*2lN@~R%r01pjp5qV7yH3;VQO}k#} zHteW+3rocO%Cd20+4mtjKapYoVpcM3Kv?Omj~~jb%1xFl$pY0AaG1EWV&@ZwXWTL!7k-?=j1sQ1+#6GZrdMfEWo(=3XWB@&gklMIIp5yww zNiBbHsiH3^06!Z2)9P1rxE(+W-Fv2kA3$kZjb@KtNF_$v*-lfLKj0Uo}ni zpS>9}2No}4;3T98k&P^-Lg_yx6ABzS*+Oze>`L+m<^+d>rslq^(1C4jG)v;OYi(Oq z;vw2CMIuDWOIlIt%2$22+Uskze*r(%fZBbpW>c0-wTI8s-OqpguQ|8A7M%`xKF^i1 zKx+s4UXBO+G;v;Bd#8gKfSug%+78LITlIT=M72Lo2YxhrjK_Wio_D~ReoApWw}at# z0l0`$ZwY(?bn)>Md&5PS$X?$Skc7kI>U@8NvEzL1pmUJm^Pdcf6{fCJqQ=#HW%dX? zj$7#bv_~!Yw1SS`D~6!a6)WCqAlW;%V_8}J6$tXv$1(XjAS_0Y0Nk7skB$VGU?&+h zBWf|{ChU1LjPgJ940C{8^Is1r}0(%G@dOs$;KU_`wP+&M=Ghqt+mS9w8dk!%dhe{)A zN}0r`oMH0$iwm}hX!J0O!~MPxDYC43r}vw=-P!inHkbC7TWjk(OUr93MTQEWz&|sMroO_7&U2a`6o|%x7fHI2!`B<64v(J(_JXxhi6Yr00(MHbu3) z4b=u34va*kslfye8y&c8^ZB@YFtzOmidE5(4Va7+^$#gWS!Qr?DQvXu_5-#Vep$Xk zOUzqL!w4;lR~P*Sr^L}+CSBFPR~`2-j1Q17`_f=1fb^WH##{+9dNP2W-JXQ7V#QpG!hVL`fwmR>1~;J;bO&v$Jjn0l8d~5 z3kj#J+Vaw&Lz6Yt>BBf#3pE97KE~Fbxb|t|0b%vUdc(1n<(oBjBBHR`tQ@LxmKS3T z%BI#EfH+*Xx51q5qC;FPL+Mg#FNFP-J9=N8VUH6hDLH_q8~|}&^Bxpla3o$UpS2|_ z)%bXv#=q#W{4FzV_hRwRWpObOzb1FxN@gZ4Gy2cU56RxaHJ7#JaJG3^W0dkd3J!&g z`2=qGOn?E5aT_+C`Q}?Sd2yBe?}s&f|497_;NAwlf6xx(upK7|idk1R1ogeMPkZzc z$3J}E<}J9RN3laMY4wyr^!2s*=eW-1jr6DFXdXv@Ao_YXlPFUZczFLjT05{W6~?-` z>bgZ_DJQvBQl#pT@vS1P^RbktCo$?&?9#$yboEGudQ=R(y%rReluTmHCt25{qM}UK>8ofF&|} zCBjC*lDELYZqt{R&!}g1x=-HMMr)f_)9%HFi2PxlH{vwNc3tTl^vO`;_#Wo#c*7Un z&)jw-$@VALxW`7+T%|knIsA(wfmf1NIney`D&4-u z_T>oa9%$Sq6VD1lH~8T`a9(>wRpp1+qJ1u^;>xSiGq3tW{-a=gz36p1V})*nZdBz4 zK7%@(VIU45LCawW<1;tW;sei*`B@5~-5XCulls{^XOGbGEwO*CRB7|xQ!#N>tg z3HcPR9uB9Cn^+?axX{cH`$NXAS}UF%>X=WXF*ho=6}pf-6nvK`9pvGh zY*P_iFXow4FXr>kVk$2@z^+qqDf3LWQ09oMKOAg_opwM z&?_|Eb#4<^oONO|GF=p7tP!&tUETo7V$Tyv+C8NKjaIhugazuZ?HHZ;3!h3~NXa@= zxh6}o4)yBb_4a7bWhx?h*k$g;`1jo**?tmm$u_l&!eKz}I{{x1AQ&n^XqRH{9px;2%)iK=w?hi?NK6d9|O(N{^O-j!->Mc)_K!&Gz?f#@n&-DR#2JZh)=+yhq6 zNj*at`f`#Lo!Yb~Tn9BTz5hcZR!YaC}jSpC2vw0=2;Wk0Tzst_G7f$(FM!m8eX zOBCm4Q&GtoI+~rU;owq0M`)Slg^TZ$7n z#=?b0pWU{$gy?;L)7zck|FQ+=3U*-sHv*xl>H`A*U)liXeyUyLKb2NW^1eDXz!P;H z`L|bZn|2yD%`ArbEDVVlb;K`oIt>wSh@#EO7zM<}su9yvT8f41Qh1B3cZuT(L4H0Y zZI7HSZMj3g6qMY$jZTN=tgim)3Zhy;GZ)J*Wti6R)22mUg1G5omV>Ot@{yw$97~X*JREs zk0avoEBBrM7@^}qaE#!|KsfgP)qr1&BKI9KIH6k+iU$kV?12fKz#M|$;RuXx((7kR z&^*;!4QjOGSY&8Ne(gNXTMjBgoI4_cAyWa-sBlJ(Fa#pYTTf8cq}F>Wv&-8VGXSACEaf$#5#xo>POq3WF*rTQ^$57&GETi>M^KfyWDJo=GN z$G|itny%}Sv~M=|zR}-qxW4hGTh_Ng)bu-12*IP%_{}d$82_pRYT)pG@`a_Y{?b1K z=v*cEtG-)}CG&*vlEJp@wlxS**UjAF+jV!qmh} z=LM+n=Qo(ZAc$m=t1>CE_|IW&l0r%_^9-NoPn7W(srGt~t^NrWGLvw-9=;n3vn=h@ zGL7=eRx4}0EbaU<4ycpRXC--wfkv@-0)%ZH$S0-NQWYEG{?Na405u0<1;NT!N)Jg? ziKPe$u(DWbLrI}47FNa$Q?Zy64B*Y?l3?5K#RLW=JSGxv7XycM0*Cdkp%Ev@B4PTS z!clnr?U^3ac;VJcJk`w`?|$TBJ4tJujatg9r(%f&INv<-<0P0&6ocGEsIlh~0hD@z z`c)L3Kk1UBX-?I3fY7d%10z5@#^stQh#A4v+i=TEt1JFe@T9c@@oxpjKUUH_B8-fs zG%~{OmW)i`)?lw%e+kWWZ=u0?@G@uquf;tqaAau}cW|SdGfRV{dD7;f*n3L@I>V@m z+nt)o%m}s|yTv|FrE;C&##rhlmY3=ys3RKxz$Z1nfH}w$tA_eh!>6Pk;46)!SDr2#k zVi#v$?H~c)aJ0Enw0HOL9G(h7XPx1?M1f7qO$?rj-sH$YUbM9i5 z6dESC`au%{08m|w{cdqcqtIx?0@Y|5;gQsYw@x zY+2QyqOY4|4RTg`>hdb%Z{{>@XC=CH6<4{OHinCAF&f7APr*50IHY4NcDYq2HDMI7 zc#o@X<`t5LVo#UQO}@Wa?sSCWh`_Fg#QuW<+{p8udd=KTQ&u*nVxgGg-@YrY#Ar zS(4Z|#hUAFs1?7B)q>{X<`%1VL!}KHEYdPvzEqo*g9RuT~MmUPJXz{$!#IB3>4FA_+p>; z-`4Bg9JL~cTQ?*{`j0bWz-@w^k!OIcch69I6tKevuhDU2s67g4t#y6q52(qWFdLuE zer=SOEnXd?&*k^2kR5wwe;BPz0dGO~X1DKsUKn#ACPE(IBb0J}%TaCuM+uMQx0gu&~U!amr-gcW@!N%7}){$GHd33qYTrvZYz%- ztw4yH+Ka*c#`w^uz$Z|&w#9O^;>^GVj5|xJz&qtssnV6pF$x;Tj)pL)&H4JUv5onL zu(3_%`Y@Vuf`ESBdls4yg;mZ_%|ecKUgjW9>WQR#rPP!@Z+lp{*2a3x;6W-fjtF0b z=^?F&-lkM(N=~Gj5^fg;j2)i$?_C04ciU|;^HoYKrbcH;?&#=eiz3@0WtXtg`V=kk z{@UoB!MBbOHJ8ty4ccfMu4z+j0X`Z2>(p=DV$}v)x``Y`q;6gzwY5&r5nQGo-_@gt zrK0tVfsI%Ld!Rb9=>+9x@u2QbY~>`AMJCRZAW}63CMd#jlfJ6 z_1M`lP?ZClMl0u%z04@J7@VYIn?|#RQY!O;rUi(?&gyx^AE6J_Hao2EC1NY?_$`^4 zeH0n$R`;oTX7l9Ock%FT)5YUV2d3C}hitlxfs6 z#3eP$Xf*|mF)a5bt9GWSK>ccml7(EJsY-`qB%8KvvlaE}Tk)(Mg7?P+mHh=8F%c^Qp17iX{3WZIe(z-;_3H(Im4v?VQDWs{vNOQiymP=7f_&Gob&mU z8s38#aWn#kf%roy@DTkZi5*BnvP?v?OiIzR7ut#G=s`FO6^cog6_DuT89uhTghqai z+!wRZd$`BRc#nm!bOfI)#0rT6TkKAKn6tcz(%(%Q0lR`{VLKxPP`jLj_X5Zq&kOvRij4h6 zchxc*SZvpY##Aw~?#k0Zo`Ij~X5ev*?m6>{7{D;3ITg)}^%7U|KXP8MYg7g;zd zx(0^GU`7TJsv*c#i%BcY<`ayhQ=vM~%|e+uy!U$t!J-6biS|18%gt+p%be7X`c#ND zT9ZIf*WLLpF2P*_3{YBZHnEE6BHZelK*tm3_3fTV-`qbjV+~iYXdJc9moN@e$41ys zwj7wW78;Gxg1A((S`9o%wQ?oGF}uW8$qAYme?P$fv)=v(oZ4*(-o_*eRfe!YYgEDS zzQvNiw;pVaniz(by0D0gcbbTN6=BI$zE^80{Pk&AWz(kbIDEu;hsp02Qvmp$Af3dZ zm`~6AC8i$UoSfjhpJ-rqdN_U}|Apy}lOHY?Xvq^^8<_-B0ZIU+LApWxca60LM!M{R z(p-)*U|Nm>N+?6vP~|b4xTa|qI7pv2oBqqgRixC_MjqL!jO}dmCAZ=(CO^Z`gs(}- zM4V)Kix8rs3qb5^9XZCG<{($Mjy1i#v1*3RN(^T^nKu?=%csEGr$x()E*uvsFPa}b zhBm4Pv-;#pU7jBdVR*=fMf}%b+No^Ig2Cph{mdz6!1O6-v+L?pTU;gsy+IR3q7r!wC)dQpxTCN^E7yXRi@9@L%yTtamFo30}sUz%&ao?;EIR)W{F?{fpIHLam=| z9cioP*&eQDU7uZlA$PC|LQ37iv4cGa#r;Pv}21ODbb3$lKi}USFAl7 zN7-8*0+x0rz#OA>MBTnkZt5m0qSntW;g!Apo`fnF*RU=!H=;th&68MANF!NgAcoqa z7gb%TC92%`Mk;cBAxghUdl@vTr|z?t(0bt)m*%pTNl>0|?*+PK%+n_p3Bt@MWN(`< zsgYfnrND4*-j_*X-(fCQU%XfsuXG7Jh))cN1ezNA_+sF5bF>7{x0)vkFvP$oT#4I|-_NF#P&qvF(^Zf4%$j?G0iFJ-gMxVOtp4nn3L~H}Zjr z4NJ-c(D2tO_|Ogus$T{&paB5?*tS5}hGCULWM7p0LeOuu4?8hW5HK%A(pw9hNz%fL zg!G9cxb4axF=B^lJG)g$e=wb4G{t_4ULvuj&NlT=rfqmRXOIvjpXIF<%SU(e0gwbg zs!aZf2vQOx8)8BeTuVXQY?n@832w4J#R@l8-nuyECop=6F9eTc za?goZ#0f{5yQpW{?28`F173A5=SeY@#XN};P%2_)@HOAeh{Ko?-j}|*2M#;qsI&MR zp5r84lkiPMg|AIGpSk68J157}df3V3%`(zau}pNb;E3_CkD;GhM<{2b6fUJMvf0eo z(##DSEtbd0ZT*W->4@xOmMHdEb9}(9KYBKT1~+osM6hutWfWS&AbLE5qh?F@ zmdKaQ`#4NCkJM`~uc_V&?ri>A)4UDMu~PO>XGMqtR)5ml6`0M^qgUk#7_Z)K48m%L z5DfCF04N&(f8HVflTj)DerH@t(6MI*jtZ#{jqw@$5c5;|F6iHqPqN^rQU*?zdu?Zg zAz!UaZW;8fF5xY~a{+ZBPF%fN#xp~w=3P@W#ryQU#`k*viq_-AbF;f^_KWEe>|#$1 zy`^HsycDf$B10a#8PX9)_9u2!_kpAHK#}islLEefXRH>6Zt&(3L~4jIWQ{oru(y^k zR;x2BTAbu{L_C}X7aY}z^&qYB{65!woGH+!N_0t?XBvXeE%}~3CoVjFR=B!2Kjo(n z042CTC|xoewkTg@!UT{nY|a&c%C{d!;_%1LnPksMa^S3bVjk;}zQ~wr+Qy?J=hHp( zuwitF#2A_{)e<9ueeSBhd8H2(m?6CBQDtoUvn(d&D_*5AoSPWYfn5Y*@q2|uaBIk` zGY%$;|LzV-QVj|pb!GU_oby@BtPj^$$9%Jr&s%JvqiVY7mGnxpg6qfR4pHPJM#DP+8_p)|0jmV;Z&FAZEm*dxCbID20_Q^(Ay?|cZLt$Hdn-W z{MN=eq*Ai%W6sX4E%c^N=1a!+4F2}zZc(mefa6|$Y4y5lJKo}ceVv}x2XVdG2nq-xDA#zZ z4HkFdsWuMCQyWln(_?N7F~l>`g4~zJhZNT-H?9_`myYEvGpU=dT>}0Fz26J$JuQhd z(7=)+=aU&KA^9AUN391S&c{+x@}wMj+d9i=Kmv0UM_yr;wPqZfGP@guX>iJL&^y1s zr&c&2GvZAxm~df8qKNDX1(Ud2r)&ZVDT8F34Rob##k_3K#%g_O$%R#M34;%rDE2s| z@9RdeI~BP`g&m1xs}-X(Nox4+;pA97OZvzbm9hxKNaPB*vY%H5l4Eer_>N|8Z_%bp zDcKVP4DT_r>`AiG#Y8I>vdXi|L0wetM0^>4pCHO0)95lY$kvC(bE2gr9RH-T)76~7 zPqz;I$_TOS;uqbe#{lVIwuux&eX4HbLmtXoy!3%s|A-y~(oDA#D(pNZSF=M*o#+6J zMuVN|B9lcs&>Dkaqnf`G5ooFq-|>)UYBMM5XYMio6RA4-WV1_OtjzN-R?c+72Zr8& z$O|VFBNm2V34{F)8)vG70)qxZ2Eh4$5eBuomfQ)nXw>=q1Je!b*QcDEZjjC%QbGbd zs8S=^9*V04$ChZ@V68Z*dEcp8zR-CKBNLVnlf9EzX`j9(g^q6?%vD|dADfFvWL}y7WqyI$I;M-+NVSd~x zv3k)-kxou{;I2WnnUPYSN@8ePq^R>w@@6k~&Yc7@2NywBSgXcPUAuL|kKiilQ>=33 zjIE`6LZmwHiMy}j`MYVR4ev!Ys4rN#aIqX0y+OkQwg7(l!VDa|7= z!oK{DbQ3GL?=SY_LMQ(x|87EGxdk13iLZIPyg7ASe9k4c^WSEOr06X5amhZoI)?iM z9W3ReZx${XtO)DQDdo;p8V!~~^LAk$rq8*MGj=gH=P>Q^U4AY=gVTt9oxC$oR0cCpy@uGH@L_<9Qy&kPwHh#62p}Yb7sae1sbUVl_8Qfr}e3wM0t-wXgvIA zIZ+)z?MkOLGkfqP+&@Lf{g0yWR{|%DZ`IalaPLvFwFu9qaPcc9Bz)=_!daxxT5*kV zpM(|^km@2`zeJ|M{8z#T{5qz|3)ffC&1SVuqQeUpic)PFYlw0=ND z$nl+g!n;grAa3|O5Lj{}Hz7Sq__(?z&KPN(^9i-@LZt$s7@5;S$xZ`~s zEyPRZ84Q}nCA?{b%K58VLPu1D;ZZy|ULfdy;uEL9^V4G0m z#sR#Hf-!67t`#nBn7nFM+#VAl-}Q&u$%`~EF4WUlnVkA6@!M3IlNrNjras6@pA#k` zfhU#GU_TQ<(rs&`YOoT)c;!d9VIAsFFHwTvr!@xTtIipCb_iPFNyKItiA<8e61-w&9e@~iaG{k;u{=YJ-S$h8E!FDV^{)Ap# zcsBft;E?;b$T9>m;EMbuB2B3LdATp0yMFGr|5y-f?^OWjB} zatULVg+@__N}=^&xoQGOmDx!~5F8Cim8+#aK+kC(Q{x_#!3UxAO)PLUoOJ!Z(=Bs=G8vy(V(82mOmK}jJNrKq8kx`1dXdc$nQl`PYzvDrNT7t#2RWielxI*05ZM1%IL0nfoE_xS>r zN52rgl%Um_@s+Un*#i|0IR6beDxY?;d^#4J4mO4E_@eQGFB)&o7=M{eNff1<_xVy= z2|syJVET7SGQuQ-loUzKm@sDZG9JB3yoX3d_fFn-R0al7A|^YS+>BSc(1sPVS8tlL zKRHCO&0aJP;Cm(6CXIprAlfi`v=h}Q%XO{`PaYZ6SiOT3GStmgh0%_mCQ6$KD0q>L#=VoVBK~p({|NL zy%vvotDr8`=iI-RE&^WGFl%2l-UKu_w2YY7$*U8>Arh0=pKOCwuY+t&Dq{3JZ*`se zD}fVZ*8Prtaq5=%kq36nSJ*=uVm%!Mml@-t=wuLa<79^X_`WzW@zVD&LsU>qP^!mB#&=Pz;GocjzTN>s8q=LNodwLs2JU2>J*0t-{j1 zbgkM>YZ4JVt`Tu-q}|k!iscG zzy_`CA#eTw-lqicnl&vh_?VUvD-p_IHdMLGCMIm0eL*$^7BNCLtWzXvH&;L}YT!P+ zly57Zvd>C#FyU%b$2Utf-G}tn(@I10V;9V+k<`o7b?~Hje?+UQ1Wh!tn$x`7&3B!l zu;JVWVTDS(jgYb`P{c&Tjf6G8$&#~_x{NL9$zMk~gh_P3ax@HB;ZZ`M{#P49-J+ zFk#ZYT5^x@DXQUQM)aq^s0O5)F+cMa1QDnJ!(wj=69%p$E<6W!8SJ^g^{L(qU^hTj zf5Azp4`5{^#Di%sh*t^DZd}$cfxPnV+*& zSipbBmsEK|d7~ZPe{eUrwRm}Xkz> zSJ_SoKESoURW-^UAEnyiy%RYmGU7tP7>C z&FR34-6d+-nBI$pMd}HFX$>SKFulbxCRE>n!Om6@Rdx>?m#4mIgbz`T zGfm7<+|k6&Ru-i#IKJ0;@dpz(aaTldgFGRJ&`aJ$S9Sg|Rzq`>4qsD|-=GNe74~B{ zb(copjJjKA!aEe~EC}bksiyJl^@{#j75WqpdfElYApE&6&Ql$O{TfDN7btJ~EaNw= z%J?n1%!tf8uO|i8o4kJ+{$&VeyU(q>^?R53IaKv)+@L(o8+>=|1Fd#9r{vqzAV1a< zr8cncIb)EY>22I^oxI;sRVE0itK%UgmKT2N3F-$iMpc%-Qd&1^p*{#G*ojp%yYdt? z+%?Iocc`1uXf^#)N@A4T3GikrE;H&<+&7P-H|8aX)>Fdqa+!kv=~*InWH2jqPQ4sfVHs|IdtGMHs4yqNe@Yk zs5nNJhO^mhkf=I#$1Tt4^A*6e_GC04Ghz$&QL&C8TNHVy0sTT8dFX=)QDG3jk*)NH z!jNG3N>l(g<3O0OBNk>z!$^u_U^r>ruR$tw@qJDm-r&JD*yti`qmm#N^p%`qkl{KG z`QBStxt$^64M&m)$qk@6Q%7pwo_BS|*#Mjaj`qCfH;oB}T8Unxbm~Vu6$c7gWajLm zaP_oXZ@khS8wg?8sol8AqEkZ)m~$nFad&9LN1f^&9tcucH7cy6Iwka+K2q2zbq7Cx zIP^-T8zBe=r5hs%hP=}KA|^eG{lf|8IR6NAo%|go-yx=OMt-0%=eZJwdTnd`pejJE zwpFXw8cnBchXz8Owl&x_8+oRQXU_#teHdD!e#3=bbL?&(>qy$qR<|NUiDakfP!Z0) z!^Y)%BZh4se{1$#%U4tL2U97Tf+BJy$Zi^PDReY7j7Wenm}xJ{cUjnQv*RT7z&j~S zHMBzn8OuxIO>>}%Six?+px>MU8A!fkZ)VS1PhV#^L|(n72kB6d`6LYt;sP;-`$*rN z0U2z*FAWFiJ#Ot=y@Ip5gJCI;4l-Dr8eS$L4Qw=0q6!Yu^|ySNOl^!t&(i)qnYB7O}%!bJ1%b9%!9z-ai!K4T8kt#G{#eCE~Q`F=n1`IG5PN~dR zy66zSdwf8O;LufxjPj1W(6o?+UkWBNWEzT!*f4YH1>t#l@hE5fR5}<@ftIK4RqegK z5Ps01&gIn5=oz7)qO&vJ4GfESB#01FLYR;dQBY`s5n$v&erdfH=vC6?SevV!L@C26 zDyjqPi$4)#UotnehFK|4=<~1k!Q;NdWF(CSJH~*dyP6j*1}qTeicO=e>yVHf#aA58 zV3*dOa{Uq1< z*^R9$1nR1C#Rc}E{;q7$)FqSd>6wDNM&%C}fn)v!w9@9^NcY`yon=n)B9S&K8%51S zPOyO1seR5WL@LP~wUGgXsi=L&2lv8>5~i!U4yM>yQnB*06#xbbEr{M1Z>@#t+2L4q zlw9OYW@EWpsaH8>P3)xduD}3mH0KN;C}L6kQ_I=aKYIPMZcdu z@QI+vGeohSGb28~6W0dfS$c1cCn7ESGu?skGzEF_;XJ>!j%{mxe1EV4SIExSM_4!Q z3{tDx4nNX@G-JTy~7s|3*&bOt0WPt;1Z z)^Aws8KgnU;aMkhtJ1nvt6iy8Z8T}MsW<(6vN|MK9OK7<9AU>2+nnDYl|rkFg;Q-zmS=s-o9h8YtK@CT z3HI&uJwI3hnu*~e{0}dpaEf-`sJ72PZ&}8OseC}a#g?_9 z->!PHn6}Dy={ut^^q77#CW$&hK@|vQMMQqi-?(-P4{@`0!ns*15K;wnYxjFO)C526 z`QTjjr$P#*N>Xa?$t*bV6XX&V$)(1Pr>2DmL*4og;m6;CA`lLQoPf|A(eVST1~`7< zEa5a=$gv=LYxIj7LfDQJN8sn0uEjqJ2+=b|E zztv?4WztK_8W}wka9zA{^cD(`N|ir$B|=M6v&%-C?{hl8Sd%o#%N48);(QNu(v89u4^aG( zDCdTtKg`bJjk-N|V_TmK5^VJ&eZAS*9Zi3J2d})>ZKTi5Fb|Tn?U_J$+Vlhq!`P7O z5Ywfbbf&ocK1m=T*a31got0T0p&eA#!9Mq*Qt)y$7ZTjS;9<(stU{2&MDa*beX3wK ziB};&5U?hk40);XXAcS}2f}5mmB}+cYd|71m&%f2W>E_QVj#v<~a~3`q2=I>p5~nk*>G{f5RKk2IB({>H{*BC-qoQM){@= zvN-{3^(SL|7k|N0Zha8=dyrV)p!ti(yxTuc(B8l4mpOet&fO@#MW&xi0G`R-b^48; zgCg~<{xKu%wmkn1=HHQb4%YN4b#UbnvVY^Zeun!f-?e}4hy+?ZQ+^cecDw8Jqq=8K z0oT0J%pO+?uYng9mZPgdvko5H*l`V$2UYgjdKHrX(ay zEr>{W^zyBOk|b>LQ5Mp!&3FJ4BMR#JLaTU+Hr7#6kF;lbo0pT^S>_LpS>~bWaXdXu z92&$)ct_h(4rO^5YI&z^reQ3EgS)zmcNe@*%d+bDA?=N4jeNI!fZ}iBv?TArmf=^Z= zmKtO#dcY|O?(XS7#htQ9q}cVhN+P7C(<$Bs2ZI`|JrbwX?90l=KoW8(vWfHs0V|1q z>8uhz!?B0Cgy0Qo#*>4!DKolDys#-9%1w4L&pb(NXAj9J4HmQ6Kv89i6Z*>XT+Nvj zL2}2r6JDbEvA?=3!)lWA4WAS4)z^Ci+W<=?X5f|rP-@ac(acH-L*HDfG;weFpj$~( z){3}^MSjI9tdhc1x{9T&$+?)~P{Mh3vAeYMD?3w7C*HhLf%iV4NJrL+wrRfbQ3(oc zk!#kuy{Ntv{xA*UBfUl^xo20 zI_~2_hvMD*T&+Z0&D%;gz7Hxvh5bEc=J%(p*$fq-k^2-ms27FHdqSR&GhtP=pk1&2kH8EV74&Q|{r+g9 zD7e!LHwbTM^ECz)^GR7*nWlv` zi!0;S<@*aOLg&4EuIz4k+-$n5gs_7if6xH2IR!W+x8J98JfL$<^>FshNom?j_Ih46@~H*bnnEI`+h9jnv&USEscP?RkizNkN&DSz8%s+Lqe<6GdJ z!iIcU#$RGqZYA8uqvnxHS+sUA(FwDZ0(GNfuf$QIweg0<4!F z*4aZ1ESmvorN2&6n3l~RfPsa@{c0s>yleb_3^o&sc(xqGE^pe+N8EeLrlWH(j&B^u zoQa1iKNc`3ANaR8@P?I1P=GX2f0SR2U;*$+YDyHBd3~I5-=nyDGJ@y@3E;%L!9_nC z`}k{@+;fT(6iezWDRVpzrnn|W6@CLh=LuC@FiAhQmjxf5M^Jt*A5at^7#KE|lci?u zh^IIy&Tx3YHK~pnhoHe@4MX{K_$#|D4X+e@tt7+GWhB%|Q5~9FYn`cI5 zzEL;Pv#kXif1cY_c(|w$%3h|Fq$Jd=?m~cvA3G^&+FY1bGxC8bT4mX(p#@3_&x%y7 zSJDAsunAwkxGq(`0qAH9b%1$-xwN6Y8uhs?*OssKv_}1dqw2CWm?kn(6{vf3A^AyX z;!V~1>+12$@@G>Ht2_NBI$HSvH_`7_%45Ez7(Dm~rUebb49lVmvqkl}%*dPzoN^0` zOLLiaT6c1g*?KD1@`A1G=G4Na>}KzRNAZ=#nOyOe%^7|1mDQQujP5e8%;x;U zZ<)>Y1s|EsW#EE&+Fu*xCuSF*GSV-L-eLkUVHe(sg?`yA`!nQX0?RWnQp}en0>-0aT6xA(^hTfIH4`V9M{~zdnp{kD)iiB3voP`Ppcw4^Hn0 zk!QmByJSYLLxORBB^TE zb*LdjCyioPNbd%XjSAhRGikd}f>>e_dKiiYqJhu?_KM$(MM8_+qxmKgBFk7x(yBCn zWRzqBb6F@iL{aSuhKg)+P^{L)MQbMegcCN_F;IP6k*%35>t7pvME-<_bv+DdI^DO? zn~NxLia1uFNY+9kEd5hL zdFmpIA7QQYMXtZCZb52hr>?a{NglBkyV}u)t}hN;;_NlYw^mWu zS<44#lTWa>ZBmf^7I*VpX|pvpx}ex41M3LvcV|+?RC?gpTXL=8us64=7#tV&4b%Y2 z*H$v?>HgXsC}m+#ak|gguZ`Mw~pak#g~I z=BuPCNQM&tc$7zSag z+7^rSO(%c`9suP%EK|(}Wp%xkx&}dY^Mp0PoR-ch$+Wt;_UorLT@TlI=MvL$f(L%u z@--?hz^TC0u0GSYnV@bE$kd`WWmh|4YqBMAB>Or*G~Pd{)^dyC+F`n71WKXR#9g^2 zsdgz>;mSnm@u7_rs>|qzyE^~&84BwYtcQ3pP1fc-kr!U%VfCrQZQa+c4C8J*6xkA1 zNv3I9ZT<@KDCH~^*?S?mHAQmQr>Pt=@Yo&dJgBJCO2#lAR@Gii+VBiAqi%TCY-DXY zmaRx>9P=IYIm}>5z==(kG@jz!p8?<54M_T!_vK|GnXg`9_N;fZj~y3#k_N5k2K4s% z3%Uv+nHXud$v#qO5T+n|Qu&>5%w||_MEL`hPKMW7*q;-87@}g#hr?qyH?)3O)XEvS z+a|v1OH@XAgpo7Gqy)Yk{Pg^3kBf_~@~RO`*Kg*2wD-H~2pASRDP0M!Z#D32fhA*N5t zA%6{53GXquJ!We`z_G!&jmZd}4W}?06d9%3wkm70G>|p52?u2cE%>Mb}pDYF()*2)k2ZX?eirjE&s!g(?fy@+=PR0<$ z%<>K%2Q5CCn16d?SRQx2x$o1%Xie>J40c1)*k_Po08%LhQCSA6f!{5TRFaL*6wkQtKDhJY(J+9?~&jL3S{9_8`-g17x-VRb=Wxb*!)q^T$lB(axVQ;Z2+ZXeM_S+wr`d*-tN-w_eDqDt_7bl(J7VS+`eyvlsn2_SYCn zu+~jrAM_60>04HG75*tma1%5BO!(O(o@!JSd{jZXsl|~5t5f0E|3=jyH(r{l$o352 z{L)qeO|SxSEd--j2Dzv-*0VCT9`g290#3A)Ohg2wr3SVYAx;#MO+=ru3!&KkM6olU z6Sd#a#WQoW3+9GY3g+&&t#`!*&sH?sWPtwtAO)4N>NIhx6(J}rv$*7(*d;*@G9NkvtK~9WDuF9jq9&_tG zSf;?^eIL2rcZ31tIC4F-%K_>95O+;@w3<-GJyk}^L&|3;_`tEqcV5tN(}pm z$-UAQ>MdlifsVaccX=N2tr9>mW$ql`D1FA8AzlG?@GeYXpZ*?0V?_5X^P1w2&_dvp2xS9oiO)_XkFC7fO@HCbZU0B=_(K#MN z!2DF{goG}*dM;^3RttQy2#7Evyavi!q-(M*_t24-;!OA_nIMR74%LJ(xN8oXLz)ZL zT>3ih9r;f}v>@=*3ybI-65JL#z{VBJKsh&O5<=I80Lw-?AiCLerg!Ok@LGD$4{Zwg zmMoZ;X1gDKOK@Uqe}(<3K*Uyu`YhHV9HMR6BI`tVb=HG^EH&f7+5*oFGHr1)&DTNq zZM_WqFNtItc?I4HCe3W`&8D49sDk_WEy5|*17_IT{5H^zG8-7 zfEBNkxAt89%H4!uzSK)Ked@RIVuoIAFo@>O7&BMWrcYe!5MJ3L9J}l%HsVL3xxf@y zAPAIt#Y?r1=>dB+{qn;4La3~&D|{KVs{A4@aCeMe)mjI9Np-Bc!RZ^WgU2tQ6khnO z){&$yV)~h0BOHR>>00M};nh}wev6Ml!>E2pYkWD4!v6GhI9wW&aa zXvEstSqL^x&wjIEkd-|wL~VT1GM@CcsUTc@P3vMEmYtIhLJK!r zAAWSkuH3M#L&`q=%H;~U8#iJP!Ek^>%s%$YxjXWeODE_P=T?AEG*a0Wb10{8;CuA; z?yvoCc!{EK4^wfq}Z5{(QV_Ka_?_?DcgbUhe*4&FVY+|pP+;^uFn#;J;PEy&mxxJa%g0C znTrs-s~ZE1r3jL^m9^QQl}_RGslj)wO*y;^A_MG`sDU?GKS7hg7u4YSY3_F@4~3pJ zHNSOJjqj=-(mcy*!gbRw_Y;n}J}b8&d?;N7cPIT;*+TlHis|njV|LK-fRUrBQF@_* zJ>=~p6jtyRQ}Gp+d`WnF6Xui8-8>ZtnGdR;4+w7n<;tQ{aA_7yX~192QgnJ0YjL9T z%q*BW#{&vKy8q!UF-mX1dY{r;uxDL0^<-2W&3Xt>|V&@-C#UDANt< zS#hr3*R^<3KPsvl=)2Hm7gbYwF=toV4f~$iUDRClgPwub6At;E86WIR-nn6gl-BJ2 zc;KB-=O2zcd*YCK$DdY|-)W=AhSPm;$gH5wJ{}vot!CrsT|}g8Z{H(RXUM!bi&54Q zz6E+Ob7Y>S3mo3xf~h0RIR!biSKxtH!_qJeU{{aVjx@nX=q?+~G^LN7mwvi%%s0io z*%EKB|2Xjce%$`G)4$BDapp-du2W;U@_?A!5xvW^tZwr83wfDPW0%WMaWW_=9g4Qm zlSALyAFeUERbjlJriyv>_l-~$L$cMoLp6}?JHxElzUkUGokH1RaxH55#iMqc&eqUMaTr#+fWL!Bz#Fzd!+$Ert?Bz@wG^;S8r zl)t_LzI;OuYbowokNA2u@1eMj{Eh|d(HR>!cCKEd)iK%|vW^uU2wOW>q3avEBUivE z_V($%^UZh1-(KJC++qf`HQmz-f6Dfx`UuLu6G2VDBZhX;dl-{AP5~kgOEHy2=7*IVu!yf^0Yb8h|&Qt|==Zm6dfXkrFRcu{X^&1v}dsfWyY8%lYguAe6Q zk9ib%b~Jx6P6s{vno3T*zrmk=GWiU<_5|I&Z@=}i=Y8v0kG&9k&Tpaa+L;6n#Qbi1 z4r?LxJ-hVF@p#=k-r9Aa;Ku2`ksD(8J%3AU58eH!w#U9D`dsBk?t82&e0YBAb?y4r z+mUe7vLCaB^>N?>0(>MG((e?%QNLDvn|vkyxO#{Dy!i+OddBSQ^WlD6-tY2vIls*= zgYZ9??l|gGWZxW0^erob>B|FQd;-Wv*@fy~hNNA$U*h}Owc~x9%6$C_pOdBKwz(u9 zbj4Tb;>TNr=e)hhTCPDy_qhQcKK4?4+s8`j*Oa5zuSshkv2#AagzJ5G9)!Zbf3H<4 zBK5N(x63T#rh*4+MSiKAbm1n)2Q?RHAp%IH>vN9V;gSsG=)x^?^Qnt&zQuR7l!$rQe;eg2uIQw3! z`i;bwD!-n7H#&|dUuZiyQqJTaiE9jJNALN_q_98vx8T~F^l60_Z%tr`7 zlLS|1lz%}In?%@(tR7fcOrmWC(2|rDsa^owVuE1{`MEgI@m43*_ItL(MPQtV+CfMP89>TOzs*sYyu?m*^)uNVR2qkO5s9I6$ zC^g?mR=EhJ9SkIikkSc~(uD;B90ErTr2TuD&c@)iQh}(2w7{Ff0CvbOtU}ci=U@w+ zD5Yu+VJik4X0~?28ar%(z^7qAn8OHdHzYd35>Nm#?7Y#*v6y&Y!h^ee#$GNucJy?&qk>`h=8q zWVAPwasM-_P8~D?SH|`&fr`_d7_` zd1wCkug8-5t8PL6l_AkmqX&ijPlg0!yZ*!dm;Dp!%l?U#5Z8$YWc;_o$VW;4Ynk!; zr>)oJ=AtlcK7@!MXRhesLMa1Ifgc-jb7CPRf%}>rrroaR@&@5T&3?qR)z_;?-XQ#b zIYS&?jMP?tesVK+ucp0RUR<;g>Q902^lZYKF`D-eb;>TOB4Ens%sWB-B5{tgAOo@`~?9Vg^D zlWc-XLQ&8OTujcy!BMNj(4nkLxm!Vo1;Nh|?RMGvJArbyU<3pn+=>jSzS5%xGm-mL zt`6cMwidgFS%?(gG3kGt6ZEzYcp=TX;Y~ZSZ^+_cgk5xM*7=KZiI#IL2mY!TIW3#! zG>n(dF!O`!C2*D=@H=;~Q`c*JzbQ4Ov+$9R) z7s)-L(Se>=m0T4yvf8yj{2~e|VSbCo0dgO(FD|SPNnr{9=)ZmIKj{j%B?&S0FJfeY zNgkddu{gTnh2P5%L?HJx8P_2H9sKGp@fSJUIKmlOb&vMAa+^`KUcfqi30>orf+SbkZ%Vdi^{yt1{IrS%gclyW(r}#y|(yn3JP(mj76k=C>fRr0bJxI*pBML;qQ^bEU%gf*pE*t z82wh-oXftl}Pt#VwjEmQAB~mwEc?#tZd*%ANXO z?I;|w!$_ywcSFI)e-RrX1xa%gZkvV|k0XkE4ly@1jXIK-_pFTD-hjDdLi^;4Sfxs3 z=2d^&Q7g6139?G#jXi`7Xw)~GU90lVUou3Q;dOuwnb%Y4m25WS+6`bSz)`NqaQj94 zsrNy#aN6qYU?;Fsr*OK%8E` zwl)8V^Hwd~_D21C{Cs^t9GH#*Oh!rN~v+9V7cx%X>U<@HNe-h=uqCvQqIlMQpmqUC`Mzxa_1RfOHlkal9CJ$vC_A z54ee1N>O-1+yXj~?IZzu*jS3#e@1ipDFQ$rxJBdGY_()93zjQI*H4(O>)0SCz(d~? zkPDH?UlD!W<%M4b7WwC(A4~m=Wj$mh_`~4pb=M5h;xeZ{Apg_G3NfT25Q`21VhjKQ z!T2I3)C7laNMIBPjDgBx)A7WknVw#JiV4MN>^Crf6HtqF4yj=3j9ACK8ar zGMU%{Z$_3ygTCn6?^RJQmUU99e;Y)vE-i+w9XuO>%=B zQksZ;Oa&@kdz~wH7i}n~c7Y!B!c+UIbVx2t7lWR`tT!_! z{_iUT6&_3o_a05ZLd*y-?rK9rFkrMzZwzpao1|Mc`tI@nPg!3X5ZAJ-%LI3KCqQs_ z4esvl?ivU(!QEwWg1ZF>?(P~qI0SbH5Fl^D-sjwxdxsy>)Ae;#O?UOsYpt&S8l%EK z0nIN=!-BKfl8rgvGHiWQB}tWOUXyS~#A^?PK1g(-s@~pugU{R_b-!s!qRCF0i}YcO z!0^HQV4u9Z#Lj}IKL_b#fC>W$ga0M=9J%>3!D8E{A<{_U2#nA{5(@)nb8ZB)iwRVL zK)?A~c;djj?;dGIxx^-j&kh>km3nd66g7>0-ar)&+| zO%I9Z!_AO2iI;8nT}%`$DvVBp7-%j!O>D0(Bn_g|7ijU&HUuVyb9&sa8 zZq?GG?DOXW&spsAjfVx`vgXkAP39^S_?GD|9veCJRqx|56V0z1bg9#mGa$XuUOSj6 zL#y`V=8lh(^ZX=`vBGokG?S>&O86U$)OyE;%Brua{x7S=Y7eB8_REV?C;8l?QU|Y> z$L^3HT|0Q?nP1zFyhe6nS4Oxyc`irCKJbQSlw|)L21&i+3zZKCM%b^L)#A;z$Ti1x z*mRj$U)D9=% zXmy$tK^!-%Km?i1Un8oksa%+#@OMXmaw%PN&m!i@ahWa=%H04#AK_x~8&0^%$>N79 z1qV4k^ee5#%4>%!phk#q@VDvXsQah7_rcDEUyG`46^MgPb-u~_9upAqXYlc7!o_34 zS0anQ@q2k6c#Urqohwb?|0Y_{{Oni?uV2EwPdhToZX1RMFr z9`0rUO`s%kZSgxXym-W9-gj|2sJ1Zn<7f$KK1r0Dhj2z>HQ;J>{Wz*ugOLuNc5IdWjaN%M|gzPh%u!gvZIW5j*F=?E-h!m zxOA|Amo#(F5MFcFdqlq0D1Muktr*?HsjfmPAf9I|n+=2uaT}YR$r{DzgY3@>;rOMX zd+QcBqd4)KU%{z9H6`iT5~ct#P_QGmximL-yb*e-LL7%sHT(7yb~G3M7S-JI{-Ea9#B=i!*-@(kwJcll z@v8ySq8d27pK?YS3_1Z&I9FFbPaYx22 zKdb~kvdg1BN6ffU^u;OGJm|ju8e)Wn7Z#Ze83tWnyEo(pYXV=ErM>H0Wg~qYIrSxR0vn($xw9yUo*dxMeo$0QQ_myk7bREn-$(fN zrMsQ1gcx^d4J$P?(YYLV-U%smcmY8mgdLj)E(}W`8kG!U3YE^8bZx5QErJkKE;^2H zbvIc*HeO%>0!q(0_B}DO7Z$1Jrb%GW+Y5RibnN93%S>;9bMhM-^KG-(IGTHU-(>rg zg=jd;PEGeqg`r{oIrERuz?d$Ti>CXuz^=Xx%#sEw=>X=fjmrHU457SD(hC{r+`y^f zuLv*bxth~3q;wYm)GnCTbERP9u8<)tudJ|lUS9ZyDi`?o%Dq;!SgL9{Z-7CISiUGg z0|cQdYCnLG%I4eqctd}$r+O}+COB_{l8Or2$ejH*bgb-sVj%O|OE2u-<=qt*TF}2k z-S>{~b+3piuCRQA;?@fT9DU?^x^{%IdF}#Nf z8mce;v*%y-AUXa7%pjt50hOcf%&@Owo*6hj2m8DW+PVcm4{hO720~*Y>M}$QjNW78 zWSZB}1rNKp9Wyjv!DXPj#4qGLXgD54k{a-hM2dyREt+$q|S9!VAD9-ss~oKKv9 zq3!k!uKV5ikC{(Ezi|ve@&fY(n{L*j`)+ zM6i-<;QRaxU?NLOngjmI@DSHv|6(@nCZd4QIm40#)74!0;65~|y@WPWz37FTay!r& ze!w#b%2qV`nm=6nVDXmFct!>2cFKN6z@9Itz?sugS(i}O{K9>c7%m>JoH3uBQx09^ z6rXH3%0hK(tIEJIiz2GCT+TsbV{8vTQel}5xX zQwrC}F=bS{yZu1yVURpJ^uZBj@TublnQeW8Kc{rCzH&#+&nSPE^yE5Z*n2D^bKrV~ z+b-r)0r&d}=kZ}r(Me6xTy1WsU-u^PT{`TOrq^bS!Yw+oFZw&xDo(7W)?BuZ4ezab z7;6^zDy7%m5A{=RzEdCqg)4^$wsMWm5dmd+Qi%{FJ}0+~9>`JmZZ^Aa)>&?n95}j* z{Wk5K@6(WI+faQfstn7x zf3!0in`C1^ruw}F98gcd#f5PF9KR}}i|u+%V`+;&;H#Zmb{Cbd3z?yD zMl|qLn-)MQSqD@PBc0otw~a_AU}ROxrQIJISnqWJEvZ$A?`S{%#(F|W%Yh;2mi!Gt zfgJ{DLkYAX)s89|=t;GU3o;{>9#Grfj1D>`8^-=cwlhoyq~Wka5!IBiAo@Zd2`f^C zCLR>8Mh*u<4#M$nch>uns!jx9fxAl#qogGl7hvG!g51nd`Rm|+|l_PLCRSlqnHm<8J=-=JGHv@&`kKPt9g;AZYT@% zq%&Bnl48djCmX!&soJ{vN6a!c9cpe?!n!fTX7^SdfaWtzbXBNVo+oJ0W~p2~Y@{a~ zck#^~EHHt}if-8H2@*6^^)Uc^!!T|r%^0TWq^vsyuc-cqHl|XT2iU5mcxd}!fm%ed zPR1U7`?0CK@Ys!zpYDwN@i;gc2D_Xou$$2~WtMP=_*a~ib7@Roq%X8N0YYzYDsV7R z)RK>cfONh|(QHB}n8Tc?J?SoKcwt`zX^Fm4;kV9n+(^m%w4FLFZX0!?fQ=IyfRO(B z-MIdY^}AY|ozJX+<8w9cKpE$l?$}RXq}+p_nukAEMsB~U=T*zL4m%=95Pu-p9#zjg zm6v;BX6uv`(Bf__$ah7fJLfF30CeP7J4%0P?E^NnLUw+p?2SHzbP{JF`jo{ZFRQT| zW)le5s%X$0R-o#nt)dv3!)Q~Ba8i)-?e$$W-ySLJ7nYOr#V`qmkAg9AEr$mxa(u|1 z4US_qd#o!&r=-7SL@mUGsoMEsE@639&DNgSH<3ruw?gaNE!2&N!Ky5Mwmn6WY_#iA=Mg=1YhpRuwF1L^u) zSwm)Q{sQS_wTEx6YpxjC*N9eapC8;so)3ZAJ1Uzz04jdL+Ou3%CKh9n22o5&%<2X1l|STG>U2>RB_GjF#FqZ?ADII&#kU*b7!O~P^2 zqt8cn#GAoMw91&eEl7LR35($k0tGrVXr#NSquWYXD(W(q-1wvK*^qi?sCdhW8+@-* zX3k)z6bL!0oT*hFy(9^Hz@Q`YOHV7RxF@&n^H-84U}B-E%_|elsQ;a}T<;Hp36AM-M|R}q z?$o4H9m@8o-+aZ09su}(9$wA*_K$eFZLX{Kwr3*N8+P{Q>uE&w_hm9B5y>7&o)P0L zT(mQZkB*}B_sm(9<%yf-8U{8z*k~o9+Z;zXSqL)~Zmk*7y${ZG%PuZ@Kq|rC4`H7R zR*Ly$N)|mKQkTTOHyDnFxoBIWRxM=rCiZ)CEFB`(*Qq<_MNj(DB>p{*?F4U z)fXk}W@Yr(&YNpz^v4JCuhK2%$1h0RHJTG~8NLW4%g4kM?iOY4u z`3!Ff(-N0E^FJ;$2l86RN>JFm@h?LFB_E?HMuEP{-e#1RojrtaEuxcre+f1EjD{gqiu_$BEATLm_tk{KOl(Kqa8(!@ShoSTX>v^YL4kuI& zU47jjj+%geS|{qn&$it96#)0Acn0U_axbMzUFvHUj zP3aI4kWcfJBl8eVnIKD>PyF&s}#!oeRDRUvGYD6Si3!&wFnigM!c+6H|c=EU(H>~&xe7^E<& zTEu}K%%9fwiW#6WQz^77!y$~qaHu1#JUW2gWvZy^7_)Rb|H8l8Mx^Qk+O^=Yy|og{vO*jqia)AT_@d!67xj4j6^y^^G5c_4eJ|heRday%qtGVqFD*P$e%# z&`E(<*CG)Ge!|ij+H~a0>W9gJWsa%x6J|5>`l$*UIy{_VMQZgr0-RBMYV11iIfJOw zv2j$0C)moV7z%aARm%&s}$CR*DPr z86LaqgLb?hAiv-9*LJD7kC%H2aKqBr7*UsAD&BmUXEg#?Z3)gJ2%^q0c&0hxBeOFE zDVrg`58{+nD1)BbGL5V^CY@+Wwz(Hl&aNdb?hDX82mVbHQ{T1H^v{zh@3m;i*C$cK z9~tBzksu(Za3CN^UvKzsuE77B?jEBJ@0+xT|GP_Oh57kPMV8q*N*oxuAqza&^?H_D*qLisn|m1l_l^j$w%^xO z3YgLlRntFxx_)@C{}5WQsqw$RsfXAv(JM* z<%E%9qTq`F^?V%SEha(Eyh?N!bh}cYKeExRN@R(9bRPgfZSg@lRg3`TIPFsj)RQ}U z?B-bS5BwfM`Y|_xoW(jM=7Y3oTnlfR)Ec;x3O>WZ#ogPKH`>B0$FBRwd`Fk%p-u-& zu}(+LSR1a}tESy{z^ki|=$%35e3yd68$+m2SE0jCd6>c&hQc_*O1lS{1pd0gxm!Q@ z`~!?4U7c*a^oD9K>~M822yy+RKA1mbx4#(nk%~W(az2ej2=iZ7J3mJ;08{pyXox<#!E5=bWFyXHd|eT*EAS6#%@IAc-$KAsj03 zHCust<3Ds#E`Sa?mV*jL0%#~I>dVj_tBsYML+iwiSc zR^!nnfY=q}e3hP0+-aNMeWZ>hoB$`5+P;S2i214YefGB$G{sxF1TRI(L~=L%zB8YS zKH5hG(xY9K+`!L0Tj+Q;g>75b;1|VK`_FNUs&!-Ta{>9;@`T}#Ibl(Nq^lSmcBw_>m?SLMLB@rsjCtP#&QA#FU_t!VMV$N;yfPz8wt(%>3?Qd;XJ0C}2&`?o2p#wTJ<6SkhxT!`YRyt6h$2j{NlVul^_ zB%JJcWUU_i9D1DP6KggIKO>|x5=zNfI5mKdQujpWKAS?~MFQRlxpQKin^~a_? zujQuS(_%NPud%UUbppv&6o-#MB`YMUX}FDhJEksXz~_xpkWq_tMU+L>}V8%vv!w=AdhP` z)f9nZ*jtKXhb+i@s-by46tFAmLg`d?kTl9iku<95kTl8$?Q8?{ z%GDe5Z2Rvbj<6tC=P5O19Lw-+zhsz}mTfEJ*=F#4Q=a>Vq>yb{nqHpjkZ2M+SOS%v zZy7H1O+7nrt$9%Sc6(H5q-Xogi-%3rv=j!Iz$=%!4BnzSUsEg)YOAi0kzrQaVw;n< zzoYnNvUHIGj_t!oUFYQ5eWfN@FW{(1;CFf_5%G(#NO$_uW<>Q+47rYm%);E@ilZ z_KsvHHb&{JS|+O1#WU6v7~Ib~P$>_D?|x~opQY_+?pt`-eTq)yf4drAViv*iLu*0&exxJe$NQi$%o?^sNHY<7UMufownj~xuE)^1Vq<-0OX<<)h^0YUUj%yw#HpdTTH( z{F}9GDzmjm=dJOk9HOxWx9r>byux$0@54<#CO?F`PpgID+S>Bw6U2KQt&xLD1p<3- zVe{aJm%BG8BT?RONZIl;ZR*-*R~DXJmhQaU8oKAA8bBr;3Q3jcX3EzbU5W7L@@lCG zbAYp`wL6&E+yPz;PP6wbO#&I>85{RZgvT3NNrXal0)Ejplk5#z+NfFs>==-vu|#ws zsdgCsnnUKf@;n!bKG_-VH#myCyB^1i60?Y;GZQ0!JdhbwI#cY2uL+xFTWm>US%YOA z^n)6>Sy+Ok+45X_d`n}Xx5@miCv=tX#0I*zus2oFNM0a9ov%E+GRESF+ zaB3sgD{o-AO^?eapf!Nd^@(Yd^XWPL(FU@}D1wr^V>H_t{WdyG^h4ufrG!K)BXei5 zkAai~e1r!Gf)P5%MfFJ+lruD}8_0|P94V7BrjEK=40)ft4QLA$DJ>>F+|qO3(mU*j z5BKEZe!*j^#j`xXP5g0qE5kq_?&r4kTSQCaevPcF_CT_cGzuFiB1dzD6uCAOxfEq) zOVA-0(==hTuz{sns>o4td?3N$dTK1dr=w<2S)4LHs1bc?+fbiTl*4Sy2@8i>pMe>D zOI5j5p)6yM4hl! z&f6s=#XB>t>^d#UWVBZ0nzlKOpZ}IrDT38<4H{1@9bQux`xK8%UZs!PzNpA^C83{7 zx7d0j=^lzHEQSrq7eh;0u_DJ^(WmN(#K;$^mB30^jkph}jm+P|8_B1&4C`#ytlC#? zR%-H##+!6+pcw%9-kQmF5%3nZlL+iZVK%w5Z`L3#%-dWWB;W|yY6=9;sye8L|DSle81&uT>p z0-~(;waGoMc9G}{B?N?L5XuypiZrDScDt|^Rf{EoHioY4u_g*-KV>` z2xT10ZR`qnj<&Qx+o3mTGA?bbeW%4pO_{S|<_HMF;w_<>_#Jve-IQm|ypfIPJ*fyq zVx3-d6T*XP+ePWK#zuon>bZieRjM6L6wu|;L3EPEYm|pc>Pmfrm6JZpz;h{1lFePe zct0;7OT~}L@lhpMdy69Xc?WlATT^{X7NK_}Jy*9yKaz8N&`ybO?UU)37=%<~QMkGj zs+rZWy@Iny2Y3WR5d zxmm6gr>FmfUW1nq`Y?016UOXzKGJR<8s-$q6cfXgbZf}PWK2NJLVl}dv@d^T#UHke z(t4;W#4I-R`+r?lSe$(Oha^ex66>FW`Yj{O>z23RU+^#}f402sgeqW3A%b_7;DRy% z0CJ!))*klD%gM>4B|AARJX+%WX7eNn5tI}tUQx6+-2pIXkWL0ooK~dI}b!c zUG6L8b1{zGL2kQ8_i!9`TF7;!B@I~pNQdXReZVO+d80sordY@tJ@`DAy3-hJEXk zZ^>-ch8+mcZhJ>*QI0w=5zL#W4kr#YOEAqN)rH zfQ-lqjor%WP^fC;$8PYbGgQkfogm;?4THT)yClw+$!lO-z>GMH?q^JIi_-nFAxo1S zgSmi@j~AJtutuD(y_NMjGW0He1jVO~LI0O6EMHZSx@x8nOY#AC!3>NY*{l^1`Hr(e z8*<;cHxl`4f9TI8x}aTK59g~8y9o8p6m8*9Y^`uj8WZXcD#mub_Pg^a@vt&Fb1FVT z21Nd(gq#jN3bE>XXmj~CFBOYxR<~)$jCUn6L&EmY#Af8^6YG@L-YO$M9`P8# zsZJ7RF58k_HPI(g9O8HH2v0bHdw@lAp_q~YRv+X>GoUeNk-Q;};r zQVb?k5qhbKv1y!Xg^BS{j>HojJ3H<%r-WZ}QwfsG#3q5?6J{~Ef}Cgup)#)N?7xb} z6~!+!N!+EW;C>!KS{DzdzMZYLl&oeZAta$J9K>6NW(9Oo&Y9^@C|xcA6F69Ygl4PF zz?~k*585cIWjKimu+2N&Qf9b*E}@!$l#%%b|1_Q-Ou%|H-^+;pK{WD^&p0AO8&uYc zA>|jWVoUxd0ecCXlz{JEz@F}|3n$3mJ-|bc0<_=k7x@gQgK{v2gY+<83+6VfO~J<` zL4sq%<|i)IrLj$})KfGG#K&qurn7qk`F7Lh>RtA_DAYoHhyYf$PD?;EM=qcEcSt zaV?8bIxRJx@ZV}78Ip#aDQc~1CZ&fIEf`u>S1Wa?&vc=-`fu2oj`1kRq8A%7f9**( zR$JoP7MIU_V-TCrbaUriRKA`rtEflfG#alLm(XtK`&8ksVOPqh;ZzE3n-|d6Jfj>n zFG~F>k6_*ul6&Vn3~;^2q8*VN|H!_vUs+D0F)wusIwaky87A{BJoRLB)RdP78{muE zNN4p2KEKa`Y{q;s6jCzK6k=k<^AEj5*!&576Dn+)A$n5{#PWlK475{J-X(4>AH=us z{DioDsZpV!!-|+E*xW?T#v}(w9c|E=T6)FBr8p8fil&E}^Qm13^ZY`q$xiGTx4qHoz;S8IY40tEf8X8h@#>z;Ok-;9dnd}y z#m>#U{;E#@AJqjpQI+fFUBst2B_X^T>75Z;!ES=ghNlWFofhLCC&b!;yDAdjkLcbB z5Gt@LbvrfYiUUJ5P2XzeYkt`{dwO8BYjW~5K)#6fv$l=Ja`BX<)^DFgW=d%r*p<;q zOZ}d_M%=1=+RBpEkRK7+?_bxYHi&4^6Y&kD#-ftXY;`nQKeMeRSy7(~>sK~e%3k8` z=dWBdX73vJA=r7P+UktTWoo>wnj8W2ULn{qj(c{|A zt@RjqSY7WG^IPu(Yz!SU4~M1OG4-WhDQ3&dy^a`Rz#E#>N%P-C#zu8r{NK+d&OU&C zoqp+3yGOLLGsd-Y2%q{6TlG8-g$r-1!@zC0F)B6!)!=@D<*}QBc5lrI^sy?9 z*PB5VCI4>2nmP-DNqi;hwzM%|j*sIkEtY4B3C8c3d>*~gH6+?3eOd&+gAYX<&6@Ye zv2SnQOhTyto!_{Y=S=_mzHglSrs8CV+gINP-Gc`9!{3w9={a*V)?oFM4+pKOhH%gZ_47B z?$QhJg|JO0CQXNknv|ipp)Zr)QvD&rOEI>1p!S4OgI(IL-Ju`5rYZ44(t0%V!TSo3 z#h7v+H<_ZHO={RU7cTx~0o=+M+_5x`#;wymC(}E(!72)V$5Y-Nt}K2>>}8i##hl5- z@YT+&Q28k?b1g-&JD<=KS7cfYv0|;*+QbG-V5xk;(flEmd1vyy;o#HxWNqbeeI*Sf zH|f12_%PFP6H|+?5tb;Jvtb=u4mT*GEP-EV|eI89uzr4WCn=7+)b}%*5~o0 z0VEn>2O4vxm<=+`DqK(**J6%)g=WdBd(9chG1dX!}!P5cJ zCGwMVWCY_ zAskB;_R%r*wn*P7wXQSkxPa%K-{Pd@-W#XAdoHeGvC54mGnkESleKUKuXl`HGk4}G zW}su4cv@e68Vfpk2B)*Qy0sIeUY^`Ahfp?CKMUWLM$GC;H zkCY1>wipQ^Nbf^DiR_+d468Eh_r3tLMeBuE1W}%4JU58*KI^5klYZ4;a_j#{2b!Jw zxnjvM!01KF`>Y-O6Vs2>dw+Hsb!GX(Qr}NQ+zo|(Em`C5Rnu{Kd!Wp?LjzeBXDaH{AVT&apvOYNk4juqr-!No6L0A zDGr{dSLBb5tCe4;Efai~Lg!?z%hAUx-n9sYARa-_xyF1#$l_9&^i1gueQYhq;>tOc zu4qSVI7?cZKd7m=xVBtb!;3d%Lirxk!UfE{aI=v^IK9PwiTorU-*<)e^~zW3(biA` z6!6RD3=(QnWRj#;ooMgbBf9DVh~9aqIDLub6sN+~n#6D~gI>+^%kXTFb z6N=kUP5%Bchf>P^CKh7KerS39k~AhORvEf`+BN{`mScBl1C}@QmOU}426LX?(2%ss zf`ez`_ZQ%Qc638P{8@K{vkLzELIsx;B-BM1WfVbONC1pKD|FC25`gu!0EZ0Vg3l8J z$-9IWav*@DkO4wKgh0A660Z1oF0L8m(>x5zg;C|=zYEe$$OvO%{__@zYq4J zA!=y!I2G0dE}-lzcAb`~*tKj}Yy>w*Tk(Zb9+njV7NPC0^~RnZU0}}c*lrDZQOLQq zerP2*KGwvKV#f=>Aoqu+HYRx>1v2b7U#7N`k9`7|Ai&{LLL|_qUKpWaK&Kb32FLC! z0&^QZyp}SK#lBXEs`eenD-gyU9)x%LxR!j)o1$7bc9Z)R4&wKM+j`sH2s{0(#PCBG zfQY)~EkES`6z$-5WVJeVdf26k%>G{Tdu(N!iQxrhp)L;Hr#MY{zk;Hr^*9sV7CKr) z^NdTVWa#`r<4FI-m!+&SxT|&T<8nDaWsn&vfQ_b!b~HZY29oa=Jhg9iwv^5p*-M7) zySSuH8o8I4MjWINo&C6JN0B>F2P%LcHa6cCIZI3r^cxjGBT*CIxO{e}-LqC95?zcT#+qX0eoVxCGf8nU~@b?pwCY)_Ksc-#p#;`0EXxlEc zQ@;Cw?9l+kaDSq;G%nr&lz;}1$AEPuMvTOYmd8dyu98QpijKwtoudJyUL%zk9l!xe z4~|`Dbb#<{%@=e4(`#V|9l-Wlz{3D=!~aovvV($j4${T|h?4#JIQX))oc9I-;sFW* zg7UvJ0|KHjzyvah6&E)t6%rM+i2*=*ML)+depyC=fbby&p9K9ES{&vT?GFP3qQ(3d zolU?Fy9P#agHyZ6|3YhGzoHp&kU(DlLI3OsFC+qcLJ#(Y;xDud4j4@d8vYMb-lNny z6&eCU5PbdoH*x|Gj3frl;R7&V{beE_7^(kEf`G%^27yTym}#qs9tsh z_Ja9ec7y+b3j@qKlI%E1LB6>EdJvw5H&_7n01f=@Nd5x@zZV81ae+Qz0~lWQLBefS z4uSPifc5>2a^?Ml!UyeP12A7lyEZ@BL=XhP0bsxJ;D41RB@5s%D9ZufU_t&*iWO)) zmV*{d;v9(q0YUVa-Dkl+t?)omIRE}We#QY1zA=^pb>IM4UL)(`PsOwx2pJc=uk}wz z{g)9MoHzrHlmEU70~8fOdbj|_*Un5d(gLXvfK7Dc{_FHB!yTv_5A5`b z&Z{h`(gY6se>?q$Gp+3(*p}Wuuxv9pkP+U$o%vr1um98SO9uZ~{1Ydy-So-;1vBLj1t{1dSMn+W4SomUt@Z~Y2Q>i7Wre|q8%wZgv|g>C=Qm_qokHQYZZ@q_9J z!Pb=R|B-EiWv@>Eb+G$?Oo87E1B4y_Kyg8IME?%EFcEl^brN4|lMbtpKtLh@((Cxg z{*fpo|0DTcg8&)_OJ3FgmDc%}`sz&3JrRKV9~3yf&jB3s9^hF=_7`d~8ze;hZ&3Y} ziS-vM@H1$G7(n@|i@Fo}(FZ(MAHn*_|3XQA1@({s2th(50IXN2Z4->XGI+4w!u)S2 zMDst;nEyck+7$4Y*0{DmP{!AOxCE0* - - - - - - - + + + + - - - - - - - + + + + diff --git a/plugins/NewJPanel.java b/plugins/NewJPanel.java index 2a646e1..9de490b 100644 --- a/plugins/NewJPanel.java +++ b/plugins/NewJPanel.java @@ -188,21 +188,17 @@ public class NewJPanel extends javax.swing.JPanel { this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 400, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(142, 142, 142) - .addComponent(jPanel11, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(143, 143, 143))) + .addGroup(layout.createSequentialGroup() + .addGap(163, 163, 163) + .addComponent(jPanel11, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(122, 122, 122)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 300, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(84, 84, 84) - .addComponent(jPanel11, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(84, 84, 84))) + .addGroup(layout.createSequentialGroup() + .addGap(85, 85, 85) + .addComponent(jPanel11, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(83, 83, 83)) ); }// //GEN-END:initComponents diff --git a/script/LN2_Monitoring.scd b/script/LN2_Monitoring.scd new file mode 100644 index 0000000..d2ab014 --- /dev/null +++ b/script/LN2_Monitoring.scd @@ -0,0 +1,15 @@ +[ + [ [ true, "phase_separator_level", "Device", 1, 1, "102,204,255" ], + [ true, "filling_phase_separator", "Device", 1, 1, "51,255,255" ], + [ true, "filling_dewar", "Device", 1, 1, "0,0,102" ], + [ true, "dewar_level", "Device", 1, 1, "0,51,153" ], + [ true, "rim_heater_temp", "Device", 1, 1, "255,0,51" ] ], + [ [ "1", 0.0, 100.0, null, null, 1000000.0, false, null ], + [ "2", null, null, null, null, null, null, null ], + [ "3", null, null, null, null, null, null, null ], + [ "4", null, null, null, null, null, null, null ], + [ "5", null, null, null, null, null, null, null ] ], + [ [ ] ], + [ [ "", 20000, 100 ], + [ "", "" ] ] +] \ No newline at end of file diff --git a/script/LevelMonitoring.scd b/script/LevelMonitoring.scd index 5907f37..ae328cc 100644 --- a/script/LevelMonitoring.scd +++ b/script/LevelMonitoring.scd @@ -1,11 +1,11 @@ [ [ [ true, "phase_separator_level", "Device", 1, 1, "255,0,0" ], [ true, "dewar_level", "Device", 1, 1, "0,0,255" ] ], - [ [ "1", 0.0, 100.0, null, null, 100000.0, true ], - [ "2", null, null, null, null, null, null ], - [ "3", null, null, null, null, null, null ], - [ "4", null, null, null, null, null, null ], - [ "5", null, null, null, null, null, null ] ], + [ [ "1", 0.0, 100.0, null, null, 100000.0, false, null ], + [ "2", null, null, null, null, null, null, null ], + [ "3", null, null, null, null, null, null, null ], + [ "4", null, null, null, null, null, null, null ], + [ "5", null, null, null, null, null, null, null ] ], [ [ ] ], [ [ "", 20000, 100 ], [ "", "" ] ] diff --git a/script/devices/Hexiposi.py b/script/devices/Hexiposi.py index fdb4567..869f6e6 100644 --- a/script/devices/Hexiposi.py +++ b/script/devices/Hexiposi.py @@ -76,11 +76,11 @@ class Hexiposi(DiscretePositionerBase): self.val = val self.move_pos(self.val) #Workaround as state does not changes immediatelly - #if moving: - # try: - # self.waitState(State.Busy,1200) - # except: - # pass + if moving: + try: + self.waitState(State.Busy,1200) + except: + pass #def isReady(self): # self.get_status() @@ -97,7 +97,7 @@ class Hexiposi(DiscretePositionerBase): #http://129.129.110.83:8002/hexiposi/get -dev = Hexiposi("hexiposi", "129.129.110.83:8002/hexiposi") +dev = Hexiposi("hexiposi", "myriotell:8002/hexiposi") add_device(dev, True) hexiposi.polling=500 diff --git a/script/devices/RobotSC.py b/script/devices/RobotSC.py index b50c64a..943dbcc 100644 --- a/script/devices/RobotSC.py +++ b/script/devices/RobotSC.py @@ -24,14 +24,17 @@ class RobotSC(RobotTCP): RobotTCP.__init__(self, name, server, timeout, retries) self.setPolling(DEFAULT_ROBOT_POLLING) - def mount(self, puck, sample): + def mount(self, segment, puck, sample): return self.execute('mount',segment, puck, sample) - def firstmount(self, puck, sample): + def firstmount(self, segment, puck, sample): return self.execute('firstmount', segment, puck, sample) - def unmount(self, puck, sample): + def unmount(self, segment, puck, sample): return self.execute('unmount',segment, puck, sample) + + def robotRecover(self): + return self.execute('robotRecover') def on_event(self,ev): #print "EVT: " + ev diff --git a/script/devices/Wago.py b/script/devices/Wago.py index 66430ee..3761f1a 100644 --- a/script/devices/Wago.py +++ b/script/devices/Wago.py @@ -45,7 +45,7 @@ def set_led_level(level): def get_led_level(): level = get_setting("led_level") - return float(50 if level is None else level) + return float(0 if level is None else level) def set_led_state(value): """ @@ -83,6 +83,7 @@ def set_led_range(room_temp = True): led_ctrl_2.write(max_val) if led_ctrl_3.read() > max_val: led_ctrl_3.write(max_val) + set_led_level(get_led_level()) def is_led_room_temp(): diff --git a/script/imgproc/CameraCalibration2.py b/script/imgproc/CameraCalibration2.py index d9ecccc..a07f506 100644 --- a/script/imgproc/CameraCalibration2.py +++ b/script/imgproc/CameraCalibration2.py @@ -16,16 +16,48 @@ img.config.rotationCrop=True """ +sensor_width,sensor_height = img.camera.getSensorSize() +img.camera.setROI(0, 0,sensor_width, sensor_height) img.config.rotation=0 img.config.roiX,img.config.roiY, img.config.roiWidth,img.config.roiHeight =0,0,-1,-1 img.config.setCalibration(None) +img.camera.stop() +img.camera.start() + p = show_panel(img) p.setMode(RendererMode.Fit) ov_text = Text(Pen(java.awt.Color.GREEN.darker()), "", java.awt.Font("Verdana", java.awt.Font.PLAIN, 24), java.awt.Point(20,20)) ov_text.setFixed(True) +p.addOverlay(ov_text) + +try: + #Find image center and Prosilica ROI + ov_text.update("Click on the center of the Dewar...") + p.refresh() + dc = p.waitClick(60000) + print dc + width, height = min(dc.x, sensor_width-dc.x)*2, min(dc.y, sensor_height-dc.y)*2 + width, height = width - width%16, height - height%16 + width, height = min(width,1000), min(height,1000) + print width, height + roi_x = int(dc.x- width/2) + roi_y = int(dc.y- height/2) + roi_w = int(width) + roi_h = int(height) + set_setting("roi_x", roi_x) + set_setting("roi_y", roi_y) + set_setting("roi_w", roi_w) + set_setting("roi_h", roi_h) + img.camera.setROI(roi_x, roi_y, width, height) +except: + img.camera.setROI(int(get_setting("roi_x")), int(get_setting("roi_y")), int(get_setting("roi_w")), int(get_setting("roi_h"))) +finally: + img.camera.stop() + img.camera.start() +#Configure source CC4 = (-129.9, -150) CD5 = (129.9, -150) CA5 = (-129.9, 150) @@ -45,7 +77,8 @@ def rotate(x,y, degrees): y = oy * math.cos(rotation) + ox * math.sin(rotation) + rh / 2; return x,y -p.addOverlay(ov_text) + +set_led_state(True) try: ov_text.update("Click on the center of C4 (19) position...") p.refresh() @@ -89,13 +122,14 @@ try: roi_x, roi_y = int(rcx-roi_w/2), int(rcy-roi_h/2) print a, sx, sy, roi_w, roi_h - + img.config.rotation=-a img.config.roiX,img.config.roiY, img.config.roiWidth,img.config.roiHeight = roi_x, roi_y, roi_w, roi_h img.config.setCalibration(Calibration(sx, sy, -roi_w/2, -roi_h/2)) img.config.save() finally: + set_led_state(False) p.removeOverlay(ov_text) img.refresh() diff --git a/script/imgproc/CoverDetection2.py b/script/imgproc/CoverDetection2.py new file mode 100644 index 0000000..7fb8bf0 --- /dev/null +++ b/script/imgproc/CoverDetection2.py @@ -0,0 +1,79 @@ +################################################################################################### +# Procedure to detect the cover orientation +################################################################################################### + +#Parameters +FRAMES_INTEGRATION = 3 +STEP_SIZE = 2 +POSITION_NAMES = [ 'A','B','C','D', 'E', 'F'] +POSITION_ANGLES = [330, 30, 90, 150, 210, 270] +POSITION_TOLERANCE = 10 +MINIMUM_CONFIDENCE = 10 +DEBUG = True +PLOT = True +REFERENCE_IMG = "ref2" + + +#Load reference image +ref = load_image(str("{images}/cover/" + REFERENCE_IMG + ".png") , title="Line") + +#Pre-process camera image +#ip = load_image("{images}/cover/Cover_000" + str(index) + ".png", title="Img") +ip = integrate_frames(FRAMES_INTEGRATION) +ip = grayscale(ip, True) +smooth(ip) +#bandpass_filter(ip, 30, 1000) +edges(ip) +auto_threshold(ip, method = "MaxEntropy") +cx,cy = int(ip.width/2), int(ip.height/2) +ip = sub_image(ip, cx-ref.width/2, cy-ref.height/2, ref.width, ref.height) + +#Show ROI of pre-processed image +image_panel = show_panel(ip.bufferedImage) + +#Calculate correlation between image and reference, rotating the reference from 0 to 360 +import ch.psi.pshell.imaging.Utils.integrateVertically as integrateVertically +ydata = [] +xdata = range (0,360,STEP_SIZE) +for i in xdata: + r = ref.duplicate() + r.getProcessor().setBackgroundValue(0.0) + r.getProcessor().rotate(float(i)) + op = op_fft(ip, r, "correlate") + bi = op.getBufferedImage() + p = integrateVertically(bi) + ydata.append(sum(p)) + #image_panel = show_panel(op.bufferedImage) + #time.sleep(0.001) + + +#Calculate angle of the highest correlation, and confidence level +peaks = estimate_peak_indexes(ydata, xdata, (min(ydata) + max(ydata))/2, 25.0) +peaks_x = map(lambda x:xdata[x], peaks) +peaks_y = map(lambda x:ydata[x], peaks) +confidence = None if len(peaks_x)<2 else int(((float(peaks_y[0])/peaks_y[1])-1) * 1000) +angle = (None if len(peaks_x)==0 else peaks_x[0]) + +#From angle and confidence level estimate hexiposi position +position = None +if angle is not None: + for i in range(len(POSITION_NAMES)): + if abs(POSITION_ANGLES[i] - angle) <= POSITION_TOLERANCE: + position = POSITION_NAMES[i] + +#Plot the correlations values agains angle +if PLOT: + p = plot(ydata, xdata=xdata)[0] + +#Output results +if DEBUG: + print "Peaks", peaks + print "Peak indexes: " + str(peaks_x) + print "Peak values: " + str(peaks_y) + print "Angle: " , angle + print "Position: " , position + print "Confifdence: " , confidence + +#Set return value +set_return ([position, angle, confidence]) + diff --git a/script/imgproc/LedDetectionProc.py b/script/imgproc/LedDetectionProc.py index 4b70704..2589c7d 100644 --- a/script/imgproc/LedDetectionProc.py +++ b/script/imgproc/LedDetectionProc.py @@ -2,77 +2,93 @@ # Procedure to detect the puck light spots. ################################################################################################### +COVER_PRESENT = True +ROOM_TEMP = False -room_temp = False -number_frames = 10 -number_backgrounds = 10 +if get_exec_pars().source == CommandSource.ui: + PLOT = None + RENDERER = None + TEXT = None + +if COVER_PRESENT: + cover_position = hexiposi.readback.take() + if (cover_position is None) or (cover_position == "Unknown"): + raise Exception("Unknown cover position") + else: + block_id = cover_position.upper()[0] +else: + block_id = None +print "Block id: ", block_id + + + +number_frames = 5 if ROOM_TEMP else 10 +number_backgrounds = 5 if ROOM_TEMP else 10 minimum_size = 150 maximum_size = 1500 min_circ = 0.2 -threshold_method = "MaxEntropy" if room_temp else "Default" #Apparently good for LN2: Default, Intermodes, IsoData, Otsu + +threshold_method = "MaxEntropy" if ROOM_TEMP else "Default" #Apparently good for LN2: Default, Intermodes, IsoData, Otsu +threshold_method,threshold_range = "Manual", (0, 215) + exclude_edges = True +led_latency = 0.5 #0.1 + -set_led_range(room_temp) -img.backgroundEnabled=False set_led_state(False) -time.sleep(0.1) -img.waitNext(100) +time.sleep(led_latency) +img.waitNext(2000) background = average_frames(number_backgrounds) -#img.backgroundImage=background.bufferedImage -#img.captureBackground(1,0) -#show_panel(img.backgroundImage) -#img.backgroundEnabled = True - set_led_state(True) -time.sleep(0.1) -img.waitNext(100) +time.sleep(led_latency) +img.waitNext(2000) image = average_frames(number_frames) set_led_state(False) op_image(image, background, "subtract", float_result=True, in_place=True) - -renderer = show_panel(image.getBufferedImage()) -renderer.clearOverlays() +if RENDERER is None: + RENDERER = show_panel(image.getBufferedImage()) +else: + RENDERER.setImage(None, image.getBufferedImage(), None) +RENDERER.clearOverlays() invert(image) - -auto_threshold(image, method = threshold_method) #Tested ok: MaxEntropy, Triangle, Yen -#renderer = show_panel(image.getBufferedImage()) -#binary_open(aux) +if threshold_method == "Manual": + threshold(image, threshold_range[0], threshold_range[1]) +else: + auto_threshold(image, method = threshold_method) #Tested ok: MaxEntropy, Triangle, Yen (r,output) = analyse_particles(image, minimum_size,maximum_size, fill_holes = True, exclude_edges = exclude_edges, print_table=False, output_image = "outlines", minCirc = min_circ , maxCirc = 1.0) -points = "" -npoints = 0 -x=[] -y=[] +points = [] for row in range (r.counter): if in_roi(r.getValue("XM",row), r.getValue("YM",row)): - #x, y = int(r.getValue("XM", row))+roi[0], int(r.getValue("YM", row))+roi[1] - x.append(int(r.getValue("XM", row))) - y.append(int(r.getValue("YM", row))) - points = points + " (" + str(x[-1]) + ", " + str(y[-1]) + ")" - npoints = npoints + 1 - renderer.addOverlay(Crosshairs(Pen(java.awt.Color.MAGENTA), java.awt.Point(x[-1],y[-1]), java.awt.Dimension(15,15))) - -print str(npoints) + " - " + points -#print r - -#print x -#print y - -offset = int(math.sqrt(1000)/2) -cv = (min(x)-offset, min(y)-offset, max(x)+offset, max(y)+offset) -renderer.addOverlay(Rect(Pen(java.awt.Color.MAGENTA), java.awt.Point(cv[0], cv[1]), java.awt.Dimension(cv[2]-cv[0],cv[3]-cv[1]))) -#show_panel(output.getBufferedImage()) - -#img.backgroundEnabled=False + x, y = int(r.getValue("XM", row)), int(r.getValue("YM", row)) + cx, cy = img.getCalibration().convertToAbsoluteX(x), img.getCalibration().convertToAbsoluteY(y) + points.append([cx,cy]) + RENDERER.addOverlay(Crosshairs(Pen(java.awt.Color.MAGENTA), java.awt.Point(x,y), java.awt.Dimension(15,15))) + +#RENDERER.addOverlays(ovs) + +clear_detection(block_id) +detect_pucks(points, block_id) +plot_base_plate(points, p=PLOT) + +ret = get_puck_detection_dict(block_id) + + +if TEXT is not None: + TEXT.setText(str(ret)) + + +set_return(ret) + diff --git a/script/imgproc/Utils.py b/script/imgproc/Utils.py index bca30c8..208d72b 100644 --- a/script/imgproc/Utils.py +++ b/script/imgproc/Utils.py @@ -7,9 +7,17 @@ from ijutils import * from ch.psi.pshell.imaging.Overlays import * import ch.psi.pshell.imaging.Pen as Pen +import java.awt.Rectangle as Rectangle + + + +def get_img_cover_pos(): + [position, angle, confidence] = run("imgproc/CoverDetection2") + return position def in_roi(x,y): - return math.hypot(x-roi_radius, y-roi_radius) < roi_radius + global roi_center, roi_radius, roi_border + return math.hypot(x-roi_center[0], y-roi_center[1]) < (roi_radius-roi_border) def integrate(ips): @@ -40,18 +48,26 @@ def integrate_frames(samples = 1): return integrate(grab_frames(samples)) -roi_center = (800, 600) +roi_center = (600, 600) #(800, 600) roi_radius = 600 +roi_border = 30 def get_roi(): - return (roi_center[0] - roi_radius, roi_center[1] - roi_radius, 2* roi_radius, 2*roi_radius) - + #roi_center = (img.output.width/2, img.output.height/2) + #roi_radius = min(roi_center[0], roi_center[1]) + #return (roi_center[0] - roi_radius, roi_center[1] - roi_radius, 2* roi_radius, 2*roi_radius) + global roi_center, roi_radius + roi_center = (img.output.width/2, img.output.height/2) + roi_radius = min(roi_center[0], roi_center[1]) + return (0,0,img.output.width, img.output.height) def get_image(): roi = get_roi() - ip = load_image(img.image) - ret = sub_image(ip, roi[0], roi[1], roi[2], roi[3]) - grayscale(ret, do_scaling=True) + #ip = load_image(img.output) + #ret = ip if (roi is None) else sub_image(ip, roi[0], roi[1], roi[2], roi[3]) + #grayscale(ret, do_scaling=True) + + ret = load_image(Utils.grayscale(img.output, Rectangle(roi[0], roi[1], roi[2], roi[3]) if (roi is not None) else None)) return ret #def detect_pucks(ip): diff --git a/script/local.py b/script/local.py index a7bf842..7053501 100644 --- a/script/local.py +++ b/script/local.py @@ -29,6 +29,8 @@ add_device(img.getCamera(), force = True) ################################################################################################### run("motion/tools") +run("motion/mount") +run("motion/unmount") run("imgproc/Utils") run("tools/Math") @@ -72,19 +74,21 @@ except: try: import ch.psi.pshell.device.Camera as Camera - img.camera.setColorMode(Camera.ColorMode.Mono) - img.camera.setDataType(Camera.DataType.UInt8) + #img.camera.setColorMode(Camera.ColorMode.Mono) + #img.camera.setDataType(Camera.DataType.UInt8) img.camera.setGrabMode(Camera.GrabMode.Continuous) img.camera.setTriggerMode(Camera.TriggerMode.Fixed_Rate) img.camera.setExposure(50.00) img.camera.setAcquirePeriod(200.00) img.camera.setGain(0.0) #img.camera.setROI(200, 0,1200,1200) - img.camera.setROI(300, 200,1000,1000) - + """ + img.camera.setROI(300, 200,1000,1000) img.config.rotation=17 img.config.rotationCrop=True img.config.roiX,img.config.roiY, img.config.roiWidth,img.config.roiHeight = 50,50,900,900 + """ + img.camera.setROI(int(get_setting("roi_x")), int(get_setting("roi_y")), int(get_setting("roi_w")), int(get_setting("roi_h"))) img.camera.stop() img.camera.start() diff --git a/script/motion/mount.py b/script/motion/mount.py new file mode 100644 index 0000000..81f0c1f --- /dev/null +++ b/script/motion/mount.py @@ -0,0 +1,16 @@ +def mount(segment, puck, sample, unmount = False): + """ + """ + cmd = "firstmount" if unmount else "mount" + assertValidAddress(segment, puck, sample) + + hexiposi.move(segment) + + img_segment = get_img_cover_pos() + if img_segment != segment: + raise Excepton ("Image detection of cover does not match hexiposi: " + str(img_segment)) + + if type(segment) == str: + segment = ord(segment.upper()) - ord('A') +1 + robot.start_task(cmd,segment, puck, sample) + #robot.mount(segment, puck, sample) diff --git a/script/motion/tools.py b/script/motion/tools.py index 6993165..4a9746a 100644 --- a/script/motion/tools.py +++ b/script/motion/tools.py @@ -68,6 +68,15 @@ def update_tool(tool=None, x_offset=0.0, y_offset=0.0, z_offset=0.0): robot.set_tool_trsf(t, tool) print "Updated " + (str(robot.tool) if (tool is None) else tool) + ": " + str(t) robot.save_program() - +def assertValidAddress(segment, puck, sample): + if type(segment) == str: + segment = ord(segment.upper()) - ord('A') +1 + if segment<=0 or segment >6: + raise Excepton ("Invalid segment") + if puck<=0 or puck >5: + raise Excepton ("Invalid puck") + if sample<=0 or sample >16: + raise Excepton ("Invalid sample") + \ No newline at end of file diff --git a/script/motion/unmount.py b/script/motion/unmount.py new file mode 100644 index 0000000..42f94e6 --- /dev/null +++ b/script/motion/unmount.py @@ -0,0 +1,15 @@ +def unmount(segment, puck, sample): + """ + """ + assertValidAddress(segment, puck, sample) + + hexiposi.move(segment) + + img_segment = get_img_cover_pos() + if img_segment != segment: + raise Excepton ("Image detection of cover does not match hexiposi: " + str(img_segment)) + + if type(segment) == str: + segment = ord(segment.upper()) - ord('A') +1 + + robot.unmount(segment, puck, sample) diff --git a/script/setup/Layout.py b/script/setup/Layout.py index 0a40f2c..5c584f4 100644 --- a/script/setup/Layout.py +++ b/script/setup/Layout.py @@ -11,6 +11,7 @@ DET_UNIPUCK = "unipuck" DET_MINISPINE = "minispine" DET_ERROR = "error" DET_EMPTY = "empty" +DET_UNKNOWN = "unknown" BLOCKS = ('A', 'B', 'C', 'D', 'E', 'F') @@ -19,34 +20,34 @@ puck_layout = ( #Num Elm A0 Index A1 Uni Mini Center Angle Xuni Yuni Xmini=Xc Ymini==Yc (1 , 'A', 0 , 1, 0.00 , 57.00 , 75.00 , 66.00 , 0.00 , 0.00 , 57.00 , 0.00 , 75.00 ), (2 , 'A', 0 , 2, 0.00 , 132.00, 150.00, 141.00, 0.00 , 0.00 , 132.00 , 0.00 , 150.00 ), - (3 , 'A', 0 , 3, 19.11, 180.40, 198.40, 189.40, 19.11 , 59.06 , 170.46 , 64.95 , 187.47 ), - (4 , 'A', 0 , 4, 40.89, 180.40, 198.40, 189.40, 40.89 , 118.09 , 136.38 , 129.87 , 149.98 ), - (5 , 'A', 0 , 5, 30.00, 111.90, 129.90, 120.90, 30.00 , 55.95 , 96.91 , 64.95 , 112.50 ), - (6 , 'B', 60 , 1, 0.00 , 57.00 , 75.00 , 66.00 , 60.00 , 49.36 , 28.50 , 64.95 , 37.50 ), - (7 , 'B', 60 , 2, 0.00 , 132.00, 150.00, 141.00, 60.00 , 114.32 , 66.00 , 129.90 , 75.00 ), - (8 , 'B', 60 , 3, 19.11, 180.40, 198.40, 189.40, 79.11 , 177.15 , 34.08 , 194.83 , 37.48 ), - (9 , 'B', 60 , 4, 40.89, 180.40, 198.40, 189.40, 100.89, 177.15 , -34.08 , 194.83 , -37.48 ), - (10, 'B', 60 , 5, 30.00, 111.90, 129.90, 120.90, 90.00 , 111.90 , 0.00 , 129.90 , 0.00 ), - (11, 'C', 120, 1, 0.00 , 57.00 , 75.00 , 66.00 , 120.00, 49.36 , -28.50 , 64.95 , -37.50 ), - (12, 'C', 120, 2, 0.00 , 132.00, 150.00, 141.00, 120.00, 114.32 , -66.00 , 129.90 , -75.00 ), - (13, 'C', 120, 3, 19.11, 180.40, 198.40, 189.40, 139.11, 118.09 , -136.38, 129.87 , -149.98), - (14, 'C', 120, 4, 40.89, 180.40, 198.40, 189.40, 160.89, 59.06 , -170.46, 64.95 , -187.47), - (15, 'C', 120, 5, 30.00, 111.90, 129.90, 120.90, 150.00, 55.95 , -96.91 , 64.95 , -112.50), + (3 , 'F', 0 , 5, 19.11, 180.40, 198.40, 189.40, 19.11 , 59.06 , 170.46 , 64.95 , 187.47 ), + (4 , 'F', 0 , 4, 40.89, 180.40, 198.40, 189.40, 40.89 , 118.09 , 136.38 , 129.87 , 149.98 ), + (5 , 'F', 0 , 3, 30.00, 111.90, 129.90, 120.90, 30.00 , 55.95 , 96.91 , 64.95 , 112.50 ), + (6 , 'F', 60 , 1, 0.00 , 57.00 , 75.00 , 66.00 , 60.00 , 49.36 , 28.50 , 64.95 , 37.50 ), + (7 , 'F', 60 , 2, 0.00 , 132.00, 150.00, 141.00, 60.00 , 114.32 , 66.00 , 129.90 , 75.00 ), + (8 , 'E', 60 , 5, 19.11, 180.40, 198.40, 189.40, 79.11 , 177.15 , 34.08 , 194.83 , 37.48 ), + (9 , 'E', 60 , 4, 40.89, 180.40, 198.40, 189.40, 100.89, 177.15 , -34.08 , 194.83 , -37.48 ), + (10, 'E', 60 , 3, 30.00, 111.90, 129.90, 120.90, 90.00 , 111.90 , 0.00 , 129.90 , 0.00 ), + (11, 'E', 120, 1, 0.00 , 57.00 , 75.00 , 66.00 , 120.00, 49.36 , -28.50 , 64.95 , -37.50 ), + (12, 'E', 120, 2, 0.00 , 132.00, 150.00, 141.00, 120.00, 114.32 , -66.00 , 129.90 , -75.00 ), + (13, 'D', 120, 5, 19.11, 180.40, 198.40, 189.40, 139.11, 118.09 , -136.38, 129.87 , -149.98), + (14, 'D', 120, 4, 40.89, 180.40, 198.40, 189.40, 160.89, 59.06 , -170.46, 64.95 , -187.47), + (15, 'D', 120, 3, 30.00, 111.90, 129.90, 120.90, 150.00, 55.95 , -96.91 , 64.95 , -112.50), (16, 'D', 180, 1, 0.00 , 57.00 , 75.00 , 66.00 , 180.00, 0.00 , -57.00 , 0.00 , -75.00 ), (17, 'D', 180, 2, 0.00 , 132.00, 150.00, 141.00, 180.00, 0.00 , -132.00, 0.00 , -150.00), - (18, 'D', 180, 3, 19.11, 180.40, 198.40, 189.40, 199.11, -59.06 , -170.46, -64.95 , -187.47), - (19, 'D', 180, 4, 40.89, 180.40, 198.40, 189.40, 220.89, -118.09, -136.38, -129.87, -149.98), - (20, 'D', 180, 5, 30.00, 111.90, 129.90, 120.90, 210.00, -55.95 , -96.91 , -64.95 , -112.50), - (21, 'E', 240, 1, 0.00 , 57.00 , 75.00 , 66.00 , 240.00, -49.36 , -28.50 , -64.95 , -37.50 ), - (22, 'E', 240, 2, 0.00 , 132.00, 150.00, 141.00, 240.00, -114.32, -66.00 , -129.90, -75.00 ), - (23, 'E', 240, 3, 19.11, 180.40, 198.40, 189.40, 259.11, -177.15, -34.08 , -194.83, -37.48 ), - (24, 'E', 240, 4, 40.89, 180.40, 198.40, 189.40, 280.89, -177.15, 34.08 , -194.83, 37.48 ), - (25, 'E', 240, 5, 30.00, 111.90, 129.90, 120.90, 270.00, -111.90, 0.00 , -129.90, 0.00 ), - (26, 'F', 300, 1, 0.00 , 57.00 , 75.00 , 66.00 , 300.00, -49.36 , 28.50 , -64.95 , 37.50 ), - (27, 'F', 300, 2, 0.00 , 132.00, 150.00, 141.00, 300.00, -114.32, 66.00 , -129.90, 75.00 ), - (28, 'F', 300, 3, 19.11, 180.40, 198.40, 189.40, 319.11, -118.09, 136.38 , -129.87, 149.98 ), - (29, 'F', 300, 4, 40.89, 180.40, 198.40, 189.40, 340.89, -59.06 , 170.46 , -64.95 , 187.47 ), - (30, 'F', 300, 5, 30.00, 111.90, 129.90, 120.90, 330.00, -55.95 , 96.91 , -64.95 , 112.5 ), + (18, 'C', 180, 5, 19.11, 180.40, 198.40, 189.40, 199.11, -59.06 , -170.46, -64.95 , -187.47), + (19, 'C', 180, 4, 40.89, 180.40, 198.40, 189.40, 220.89, -118.09, -136.38, -129.87, -149.98), + (20, 'C', 180, 3, 30.00, 111.90, 129.90, 120.90, 210.00, -55.95 , -96.91 , -64.95 , -112.50), + (21, 'C', 240, 1, 0.00 , 57.00 , 75.00 , 66.00 , 240.00, -49.36 , -28.50 , -64.95 , -37.50 ), + (22, 'C', 240, 2, 0.00 , 132.00, 150.00, 141.00, 240.00, -114.32, -66.00 , -129.90, -75.00 ), + (23, 'B', 240, 5, 19.11, 180.40, 198.40, 189.40, 259.11, -177.15, -34.08 , -194.83, -37.48 ), + (24, 'B', 240, 4, 40.89, 180.40, 198.40, 189.40, 280.89, -177.15, 34.08 , -194.83, 37.48 ), + (25, 'B', 240, 3, 30.00, 111.90, 129.90, 120.90, 270.00, -111.90, 0.00 , -129.90, 0.00 ), + (26, 'B', 300, 1, 0.00 , 57.00 , 75.00 , 66.00 , 300.00, -49.36 , 28.50 , -64.95 , 37.50 ), + (27, 'B', 300, 2, 0.00 , 132.00, 150.00, 141.00, 300.00, -114.32, 66.00 , -129.90, 75.00 ), + (28, 'A', 300, 5, 19.11, 180.40, 198.40, 189.40, 319.11, -118.09, 136.38 , -129.87, 149.98 ), + (29, 'A', 300, 4, 40.89, 180.40, 198.40, 189.40, 340.89, -59.06 , 170.46 , -64.95 , 187.47 ), + (30, 'A', 300, 3, 30.00, 111.90, 129.90, 120.90, 330.00, -55.95 , 96.91 , -64.95 , 112.5 ), ) ################################################################################################### @@ -61,12 +62,15 @@ class Puck: self.center = center self.led_uni = led_uni self.led_mini = led_mini - self.detect = None + self.detect = DET_UNKNOWN def __str__(self): return "Number: " + str(self.id) + "\nBlock: " + str(self.block) + "\nIndex: " + str(self.index) + "\nAngle: " + str(self.angle) + \ "\nCenter: " + str(self.center) + "\nLed Unipuck: " + str(self.led_uni) + "\nLed Minispine: " + str(self.led_mini) + def get_name(self): + return str(self.block) + str(self.index) + def match(self, x, y): if math.hypot(x-self.led_uni[0], y-self.led_uni[1]) <= LED_TOLERANCE: return DET_UNIPUCK @@ -168,14 +172,15 @@ def detect_pucks(point_list, id=None): def clear_detection(block_id=None): for puck in get_pucks(block_id): - puck.detect = DET_ERROR + puck.detect = DET_UNKNOWN + return get_puck_detection_dict(block_id) def get_puck_detection(det_type, block_id=None): ret = [] for puck in get_pucks(block_id): if puck.detect == det_type: - ret.append(puck.id) + ret.append(puck) return ret def get_unipucks(block_id=None): @@ -187,17 +192,51 @@ def get_minispines(block_id=None): def get_empties(block_id=None): return get_puck_detection(DET_EMPTY, block_id) +def get_unknowns(block_id=None): + return get_puck_detection(DET_UNKNOWN, block_id) + def get_det_errors(block_id=None): return get_puck_detection(DET_ERROR, block_id) + +def get_puck_detection_dict(block_id): + ret = {} + pucks = [] + for puck in get_unipucks(block_id): + pucks.append(puck.get_name()) + pucks.sort() + ret["Unipuck"] = pucks + pucks = [] + for puck in get_minispines(block_id): + pucks.append(puck.get_name()) + pucks.sort() + ret["Minispine"] = pucks + pucks = [] + for puck in get_det_errors(block_id): + pucks.append(puck.get_name()) + pucks.sort() + ret["Error"] = pucks + pucks = [] + for puck in get_empties(block_id): + pucks.append(puck.get_name()) + pucks.sort() + ret["Empty"] = pucks + pucks = [] + for puck in get_unknowns(block_id): + pucks.append(puck.get_name()) + pucks.sort() + ret["Unknown"] = pucks + return ret + ################################################################################################### #Plotting ################################################################################################### from plotutils import * -def plot_base_plate(points = None, show_detect = True, title = None): +def plot_base_plate(points = None, show_detect = True, title = None, p = None): colors = (Color.RED, Color.BLUE, Color.MAGENTA, Color(128,0,128), Color(0,128,0), Color(255,128,0)) - p = plot(None, title=title)[0] + if p is None: p = plot(None, title=title)[0] + p.getAxis(p.AxisId.Y).setInverted(True) plot_circle(p, 0, 0, PLATE_SIZE/2, width = 0, color = Color.GRAY, name = "Plate") plot_point(p, 0, 0, size = 10, color = Color.GRAY, name = "Center") #p.setLegendVisible(True) @@ -206,10 +245,11 @@ def plot_base_plate(points = None, show_detect = True, title = None): (ymin, ymax) = block.y_range (xmin, ymin, xmax, ymax ) = block.roi index = get_blocks().index(block) - r = plot_rectangle(p, xmin, ymin, xmax, ymax, width =1, color=colors[index], name = block.id) + r = plot_rectangle(p, xmin, ymin, xmax, ymax, width =0, color=colors[index], name = block.id) #In the first time the plot shows, it takes some time for the color to be assigned #while r.color is None: # time.sleep(0.001) + if block.id in ('A', 'F'): x, y = (xmin + xmax)/2, ymax + 5 elif block.id in ('C', 'D'): @@ -218,9 +258,9 @@ def plot_base_plate(points = None, show_detect = True, title = None): x, y = xmax + 5, (ymin + ymax)/2 elif block.id == 'E': x, y = xmin - 5, (ymin + ymax)/2 - + p.addText(x,y, str(block.id), r.color) - + for puck in get_pucks(block.id): (xu, yu) = puck.led_uni (xm, ym) = puck.led_mini @@ -250,5 +290,3 @@ def plot_base_plate(points = None, show_detect = True, title = None): plot_cross(p,point[0], point[1], size = 12, width = w, color = c, name = "P"+ str(points.index(point))) #plot_point(p,point[0], point[1], size = 5, color = Color.BLACK, name = "Pc"+ str(points.index(point))) - - diff --git a/script/test/TestCoverDetection.py b/script/test/TestCoverDetection.py new file mode 100644 index 0000000..d65da21 --- /dev/null +++ b/script/test/TestCoverDetection.py @@ -0,0 +1,19 @@ + +ca = [] +aa = [] +pa = [] + +#for i in range(6): + #index = i+1 +for i in ['A', 'B', 'C', 'D', 'E', 'F']: + hexiposi.move(i) + [position, angle, confidence] = run("imgproc/CoverDetection2") + print [position, angle, confidence] + pa.append(position) + aa.append(angle) + ca.append(confidence) + +print "---" +print "Position: " ,pa +print "Angle: " ,aa +print "Confidence: " ,ca, " mean: ", mean(ca) \ No newline at end of file