From 9abed876cd2355a8cda9ab917b4749f616e721cc Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 20 Apr 2021 19:59:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?CHART-18997=20=E5=A4=84=E7=90=86=E4=B8=8B?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=A8=A1=E6=9D=BF=E5=87=BA=E9=94=99=E6=97=B6?= =?UTF-8?q?=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/actions/file/EditEnvAction.java | 11 +++++ .../design/actions/file/SwitchExistEnv.java | 12 ++++- .../design/dialog/link/MessageWithLink.java | 49 ++++++++++++------- .../fr/design/mainframe/DesktopCardPane.java | 29 +++++++++-- .../mainframe/EastRegionContainerPane.java | 2 +- .../com/fr/design/mainframe/JTemplate.java | 11 ++++- .../fr/design/mainframe/OpenLoadingPane.java | 5 +- .../main/java/com/fr/design/menu/MenuDef.java | 2 +- .../com/fr/design/worker/open/OpenWorker.java | 44 +++++++++++++++-- 9 files changed, 136 insertions(+), 29 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java b/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java index a4b7c8803..d007e315f 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java @@ -3,6 +3,8 @@ package com.fr.design.actions.file; import com.fr.design.EnvChangeEntrance; import com.fr.design.actions.UpdateAction; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; import java.awt.event.ActionEvent; @@ -17,4 +19,13 @@ public class EditEnvAction extends UpdateAction { public void actionPerformed(ActionEvent e) { EnvChangeEntrance.getInstance().chooseEnv(); } + + @Override + public void update() { + super.update(); + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (template != null) { + this.setEnabled(!template.isSaving()); + } + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java index bc88f72fd..c59a92b97 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java @@ -1,10 +1,11 @@ package com.fr.design.actions.file; -import com.fr.base.svg.IconUtils; import com.fr.design.DesignerEnvManager; import com.fr.design.EnvChangeEntrance; import com.fr.design.actions.UpdateAction; import com.fr.design.env.DesignerWorkspaceInfo; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; @@ -68,5 +69,14 @@ public class SwitchExistEnv extends MenuDef { EnvChangeEntrance.getInstance().switch2Env(envName); } } + + @Override + public void update() { + super.update(); + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (template != null) { + this.setEnabled(!template.isSaving()); + } + } } } diff --git a/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java b/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java index 8a1f55cbd..889a0c3c9 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java +++ b/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java @@ -9,6 +9,7 @@ import java.awt.Font; import java.net.URI; import javax.swing.JEditorPane; import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; /** * 用来构建JOptionPane带超链的消息提示 @@ -19,31 +20,45 @@ import javax.swing.event.HyperlinkEvent; */ public class MessageWithLink extends JEditorPane { + private static final UILabel LABEL = new UILabel(); + + public MessageWithLink(String message, String linkName, String link) { - super("text/html", "" + message + "" + linkName + "" + ""); - addHyperlinkListener(e -> { - if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { - try { - Desktop.getDesktop().browse(URI.create(link)); - } catch (Exception exception) { - FineLoggerFactory.getLogger().error(exception.getMessage(), exception); - } - } - }); - setEditable(false); - setBorder(null); + this(message, linkName, link, LABEL.getBackground(), LABEL.getFont()); } public MessageWithLink(String linkName, String link ) { this(StringUtils.EMPTY, linkName, link); } - private static StringBuilder getStyle() { - // 构建和相同风格样式 - UILabel label = new UILabel(); - Font font = label.getFont(); - Color color = label.getBackground(); + public MessageWithLink(String message, String linkName, String link, Color color) { + this(message, linkName, link, color, LABEL.getFont()); + } + + public MessageWithLink(String message, String linkName, String link, Color color, Font font) { + super("text/html", "" + message + "" + linkName + "" + ""); + initListener(link); + setEditable(false); + setBorder(null); + } + + protected void initListener(String link) { + addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { + try { + Desktop.getDesktop().browse(URI.create(link)); + } catch (Exception exception) { + FineLoggerFactory.getLogger().error(exception.getMessage(), exception); + } + } + } + }); + } + private static StringBuilder generateStyle(Color color, Font font) { + // 构建相同风格样式 StringBuilder style = new StringBuilder("font-family:" + font.getFamily() + ";"); style.append("font-weight:").append(font.isBold() ? "bold" : "normal").append(";"); style.append("font-size:").append(font.getSize()).append("pt;"); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java index f940f8904..a2cc6f806 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java @@ -21,10 +21,16 @@ import javax.swing.JLayeredPane; */ public class DesktopCardPane extends BasicPane implements TargetModifiedListener { + private static final int CONTENT_LAYER = 0; + private static final int TRANSPARENT_LAYER = 1; + private static final int LOADING_LAYER = 2; + private static final int FAILED_LAYER = 3; + private static final long serialVersionUID = 1L; private JTemplate component; private TransparentPane transparentPane = new TransparentPane(); private OpenLoadingPane loadingPane = new OpenLoadingPane(); + private OpenFailedPane failedPane = new OpenFailedPane(); private JLayeredPane layeredPane = new JLayeredPane() { @Override public void doLayout() { @@ -36,8 +42,9 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener protected DesktopCardPane() { setLayout(new BorderLayout()); - layeredPane.add(transparentPane, 1); - layeredPane.add(loadingPane, 2); + layeredPane.add(transparentPane, TRANSPARENT_LAYER); + layeredPane.add(failedPane, FAILED_LAYER); + add(layeredPane, BorderLayout.CENTER); } protected void showJTemplate(final JTemplate jt) { @@ -53,7 +60,7 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener layeredPane.remove(component); } component = jt; - layeredPane.add(component, 0); + layeredPane.add(component, CONTENT_LAYER); checkSavingAndOpening(jt); add(layeredPane, BorderLayout.CENTER); validate(); @@ -69,18 +76,34 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener showCover(); } else if (jt.isOpening()) { showOpenStatus(); + } else if (jt.isOpenFailed()) { + showOpenFailedCover(); } else { hideCover(); } } + /** + * 让loadingPane懒加载 + */ + private void checkLoadingPane() { + if (layeredPane.getComponent(LOADING_LAYER) != loadingPane) { + layeredPane.add(loadingPane, LOADING_LAYER); + } + } + private void showOpenStatus() { DesignerContext.getDesignerFrame().refreshUIToolBar(); DesignerFrameFileDealerPane.getInstance().stateChange(); EastRegionContainerPane.getInstance().updateAllPropertyPane(); + checkLoadingPane(); layeredPane.moveToFront(loadingPane); } + public void showOpenFailedCover() { + layeredPane.moveToFront(failedPane); + } + public void showCover() { layeredPane.moveToFront(transparentPane); DesignerContext.getDesignerFrame().refreshUIToolBar(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 8097d02f4..3bf9848de 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -794,7 +794,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public void setEnabled(boolean isEnabled) { JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (template != null) { - this.isEnabled = isEnabled && !template.isOpening() && !template.isSaving(); + this.isEnabled = isEnabled && template.checkEnable(); } else { this.isEnabled = isEnabled; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index b374dbbf9..8d526971c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -115,6 +115,7 @@ public abstract class JTemplate> protected TimeConsumeTimer consumeTimer = new TimeConsumeTimer(); private volatile boolean saving = false; private volatile boolean opening = false; + private volatile boolean openFailed = false; private PluginEventListener pluginListener; @@ -1585,8 +1586,16 @@ public abstract class JTemplate> this.opening = opening; } + public boolean isOpenFailed() { + return openFailed; + } + + public void setOpenFailed(boolean openFailed) { + this.openFailed = openFailed; + } + public boolean checkEnable() { - return !isSaving() && !isOpening(); + return !isSaving() && !isOpening() && !isOpenFailed(); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java b/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java index 5a8131973..9ee095c99 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe; import com.fr.design.gui.ilable.UILabel; -import com.fr.general.IOUtils; import java.awt.Color; import java.awt.Component; import java.awt.Container; @@ -17,6 +16,8 @@ import javax.swing.JPanel; */ public class OpenLoadingPane extends JPanel { + private static final ImageIcon LOADING_ICON = new ImageIcon(OpenLoadingPane.class.getResource("/com/fr/design/images/mainframe/loading.gif")); + private UILabel loadingLabel; public OpenLoadingPane() { @@ -53,7 +54,7 @@ public class OpenLoadingPane extends JPanel { } }); setBackground(Color.WHITE); - loadingLabel = new UILabel(new ImageIcon(IOUtils.readImage("com/fr/plugin/chart/vanchart/export/loading.png"))); + loadingLabel = new UILabel(LOADING_ICON); add(loadingLabel); } diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index 55b80c0ec..cee1658b9 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -411,7 +411,7 @@ public class MenuDef extends ShortCut { JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); boolean flag = true; if (template != null) { - flag = !template.isSaving() && !template.isOpening(); + flag = template.checkEnable(); } component.setEnabled(flag); if (!flag) { diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java index f16602051..2da4d335e 100644 --- a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java @@ -1,11 +1,15 @@ package com.fr.design.worker.open; +import com.fr.chart.exception.ChartNotFoundException; +import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.worker.WorkerManager; +import com.fr.exception.DecryptTemplateException; import com.fr.file.FILE; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; @@ -13,7 +17,9 @@ import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import javax.swing.JOptionPane; import javax.swing.SwingWorker; +import javax.swing.UIManager; /** * 模板打开的worker @@ -54,11 +60,34 @@ public class OpenWorker extends SwingWorker { result = get(); } catch (CancellationException ignored) { return; - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (Throwable t) { + processFailed(); + Throwable cause = t.getCause(); + if (cause instanceof DecryptTemplateException) { + FineJOptionPane.showMessageDialog( + DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Encrypt_Decrypt_Exception"), + Toolkit.i18nText("Fine-Design_Basic_Alert"), + JOptionPane.WARNING_MESSAGE, + UIManager.getIcon("OptionPane.errorIcon") + ); + } + if (cause instanceof ChartNotFoundException) { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Chart_Not_Found_Exception"), + Toolkit.i18nText("Fine-Design_Basic_Error"), + JOptionPane.ERROR_MESSAGE, + UIManager.getIcon("OptionPane.errorIcon")); + } + FineLoggerFactory.getLogger().error(t.getMessage(), t); + return; } - this.template.setOpening(false); // 后续动作 + processResult(); + } + + private void processResult() { + this.template.setOpening(false); if (slowly && templateCallable != null) { try { JTemplate book = templateCallable.call(); @@ -89,6 +118,15 @@ public class OpenWorker extends SwingWorker { WorkerManager.getInstance().removeWorker(taskName); } + private void processFailed() { + this.template.setOpenFailed(true); + this.template.setOpening(false); + DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showOpenFailedCover(); + DesignerFrameFileDealerPane.getInstance().stateChange(); + WorkerManager.getInstance().removeWorker(taskName); + + } + public void addCallBack(Callable> templateCallable) { this.templateCallable = templateCallable; } From 907e2957afe37bad882a49c5d1ae6dd1dfeb2f33 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 20 Apr 2021 20:06:24 +0800 Subject: [PATCH 2/2] =?UTF-8?q?CHART-18997=20=E5=A4=84=E7=90=86=E4=B8=8B?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=A8=A1=E6=9D=BF=E5=87=BA=E9=94=99=E6=97=B6?= =?UTF-8?q?=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/OpenFailedPane.java | 92 ++++++++++++++++++ .../fr/design/images/mainframe/loading.gif | Bin 0 -> 17443 bytes .../design/images/mainframe/open_failed.png | Bin 0 -> 2550 bytes 3 files changed, 92 insertions(+) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif create mode 100644 designer-base/src/main/resources/com/fr/design/images/mainframe/open_failed.png diff --git a/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java b/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java new file mode 100644 index 000000000..101585abb --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java @@ -0,0 +1,92 @@ +package com.fr.design.mainframe; + +import com.fr.design.dialog.link.MessageWithLink; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.general.IOUtils; +import com.fr.stable.StringUtils; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.LayoutManager; +import javax.swing.JPanel; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/20 + */ +public class OpenFailedPane extends JPanel { + + private UILabel label; + private MessageWithLink link; + + public OpenFailedPane() { + this.setLayout(new LayoutManager() { + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return parent.getPreferredSize(); + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + int width = parent.getParent().getWidth(); + int height = parent.getParent().getHeight(); + int labelWidth = label.getPreferredSize().width; + int labelHeight = label.getPreferredSize().height; + int labelX = (width - labelWidth) / 2; + int labelY = (height - labelHeight) / 2; + int linkWidth = link.getPreferredSize().width; + int linkHeight = link.getPreferredSize().height; + int linkX = (width - linkWidth) / 2; + int linkY = (height - labelHeight) / 2 + labelHeight; + label.setBounds(labelX, labelY, labelWidth, labelHeight); + link.setBounds(linkX, linkY, linkWidth, linkHeight); + } + }); + this.setBackground(Color.WHITE); + label = new UILabel(IOUtils.readIcon("/com/fr/design/images/mainframe/open_failed.png"), UILabel.CENTER); + link = new MessageWithLink(Toolkit.i18nText("Fine-Design_Open_Failed_Tip"), Toolkit.i18nText("Fine-Design_Open_Failed_Retry"), StringUtils.EMPTY, Color.WHITE) { + @Override + protected void initListener(String link) { + addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { + // 重试 + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + template = JTemplateFactory.createJTemplate(template.getEditingFILE()); + DesignerContext.getDesignerFrame().addAndActivateJTemplate(template); + HistoryTemplateListCache.getInstance(). setCurrentEditingTemplate(template); + } + } + }); + } + }; + link.setBackground(Color.WHITE); + this.add(label); + this.add(link); + } + + + +} diff --git a/designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif b/designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..c77b4fe1006d29f61dddeb03fa96d3614184947c GIT binary patch literal 17443 zcmaKTcRY-zH8gEnfqRuWQd{P#v?ZFAw~4DX z8#pTKHgHsCR_<{B@ZS4;pT6Vy@elCfjMsV3^Ln3yi<`5xO~?$;5BypI{&+KcvVEdO zI59iFJUYEt-!~Ii|9yC3KI+=oqrr)Njo&jLjE_t%{+L}{US8R8bu^^*oAAd%-&axp zH_^R!6OH}j=Q<~QMt)uH`T6j}#N6U?+rY&5ucd3w*C$IKQ zFD|cqon9z^_T%2$UvI}mPlrU+&!)Cq937ik;w-9L{u{iK(Uyc(JRJh>?NJl8)u&%X0B_1@2p z0nvva^M`Kz$ZMWxdOLo*e&e>5j?8rIlBsq9?->58nL>yF8lH{QZ$o^lM=` z{r>o*Xn8`kn0)VNLED7j)7;bH*_rvJp3igBb4ztEfBIK`jcXWv^;LA>)>!1#Z|%Zg zW3!9XqUG~Xrmppkf1X$z{JC(ve=-3Prv^B zHa|VT)cWz)haYoEe|$@9{5J4oG5x{V^!)O(VNu`6{PvpB12=#4eEHS$Wxi)b)G;)1 z`1X&x?KC|@T{lw7t;=wyChXbsTu-y>}gwTkcQL*;KpLZV; z2~pwp#Eq6-WG|LuL}Zlfq43$EsXXaj7HN3jy3_QVoaM+^zwlbB#n z6eIn62{Eky8a8&X@n6d^4%-uBav+3dVrooYUDCfAdU^f-o5sZaSL?kAei8r1`+p9+ z*Z&|Z!o)9P@1Df?un2K;&DE(`wvO=;Aqjip{rBvN{+ARPk$V#M?2X*RA~-s(O3j*} z>lG3f6}$RS@2_57Ubb$rdlN!p!y?@1_C)bG#!*q>wpKPaW^|gfjg1x6+|<;GMsu=p zb~YnBo6@Xp%*?FU{;My2Pgr71L~O#p`iB3zFZDn6T{VapmUw1*M10h~h;ZllJu!s8 z7H%8$pRug{kK_H*H~c?ivHp*JO~hbKR@M8Py8rb^Y(uLb|I2vAU;fMdBVxriA1^j; z(8}`C;==r#=-2Gb^wi|U_|G5T$G(kz9r^P4)9}#Xfbipo_wW9E`=7yA z&!0W*deYhP_)&XXYfCf#;e-44?%w&M>GrLgjW-(Vd3D#XUA=O-w&v2s3)NMX73Js4 z&YeAT`c!F2@yVjXf_!e?iQ~CB*;$zx>1nAc$sG2vqeqesA3Ato|Gvb8z439ZJ+U#- zyLUxJ?%WX(9u^wH+`esV@RrS+f;I*Q_;2v@W%zh|d3w0Jxw<$z(H&`2io<$)yLGlU z)@!XSEzHeK$tK1|h6eh2x;olgBu%0QL4A#ys*19bqJq4fEM7($Cxw;7pixMK1RMs1 zfW;v~V-5;~0xN)_I9dR!i4;Jr082LD$m;4STDuqR%_AZ@X*( ztxqfUzJF)tTmOySAD=JHUjnwC-M!K$bjB#6MtZMofAQe{!msh68xopBPR0|8RZSgS z3VUS*fa?m`Q29t92dqtb3b7RK&zDzI1wT!d4U8N}Q`}KAkd8-j0V~Xe3+wusQ7 zszM^BNokXCUJ~n@#zXV-2yXcWCbm&K3N0UWQ%~>{$}{u8Y|~B&$7H?F^zgD;ox(N6 zdc-qpux{1JkPk|}CfbyIer2xJ=tvdUS^sNwk@Fp-l#4RTSKGi&`1MkGy8dWQb@8sz z+6&1I$#SP@jcnE0wiW$vR~ujL`gX19^JRnUow*eH6{%|tunlj+QHG9Jcr8WNkJema zG;~>gGo%TO+s7Kw0ayBN_G?$i_`TbASa91l%^;RKye8tuACL>X`|ga*55@Y9H>|6p z29#I+e6TqC?dL;4;wfAn`||LQ`>>FK&KAttvGG=%i($Q*maJjSJp_K(-9dH#*u-N( zhT&vKng2U(^WY9U!6VJvW0PH~CDC#BM)d#0b&J}EBtdUbs^4qt1Cd%jM` ztDzH9aaGCCBnXs(o_7szbZ|AecJs0Q+NHg_Zs-yic+;R5bH`14?kB!R+o&n2%=QgQ z$q-7vGv4kpcy@~xtGV)-4KpUhL(%&_p8Yj&Sf_7)xIe(BcJDMv{WV~#b3!oqc$>Y= zC-Rn~xX=7u&*$EH-d;+4l5fyBH)3=+7B_M&`}v`s>k81j7dILhPW-s{>jAmly!Tz~ zC^EmLZK6Y`ZgKMI+MjlilXHfPwW22_7%rqR{WH9nYO43y*cTkh=P=rg{+P(`4uL&?$ zWZ${_DVjaAj`_iujii>3ZWv*4YN{D<*8~H$aVryK*>n@lZ-&`1{4bDTFo#TGYMW!n zsNF>xgvd+V!KKQqU^&N$$`hHco!=JhL6%orY4FY`Ihl$U3u1^^2>EjXoa;$!r}eD{V~~+ z%V6s_hVHy3U|X?pXUx3)*q3uJzA7VR$Xio5Hiy%oi@t2yLHx-gsP-ok0S#*!RC+Xa zcFp3%O0u--)jar|=40@|ra%j!w0jM0{dVU}eOZV^tLTzavz|{|91{(10-GdEnE3$B z>gbx3`@m)#XEvq$VBscoqfkoL&?5X!zYf4+JV^ErfufnvAFh|{cW#!6lWUa-TbxKO ziT@5?Zi0Z@LbwklY1n*j`|N=`X6LULB!H352tOf!44w)rD`h(*Y+9Sb5+c+CXhs)p zyJgc0_)M4thR~DJ50-vAo*`*FWq*0iv&(~hTfP?IklX#6ubUnQ z8(EMMEkr1EM3IKL-ux4-E@=P8%(`;8X@eWACowdwYi zC1#*0y1ZE=h5inJ?328uLmHvVk{aL&?{00e|1jb0U%_s5t%jA`Y&6FSIZD=Zos1I= zMVCB3>2I0qOdR3hwfrD~^*JyYyZPi}&(CH)e_#;+;N))#)!ch~MLVt(?xaXg&3y2O zb|4?-G#Z!X`r(vzOC;RsvXG;`qNKgOi4K~MJMO%0zMH$RaXq1et)^##@jb+!;Mr3%C#+{sN);SEUxR8cPAjr z&$8*zS$|l_;%)Rx`H}DiUr7GcurWFBqwZtt8%@q@FFpGndwAhbA@+9DW3M0aXBOU# zc;CMB`q__tcNgA|pSXRmHU52&=PgvgNQ=S)COXMN_>u4R!Km$Z)=tGm;R`a@1pEm7 z>7?-E%B}VXciBJn1vi2lf`SV$~6@6 z6(5l~e(!`z=bB)61Y0T`LxJcz`^mA#bCIrW+}+(y2DsAxH@+vny6;JAn>X!HQ7ykM zii4rBkrIpdlfHWGztit9i@M!f`C&b8PttCJJk{k_;!dB1H-*B%Mi%Y+e)WZe3(LRwQV+&6d=>{)Rzw|n zzsNz+8Pm7a*VK8Ekz1Ql))y9=cOn#(IC=%z>|%Jvm`JqHl{oVoR7Lf#_caZ@~|AT44}Qn z!EhnC1qWC%(Eb8Qx;D7AM+ox7K_pwCgmS2N4ItjPc^?1|tc``0gJA>EtpGZt6&t`u zyakRtg&_mk5DlC}1PkoN!YmW8MuZ@AIV?~J2jPG~2HZ#hUTXo55J1ft5@t+TB16KJ z4IGw@t!6;uHvn2eIOqxmI&%RAW8&Nie)0g|B_K4gp;(rpFK-*T8ICRo^$^zDvO>WX zFk%N_&EGeWE@g&0Mj%7In=l+LoGA|M94Mi~#F;a!?sFwhjYu_&r^mC9I3XB4jwoSx z&k(>)La9q5AXCELi~txGxR8sIFPD5x$bLJHnBw|7G7$S&5^Km{*eS>?D^vLB_*h>ixB`;ThM4mp zZ*BubF1S~S0e8bn#v#j0*cM9O*%2u+4{#tuxhx3?15G4=Z(M-jSjP$p2n{l#a0LgB zU>+Ix%-uMW>A(VSv4Y%p#l2-Cwh94z9Eez+r5{?b83!Z~z?&&RA`bp(?FrEMF=Zag z20#NfE<>}hLOy&M0EdU;0A55CkPQg|$qS_AZ%Av+Wu&n@G?2I$wGa=nDd&b&4cG{uH-Ks1koB_8cBg}+g z(Ivo`QB)TNE1^JV%KiGb5qm7K6Czf)=Ww$gaMlB`^1W?N;kxytHLmG$W= z+dEZuZ>!eNS5cI!X|~n$&DG9_s$EZ4yWgpPsDS%7YbgeT0eL`1%vuftD@whTRn`Jq zS=v4O;`}OWS?^z(E02T!#aaMFttIMvqw*?i3EU^U{H=18wdjY?QA{b9Qs7N^E*$|*62qJL%n!=bYM6e=nLv=fxyrWL`@fhRo(ojs4}D#njNzKl<$A!p_HqtJH9GbnV3U+7o|K zLo?Eug5RkjbdGes0X;xx^)3 z+9=jvU*s31_W#8?Jqi`J`RzSOe_Mz!d4nS>{bm^@029CiYs4dO0#@c!R{3o5@gQ9> zpAD%pUs=_KY322pmC>)4J0=1g{s#RoKI_&Xd#1<-Tb<-WxNt?^@LzmZ-_pW5Wr}1d zsXOD8S)Lb0`F$NB;@Q;1vxNaGHj3iesL85WyDh8ind!MaaAT-e%$^mtB+fnlzu2=! z{)M2cX9*iV-GCdMvp(=QdvwWw&0zg;n{jM2cL7)r$jD#RgDQuU-K{I*y{;8iqUmn`-`H?H+Fo+bcg8I$NIV zZ*f~??M_=0&3Y(1sse+@Mr?(Ewvi-{8C8lf2X`Xo{eCz55+GCzLRAc6KM?bmsKp>; zY;AyQF$k=Zt!Sr7#hP{3?4rb0c=8+s>1cZj_b*ZZZiP=mtoA-PY){tqIgMBDR;74c z>aNnazf{sUJ$bRQM}SX_?yDtJ)#5%6DvYRjOCD6 zASrTJ#4aciGFLc}*IDQ%E@PyMQrjOM+Z<}&{c_a>_myq^Ph|`Rk4>pIAz!+@gIEou zfKL}7+tLwAoc12hnyq#7Z}gnpwXW_Aw%a=0_Q_4*WOeC@)PQ!X`w?ADE(YlPWinQy=9wpZm{PnI!yds&@xLWJ-g9{GA+M;mKZAd=_`+qhX(GgEfK z!K_`NSn|*_dL>WS;ER ze4eX~V80pdH@`h427>zw$o{|mhuM4#p+eSJ1)@EJTMl!&qTUjyxW#Sp_KyEm_44~f zE`oZ>G!a0VDfyUfU#I&z-8w97rDvzAbzVP)P_?ixZ+KKfs_WKckG$#wnXJ1*JJhf@ zrO!c9*|`OE#U$D7$nU0m3fLjWq9_(h5^!Z{FQtXkoB~HLZ^`UBU#9Yc=uU6$`q+|2 zgWv0Uc{$8roe%T>Fx_Z=Lr$tnkpCUC=_eZ;z`FIgT`%jl8~Av7#w))4Id~<|&Bco8 zKB>pe5!Dor9X#oH{6Jft})ft00zGff%6bNS)Z(A$a}i{p{DA3<-wx_-jgqlhqfy zHxt#qG`XDrUb8It#4E;^@}NCG!Iy*e4j!C;{i4@AUR&+mRG$y?g^IGPEyBfOz}JuH zMmD<4)5)$Tys?12xgq;1RpM6q*xXYNC2&P~q$i*UUjkX-krsB!7rRN;FH@HkG$KA8 z`(3fcK%^L^oET>EDol}7F?=&3DvChmg|zD9%RDoijEY-xR^0iAUp^`12P^(wTGcCP zcQ=%Aw{(5O#y#Fh@wOUy?JhL%k#KJix^Z_h@{ea)4IeNV7L+M09K7?1Kj2-Xcwvp2 zHHGF@CW7u;*qNH+Qm~K2Wt|*Vzg7r`{T{ae4J+p_STD|t?G35#KT_AsgJbJOTU;m9 z3y&?qu^oZ=L_4|dMI zhNzd#x-{aOtWfMn+LaLEOf%FC9GFW8@vDIDtr&6hYXOoe9R+o57%Z} zaFjRycYIM|vB`?X#$CmyIB*_v46$URD9)*rgq6@lv(QupWQL-|peFN+Tyc=nzr?1K zQ4wy<>2y!2nV&HSf2)Sr-wA)K=X81a*;(+y!PAV0YP@~fys4~h2&E(VMS-pCe05Fh z89!6Mn@@0Z0`5}6$@mr?)!>5W!W$a`@7+T`odxOaPiBDzK04nCH!OLdpZu19i-A>; zcrnPdRgk&@b!rM!Y=RpvRKQbFn#;Qd<>#SW9+7q}>I}Sj^w$OkSpal$B#rGfgly8^ zQT(OZa91FB`$1a3-Y{e-bm1n-B~%k%j!fI9ubl7ZnYCnR6wqJu^2%{vU#+&i1EY^? zBoU(%q=uJxiPtBVzS;I{kmCf5oo)N|dyFjxc8QU#ZjCvs$gBnDsmH{~R1rBykOW#2 zJ4UQ0HhasP@A5xzsrgZAKuyfTq_42Vv~IK8cvE*V)Msga>Dz19sw*XCJ8zA;@QL!s zb#jwMBJ-M-jgE3hoAv4guAGKgwjBcZ4qidaO0225JaLMTUm@Ll+n>iU;D0B?Vqmw}6IOSu>Hna@>ntPmgLQe?We|)eHo>wvvn>a5F2sL?3C2mNAZOPwLX{^{B{9Ido4jEweIrNPW)4>N14<@-33ZLm*SDe?}U-hZw{8o9}kx z?cp(=7}|()D_b9}DWgh~gz0A~f)Mv+eB>Twij3{zX5vCpj@E5f+Qpbuzkf_}^G%ul zY}|ul!)^D8{g>4}f@M^0zO7|NW~JRviPQ6f%!SYc+RLb{I(< zx}!_p-G8i(gdkn8jJ~4p9Q~%-?e_Jp=k`JOKWLIQ%SHzMhElSsD-UR2)*r=hhiVdmiBT8YD{@?6WJsa-JqH9kLkq z)i1P$jpDKK)6Tc=?`KD_(Y5i!r`L`gtU(hvhJX}M?M zPZz)a8upXOqogeVNdOedp|UbsZhjhW8EydwjGG(vHd|B#r8%egg%ntn$x{-AeIUG! zr~3L*a)={A3$tr58B|rfHH}^>%b$1Y@Wv|{Z*JSf{M5}|AiN1K|CG0yYc}U)Nvb#~_RpT9`LHnH_o2I$ZAM|Fp~t<%_K_5B>Rk zvy@AAc^?hNBC8tY9BWQ?Cl3vH?5)@)i$S<|h!2fkr@URM(dxs?t88vLJQnXJ{|XLW zj@qzNclu;-!%0sXep?1d{f3PoNB*hgYd+znVrB=T^~gYT{IlA@mY7Y=p=m0AZvEAz zLk*Yf($5Q5+$M_%)+~a63`5XIz-gfXgklpyRg&b5_$miR3Z;RSppYsTJwk)p`jsF- zYaSRRQqefH2od5O4soz~_r}xO9SW%}q53Ol$E8fJAxO<9NvMi4L&V~%PVY5t!Y2-d z4%XvDJp!ZE!3(7YGMgCyhGO?OjsIz07Oq8gArmGqM$Zs>-b(K4c$E#^Zq4vOFLzu7 zJCH^yx?;=hDmVt#jC?sr3Z3O#-Fk2`*TE)y#Saz;L{gKXb*Zl@awP{eWHHuf1x}@} z|CpD;VBja65w;e7BZ+mc;(`V-T)7X|juS{}EG7Jjs^4^&aL}u-dCF>EzGPdx!8Gghb54DS+nvL4hH^X zX{go3?}DD%`WjP9{VJVsFQ6^;D?ck8zAhoUBEFK1l6Ez|#;+JE*D)0CVzvdnXqQTT zkv4Gpfk0hC={0X?rB^2HF74Rsa5Dcx`SVRvh^2uR4as%#07&>)LR#nY6kJ-hn|%~+ z!*sGlNizuu=<<+{DV$fuKrUA&x00drnlxp_xvDh8{M?2V5Hz6!ial8RB@bszZaL@h zks$0!7*XPvXX|^0qMZ!x;2<1qTSeNjiL4FIAj#!k0PFflr%MMQ>2a~f(Q#adgGmJ` zMQ{+W4S*+Vc4!4F`?KYg$^2#qLh)Q4#7dFuVZ1Uv>4Qy1v_{B*tXm#AtXK4_(wIy$gxK|@dd}BZPypp54bI*}qSj=PCiBTw@u?m`U*j4xBilhb zX~i$4R#uwqidj|_b{e47gi@Nu!H&CWf3(Hv>F=9Pkp?Zd2_QRUo$Bcd5+jv{PIc2M zX%M=={3=x$Jt*u_$~k)g+HpYf~F8 zS`X6Spbf&P^5P!L^!4(!zRSC^!CQ_}b@m$<4)UL4N=KoXata&3x?t-0ex|y{jHU~DpqJh8Kq0JFcG)fXw- z0nc&RNC4g`3F|6a(+BPB&WZ$uPC5JBts|vr7%(Jn#4>CgS3u8}U8wc{THCCw;D+_( z3kD>06;O?5OP$(LPl^l{4z_@^yus1^m0GU6igQ_dW)yoi)A7~m^O7m37z!m_4-R%_?`RreRi){OU6aXb?J{3mout~=P6 zCw;1!>L^n*i}6fVQ#qh#YFTQC+(oO5b2M;LwPn`B=xplj*!S-$imYVE(-^YpHIQ%W z`GDz9z9DIUe$vx^o7HaLc`{17#F`mk|1{^DX8rvm2k;qjfv( z5dYDF`}kD4g>K%>M}&-vDg>gN`i0{^HXZrWkIS8Q@ior#PdU$)d_zd);H7cNIP`-r z{g&1kNQL7;&xRnjylo#1qcRWal7`uZZ+4`0@Y~V>Oen)K;A%e?A*Ea+3Fg-9;2dAZ zG5JzU7l;r*Dvkx^F3YlzhMz#V79{>nGNLd5Q!wbG8mW`ko{a8+jE7kf=9H zZ2&%#4TbOst)}o%G6L<%`!kkt$8P8a(wDAo&FyAfb^1v- z%)(UKumi_;){|)@P99#)W|Q2pvV;^_vml%k^tva>U_B;!stu-CA@l)!HZ(dTw8sU_ z!~{FCo2qGb3&q&+&mM$6zT9jd*1_}z@sTzM$werZ*0es>F%Ir&L%znGzJw}P>4F|J|*+OO#Q>3F2Ol(2w z1XX|ny+?#^wcwe)ZW4ARuxHGvz1L@T%@C7W*rkB_M;2Cw5hxJdeKSDOR)0S18OKM7fUSxQKefMWi-ECoTIFP7aUzAW`HM`5=e zqnGM_7O`^FU)2Vu`N+D|O3O7IMLUfTbPY5NnXHue09PWd`+oQsiMt2B#4q^`ZJbqEe#A>VJ8NcU%u#2 zt8HY_tVl&C>&br5E*DDB0I+4+w#6^*)YQ}4t_lXAW8W)Km#RDJ(|mV)kqtbHyH{!; zMTBTK#k#VoxoE)qN5Pn?rev!z0mE%(AHTAZfjV(;n<@qABySabV7E>X#l_%;^S=rM>c zr&VP`Dp260@Sc-t(E1+6M+N$?J>$R&CKeptZxiR1v@(b1Bk&)boRlPF*(DAK?PTN* zja;uqhVQ zH2n4vUnkeiO+31#Rl~vK@^C{92@*u)=z)}R6}FKxr+KN7(e9ebX!0UA$6-5QN_8kZ zK;%HAaVx&qGhov=sLX@KR;rFnxrTY%b}uskwHr%tixx`Thv z0RIWRSxA$(AEF6Jg{D$`>=l$+Q=u!K9t?v3=#91tiU~9eRLriBwNgsLC4&I}A1VEH(C^BsLoQKBhV-lIeJ5)dUG8ej=ge zSSYCgh$2~!Lz9>8^+>JRt;o%wUQN}=fS{us;ief0z=b46!}Y^1FJZv=8(W7avDL} zl>w+ndUq!~1XySH8YuWTQ_)e=UvYBT%#}ilmZqqchAm7T-CmpbsP75B>r_z&shh+^ z0^k@b{PfXiYj*8=jZ$?N8^Zz$c+Xja-~yi{bipqt#8KzKPT=NTK-O z>%L|iC7Nn)T7Mr*X8^hJM(UP`q7<$7hs;wPZt13NFjz=E++wN9;l8-}u1J$1`vJlB zT5lyv$!+n78IoG>Attp2(sGQ>o1saXIN&6L$I&$v4WYctiez%&YjQWUK^VIKaog9* z!ZZq@<^~5iObV3xqt2C)hBpe*I1kHA8em{zN$leo4#JDYTKo@21gXCova zHqtIeB#ZD?*==2{Qx2LWtM3&D`R-;356)z*ITRtV->uQD`vKY*R#4{dn5jR!y`>FB?Tnc=a zPGG3TsM0X%O|l7+GHb5Z;{b$3ISLyE_242(NfgZ5cF~3mP^qd}hCPTLM+1?A8 zO_sqBQat*Il0)WHZ~_BItU;NshAjw+P@ZHvk;TZZl)dEIuD^LAJLqYp{Ot~>W6Y=BL^kB0Sb<$ z@_Cl-wSitU_V~t5A0JcnY?NP*_ASYbw|#HF_UbT_r85ti-w8?4-jILPH0DV!9>kHR zHd;!?j>^r*islTl7h^hJ8UtcujMe=F1O`{!*R5>TU6_2a$du6ti2KDBL^ zgWb3_t0^1gCJ!AQD|R|-QgBih3*9xY<8sNltVm0Dg1xCX#Io3KE&6+&ECeaqu~nHh z-vZNe#EIPYZv>+C0(YPr?H?7M^Oj7X{%SPXJU+O~*=-Xy+e(k{Y|G5b;hEIH_~SB_ z?7{rgs302zi-y8u;yM>H>}Rk z)G5@jZ2*>x`tYk*=PB8=W25X$)oDz!;y5H@_Woqx#-M5nGzLGBz)_nv1m%RO-4P8Q zkg+Btt8Q^)HA~xwZX8!zzucdvQ?ppXwkog>anufAHkTLH`AfsF7RLVV2sC*x&}XfF zWvWBX$Y8j`wQ^w|In#QW4NK{e&NB3J!)2qTMSIa2WfpIWbR@6V)98|79)ere^+j*= zftFLs4~)c74btYT&pW`%hteHy5oi}AL99<_G~qY1oI$z}%#V$9N@VsAl%#*~hTsJx+3o1b`zm(`b+n-;&An0m15l7HMlfx8Nbx(!3)Q)?Cn{ z56`4%wW2vZcgF`}ii4132IG*9eFR_An~LRm9S|obAc40bCu7#}#$F&mHKfP5fK1gc z8K)Xqv@{{}YAa!5;|v75of(}H6|*T0+=>m7PPp5PnQ-cesV5_|Vx-w@jE3y@7nsOP z*KWN{>@$NRWB#aYBNUc0!Ql3@_h&yuzWx|Tf3Exzk_-+_0zAQI?$zhIyFaB!OAy9G z*aJue3t^gYwbmE2*|m)dvX(vC1R!y}&HH+4pllk(61bzNoxAOjM8091=iU8^{6y;Y zA*Rom%gLiXTFY|=$3bo~7M_;YEQp<7TcdQR)-#?V4Gl5clQ+dzO+>(ATutfvRtr-Q zu%`t%**>Y1!2Tul7-;5vLR&zIg^ds2{Ms;bGh_)oKpF8LUtdkCJVs|j0c3%M(%4US zhp!MUO-#p7K*@nY-B5G^nwZ-nnU8zaZWW2MDs5HO3=g6J|2_y=^?8H;;q(9O7n)PC zn(l^(xJn0qMe`luDG`HGL~x90w@^^nS*Y{9h}$ouBM#jxR%~j!81nFpb=;xNQ4C0- zI&eD3hL*AA0#^I&eI(QT%QLi$u@EncaLL}a*-psS=#GXtAQ+)+Th)p zNop-926ygDlI{M`#(kC(bHM zTPr3|P)a#l&WXaPps`O0AOMchc&-dl9Bu=|)fhM`3>VsC5Re+`$g!zlrXZl-C!HV| zMNM*muj$Pct9%K+xDv);0vxOB*-kigkp$LBO%*JX`s6acG424 zNH?5HiQVM&PV9y57AgcvXq6|Mle`hT$<=hF7oUTAQQ8o=kJ2q_HXA}H3evq*n5W(d2<5T(DgwLH_ikuB;I3-X`XTAp zioK)S8Vk@~+1)C`zXr_dEs2k5h9M0SHvFeFsQ|ia7f#>B6AYRa;5&L{@`apkY!uJg zoM2%JU2A5j@P|_i-+ENxavwQa-le})QYkj6+*u}rWd?1NXX|qDt&1#LuQe;|g^Ftw z4HR*eTJea$3zBUo=~b^!{ox$a;s{eB@lJ1V)gn+}cAh=p5o`#x4K+Ld_px0$jvZ3g~=MgjFM-vX*;HrRDjE|8m(o zt#?sM`#?>1Q7X9JMv0B=XB%<;bo?%x^oP4^OO9Uut6PcR9$ayI~ZoKxQu-3 z0WxgA2lwm~a0<5uz>}ztDnL0h6fDnlG8zm5m-MBSxuj0-b+cLKZFmCpNlgH0)VY!> zboQz8(j_D@k*8JMMVcHnaW(r%rus=yzK-WRYFlt?h*mOU*={H+%c6Ls)5fx``>8?4YUI-R>ArI+Aq+UL$;A>yvtL5V|asaU)CFFgay%&xXL5W&gO8 z@-n*tw$+Gih_r+Y`4A2Qx5&?d9LgN=HIRwqrGS9UooHg&niV=gbUpjHE4MCK-~@5$ zFfDT+c)I%1t_MwkLCe5Er-3Slm1SRj{Bc`juNj|63y7?T7Vm$m=c0sO)HkMiLzyWK zk~pEelz!^EA5BJ2**K)RYe@Uu!4qU;F`}7BQ}PrVY?Iaq9^&HVF)}!XIC59twt84U3M%qrzvhQXGtF-54r0q6+kE_x3 z2(=R>kEM5*+qIfKe8ozIyZ0Xaap0padGcPpKff7-j~*dljcou1A7S5A4sMW_({RGt z==vU4je_!?pfiQ#HtO#Zo=d1_4^I_gHjf<N1F}Y%wHpLl+JjZI@n7>|oI?+WA zp-LlUp?k(Qq6i2rT~k798K=Z7w5MW-NPl+9I8+(ex*<15yvuf@R9~mvMY$I0dKKt) zJD?a@Zs+vnf>fly3tPu6kPzAE6<(Iy6_(+qdInh)d5GgF5$aLs&&}~?rX`%V;DD+w zn!qu;oH;7}d7Eo|B5=CP)8%p1u71mI2N!|*L7YZ)60tIm^$=-_sqQCYWk@k^6W*Pg z@%h-kUhc^EpjL_#po3VbO&aF?q8xKKB=t!S`WZ^97VPD}E}wh&S@JoL*`3LEkZ?bZ zDZx4QlsMnnc5_AfXYIY#$%zJod(0g&Aj7ix&XS*Z)hqPlNA&u3{dBpCt`qGO7|2+M zcw-m5c-g2`KV@$^*x~^}U9CS4Jt*Wi0{~6*1h$;Z@Yr+BqB0G(Y%%H1zCSbd#AaP8 z&T~(h1)q(v5w-HOu`@$RkTOOigRLdfM1!A+_EHQC*9?atv5ib8E1dX{P!zTs~y9p^EBnT8mTNY?0Q?&Zc+AgAw#C0Md-IZzRSgtJ>Z_>6> z(M(mn9vXUrji}z?zAOKPZ0$(_Z|6tQ`j%f|J>Z*u=nkDDY)pT&ne$J{?B9VOu0YT+*)w z5z`X3WPr%BSGh3Fgfnoczxd=GX_TPSCEXO1%T;hp_!Gc#4=*w+PzTskfk zEczH)JO+0?Qy#YC1KazFUiPXM3@PJ6*H!_wUT`BBye7D(RVGt4E>-;34KfZJ6!uI~ z-OM!vc+mW6oG+oxjcIwKJzfr$vRiD0XdPR6S)$DJXJ=uKVJ&D{XG+5(0yiB^xyb>& zhHe3rGDrl1l}a>$4e)_ND!dJF>~zS%%5pFX{jK;f2~0RjS8B1he`G`#j@qF?CuTqp r^>Hmo-(jw!q`z!)hpC=LAu1}3G6~s5tJx=^f;A0~-y^<+x99Tt2eShJ04{_D9Cgl+{|_tk`5y9+Jv|50 zO=BBl0H8UK| zOz@i7I`DypEE_eTWz1P{Xc#)*&*&|W3L~k#S1wk()0I{-irKaSm|sOOq&qzp5!~9! zl8HVk*tu+gV9@coW_+Tv%58;Rjf%zYx~Y@Y#GTZxssut74A#c1R*zzzGGV%LC^R5S zz~A1Po&O5vlseZ;Jjix*I_hsBzLV34#6mh_c7^v12{=aCitmo4%??wfW*Z0c2eZ;b zF%2^g&k&_&TpznK##|A8&(LqGnRfr4nKJZjJ~Jx5C~rygMY<|+Z8#2Of?$yie&FhS z=n(GkS>ix-)|}ed?e-WP${c+bvm3 zoSpE}eo7ujNPv#dgU~>y3%h^cIGN*kDP^}qdOL*;<`*8_uvf&uJ@KtY)k$V+>JR<( zDkg3>l9Y@0V`Y0C)JdmzY)__f;8WM;hl+Y z_4Suv80#&yli!|+(%caZ1NLknQ99=a722~unw#_Z9dA(PFQPRu%NIDp*k8j6@pq7Yz_|{# zeM&kqoqy&h$Ik3ox}bd#lskUAj89MX>DtTHL zwL|QLl@dGVA>2`Viw%l_BQ*#SsXZ02((pB~vR>X8rEOQc2O-T)9p~-zCR9Xpr_%=l zKfGrzot7OktDn>oPl&T~56-{!;XS8p^l+k*%8Gl`9C2_u^jPm(#9Gi}+Nqy~NRIiX zZQ!5OgP`oI1KA6xw7U!Y!V7!u&*+t}j(T5*-kyu$?ky`U9&3mAlGGe)fAd}RfIhV{ zAK3UMtUHbm{nh6YPLylRj+#&QDnQ6YNH9}Ri+b=)mRS#{k}hK8%WIl|SQ~GISO!Bn z!(PIra{)*v6`0h2l92f!0rV8>*Jw_b$8+$~h+(78T_bkQRV2MK05jA6uW-a)e<{?DUIkH|=bH|Y z&!ZpR?<1IS7<8oDqTfy$wn6lpFZ)UZMWK~Sn~ga*U|^lLd*30AQ6g;b<7S3xDK*zh zw?3~m;P@?NB5=T)69x>ZO&mbQ-NWg9PiB-5FCUJIqCbB)lD$)4Y#K(=jisozX{Y^D zvfhB^4~e@cn-D49UWUV}y`D%%9hT;uw&#QLZ3baUYKB)=%2)?uPUs^Xx7@YC0DWk3 zyv*IoRY9hvod{Lz@wekmw?W!<$OC%Fy6P~?K*V8fLcF`grZ} z0)E*_YxQ;%dwx??$DBj6u0j z=OY@y;H5CZns>*_>XLafnZR^fYmdV9&m2Ft9n5_1!FhN&(7*)yDcuv|EJPgjNdjim zg<5C9UZyRH(wI}c??3*CpK10UxG}@Ty1Wk)(PLr_gq&b6rB2*X zAD`a3HWJ^Id;3?W(ONWRXQ$Djk|!ra&*~8j^ST?M%=NAuPAT#xa1*e}WVn2Rq;>L% zfxJ5-R89pkFF5fW8@Hq>CO>Sac)}+^-_;4p=CIu9aygJ=p zaxvg6VIxxX4;Jd;t0XOY$VfI%L+fe(#r8zRy|}1trmhzUm;_$_Ze>yC<|T76=)7kg zr*CLcfF!j=|0~9i(?i+pbA0^G=oR~AoydYbUxR2SVFmdd_8g_W)%zADAGjhoE`ZT& z%%Z7kp>(VA8Cg4aIPPD!bo&G53%Qmb)$#MjRfXodQ~2D6GBAu|WVP=Wv_oG`nhD9W zg<_!qMFS3RsIwCn9-`2_?T!%`x3#1E20)&6|z*2kFdXo?&9VvQ8MJL)?ft-gn98UNDX>? z^b-B_Bz^D)?cJ8x8<tYy4;`_#VIlM%h^=K zUZ@SI(--gdhnJ~!f}kL0kwZwIkc2|wjJ~F1S+ek_e$i2Ux4j*AKsrXj(edc;7<}Ec z*_GhLEG}NF7%)vqK){2@+&RnBTv*RAjzTs=Z~u36${n_JbdpIB$T@%H00=W%c$3Ms G