pax_global_header00006660000000000000000000000064116002071620014505gustar00rootroot0000000000000052 comment=8ec633d196e223642158b37e792b64bcb00b198f uima-as-2.3.1/000077500000000000000000000000001160020716200130445ustar00rootroot00000000000000uima-as-2.3.1/DEPENDENCIES000066400000000000000000000514521160020716200146240ustar00rootroot00000000000000// ------------------------------------------------------------------ // Transitive dependencies of this project determined from the // maven pom organized by organization. // ------------------------------------------------------------------ UIMA-AS: uima-as From: 'an unknown organization' - AOP alliance (http://aopalliance.sourceforge.net) aopalliance:aopalliance:jar:1.0 License: Public Domain - axis axis:axis:jar:1.2-RC1 - axis-jaxrpc axis:axis-jaxrpc:jar:1.3 - ICU4J (http://www.icu-project.org/) com.ibm.icu:icu4j:jar:4.0.1 License: ICU License (http://source.icu-project.org/repos/icu/icu/trunk/license.html) - BeanUtils (http://jakarta.apache.org/commons/beanutils/) commons-beanutils:commons-beanutils:jar:1.6.1 - Codec commons-codec:commons-codec:jar:1.2 - JavaBeans Activation Framework (JAF) (http://java.sun.com/products/javabeans/jaf/index.jsp) javax.activation:activation:jar:1.1 License: Common Development and Distribution License (CDDL) v1.0 (https://glassfish.dev.java.net/public/CDDLv1.0.html) - JavaMail API (https://glassfish.dev.java.net/javaee5/mail/) javax.mail:mail:jar:1.4 License: Common Development and Distribution License (CDDL) v1.0 (https://glassfish.dev.java.net/public/CDDLv1.0.html) - servlet-api javax.servlet:servlet-api:jar:2.5 - jdom jdom:jdom:jar:1.0 - gentlyweb-utils net.sf.josql:gentlyweb-utils:jar:1.5 - josql net.sf.josql:josql:jar:1.5 - common org.eclipse.emf:common:jar:2.1.0 - org.osgi.core org.osgi:org.osgi.core:jar:4.1.0 - spring-aop org.springframework:spring-aop:jar:3.0.3.RELEASE - spring-asm org.springframework:spring-asm:jar:3.0.3.RELEASE - spring-beans org.springframework:spring-beans:jar:3.0.3.RELEASE - spring-context org.springframework:spring-context:jar:3.0.3.RELEASE - spring-context-support org.springframework:spring-context-support:jar:3.0.3.RELEASE - spring-core org.springframework:spring-core:jar:3.0.3.RELEASE - spring-expression org.springframework:spring-expression:jar:3.0.3.RELEASE - spring-jms org.springframework:spring-jms:jar:3.0.3.RELEASE - spring-tx org.springframework:spring-tx:jar:3.0.3.RELEASE - spring-web org.springframework:spring-web:jar:3.0.3.RELEASE - spring-webmvc org.springframework:spring-webmvc:jar:3.0.3.RELEASE - oro oro:oro:jar:2.0.8 - XML Pull Parsing API (http://www.xmlpull.org) xmlpull:xmlpull:jar:1.1.3.4d_b4_min License: Public Domain (http://www.xmlpull.org/v1/download/unpacked/LICENSE.txt) From: 'Apache Software Foundation' (http://jakarta.apache.org/) - HttpClient (http://jakarta.apache.org/httpcomponents/httpclient-3.x/) commons-httpclient:commons-httpclient:jar:3.1 License: Apache License (http://www.apache.org/licenses/LICENSE-2.0) From: 'Apache Software Foundation' (http://www.apache.org) - Log4j (http://logging.apache.org/log4j/docs/) log4j:log4j:jar:1.2.14 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Activation 1.0.2 (http://geronimo.apache.org/specs/geronimo-activation_1.0.2_spec) org.apache.geronimo.specs:geronimo-activation_1.0.2_spec:jar:1.2 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Annotation 1.0 (http://geronimo.apache.org/specs/geronimo-annotation_1.0_spec) org.apache.geronimo.specs:geronimo-annotation_1.0_spec:jar:1.1.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - J2EE Connector 1.5 (http://geronimo.apache.org/specs/geronimo-j2ee-connector_1.5_spec) org.apache.geronimo.specs:geronimo-j2ee-connector_1.5_spec:jar:2.0.0 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - J2EE Management 1.1 (http://geronimo.apache.org/specs/geronimo-j2ee-management_1.1_spec) org.apache.geronimo.specs:geronimo-j2ee-management_1.1_spec:jar:1.0.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - JMS 1.1 (http://geronimo.apache.org/specs/geronimo-jms_1.1_spec) org.apache.geronimo.specs:geronimo-jms_1.1_spec:jar:1.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - JTA 1.1 (http://geronimo.apache.org/specs/geronimo-jta_1.1_spec) org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) From: 'Apache Software Foundation' (http://www.apache.org/) - JTA (http://geronimo.apache.org/geronimo-jta_1.0.1B_spec) org.apache.geronimo.specs:geronimo-jta_1.0.1B_spec:jar:1.0.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) From: 'Extreme! Lab, Indiana University' (http://www.extreme.indiana.edu/) - MXP1: Xml Pull Parser 3rd Edition (XPP3) (http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/) xpp3:xpp3_min:jar:1.1.4c License: Indiana University Extreme! Lab Software License, vesion 1.1.1 (http://www.extreme.indiana.edu/viewcvs/~checkout~/XPP3/java/LICENSE.txt) License: Public Domain (http://creativecommons.org/licenses/publicdomain) From: 'FuseSource' (http://www.fusesource.org) - Commons Management (http://commonman.fusesource.org) org.fusesource.commonman:commons-management:bundle:1.0 License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.html) From: 'Mort Bay Consulting' (http://www.mortbay.com) - Jetty :: Continuation (http://www.eclipse.org/jetty/jetty-continuation) org.eclipse.jetty:jetty-continuation:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: Http Utility (http://www.eclipse.org/jetty/jetty-http) org.eclipse.jetty:jetty-http:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: IO Utility (http://www.eclipse.org/jetty/jetty-io) org.eclipse.jetty:jetty-io:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: Security (http://www.eclipse.org/jetty/jetty-security) org.eclipse.jetty:jetty-security:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: Server Core (http://www.eclipse.org/jetty) org.eclipse.jetty:jetty-server:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: Servlet Handling (http://www.eclipse.org/jetty/jetty-servlet) org.eclipse.jetty:jetty-servlet:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: Utilities (http://www.eclipse.org/jetty/jetty-util) org.eclipse.jetty:jetty-util:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: Webapp Application Support (http://www.eclipse.org/jetty/jetty-webapp) org.eclipse.jetty:jetty-webapp:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: Websocket (http://www.eclipse.org/jetty/jetty-websocket) org.eclipse.jetty:jetty-websocket:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: XML utilities (http://www.eclipse.org/jetty/jetty-xml) org.eclipse.jetty:jetty-xml:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) - Jetty :: Aggregate :: All Server (http://www.eclipse.org/jetty/jetty-aggregate-project/jetty-all-server) org.eclipse.jetty.aggregate:jetty-all-server:jar:7.0.1.v20091125 License: Apache Software License - Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) License: Eclipse Public License - Version 1.0 (http://www.eclipse.org/org/documents/epl-v10.php) From: 'ObjectWeb' (http://www.objectweb.org/) - ASM Core (http://asm.objectweb.org/asm/) asm:asm:jar:3.1 - ASM Commons (http://asm.objectweb.org/asm-commons/) asm:asm-commons:jar:3.1 - ASM Tree (http://asm.objectweb.org/asm-tree/) asm:asm-tree:jar:3.1 From: 'Spring Framework' (http://www.springframework.org) - Spring OSGi Core (http://www.springframework.org/osgi) org.springframework.osgi:spring-osgi-core:bundle:1.2.1 License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Spring OSGi IO (http://www.springframework.org/osgi) org.springframework.osgi:spring-osgi-io:bundle:1.2.1 License: Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0) From: 'Sun Microsystems' (http://java.sun.com/) - ROME, RSS and atOM utilitiEs for Java (https://rome.dev.java.net/) rome:rome:jar:0.8 From: 'The Apache Software Foundation' (http://jakarta.apache.org) - Commons DBCP (http://jakarta.apache.org/commons/${pom.artifactId.substring(8)}/) commons-dbcp:commons-dbcp:jar:1.2.2 License: The Apache Software License, Version 2.0 (/LICENSE.txt) - Logging (http://jakarta.apache.org/commons/logging/) commons-logging:commons-logging-api:jar:1.1 License: The Apache Software License, Version 2.0 (/LICENSE.txt) From: 'The Apache Software Foundation' (http://www.apache.org) - Java Authentication SPI for Containers (http://geronimo.apache.org/maven/specs/geronimo-jaspic_1.0_spec/1.0) org.apache.geronimo.specs:geronimo-jaspic_1.0_spec:bundle:1.0 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Servlet 2.5 (http://geronimo.apache.org/maven/specs/servlet-2.5/1.2) org.apache.geronimo.specs:geronimo-servlet_2.5_spec:jar:1.2 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Apache XBean :: Spring (http://geronimo.apache.org/maven/xbean/3.7/xbean-spring) org.apache.xbean:xbean-spring:bundle:3.7 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) From: 'The Apache Software Foundation' (http://www.apache.org/) - Commons Collections (http://commons.apache.org/collections/) commons-collections:commons-collections:jar:3.2.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Commons Lang (http://commons.apache.org/lang/) commons-lang:commons-lang:jar:2.4 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Commons Logging (http://commons.apache.org/logging) commons-logging:commons-logging:jar:1.1.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Commons Net (http://commons.apache.org/net/) commons-net:commons-net:jar:2.0 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Commons Pool (http://commons.apache.org/pool/) commons-pool:commons-pool:jar:1.5.4 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveIO :: Core (http://activemq.apache.org/activeio-core/) org.apache.activemq:activeio-core:bundle:3.1.2 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: Jar Bundle (http://activemq.apache.org/activemq-all) org.apache.activemq:activemq-all:jar:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: Camel (http://activemq.apache.org/activemq-camel) org.apache.activemq:activemq-camel:bundle:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: Console (http://activemq.apache.org/activemq-console) org.apache.activemq:activemq-console:bundle:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: Core (http://activemq.apache.org/activemq-core) org.apache.activemq:activemq-core:bundle:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: JAAS (http://activemq.apache.org/activemq-jaas) org.apache.activemq:activemq-jaas:bundle:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: Optional (http://activemq.apache.org/activemq-optional) org.apache.activemq:activemq-optional:jar:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: Pool (http://activemq.apache.org/activemq-pool) org.apache.activemq:activemq-pool:bundle:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: Spring (http://activemq.apache.org/activemq-spring) org.apache.activemq:activemq-spring:bundle:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: Web (http://activemq.apache.org/activemq-web) org.apache.activemq:activemq-web:bundle:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ :: KahaDB (http://activemq.apache.org/kahadb) org.apache.activemq:kahadb:bundle:5.4.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - ActiveMQ Protocol Buffers Implementation and Compiler (http://activemq.apache.org/activemq-protobuf) org.apache.activemq.protobuf:activemq-protobuf:maven-plugin:1.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Camel :: Core (http://camel.apache.org/camel-parent/camel-core) org.apache.camel:camel-core:bundle:2.4.0 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Camel :: JMS (http://camel.apache.org/camel-parent/camel-jms) org.apache.camel:camel-jms:bundle:2.4.0 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Camel :: Spring (http://camel.apache.org/camel-parent/camel-spring) org.apache.camel:camel-spring:bundle:2.4.0 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: jVinci: Vinci Transport Library (http://uima.apache.org) org.apache.uima:jVinci:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-adapter-soap: SOAP Adapter (http://uima.apache.org) org.apache.uima:uimaj-adapter-soap:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-adapter-vinci: Vinci Adapter (http://uima.apache.org) org.apache.uima:uimaj-adapter-vinci:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA-AS: uimaj-as-activemq (http://uima.apache.org) org.apache.uima:uimaj-as-activemq:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA-AS: uimaj-as-camel (http://uima.apache.org) org.apache.uima:uimaj-as-camel:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA-AS: uimaj-as-core (http://uima.apache.org) org.apache.uima:uimaj-as-core:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA-AS: uimaj-as-jms (http://uima.apache.org) org.apache.uima:uimaj-as-jms:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA AS: uimaj-as-osgi-runtime (http://uima.apache.org) org.apache.uima:uimaj-as-osgi-runtime:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-bootstrap: Bootstrap launcher (http://uima.apache.org) org.apache.uima:uimaj-bootstrap:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-core (http://uima.apache.org) org.apache.uima:uimaj-core:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-cpe: Collection Processing Engine (http://uima.apache.org) org.apache.uima:uimaj-cpe:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-distr (http://uima.apache.org) org.apache.uima:uimaj-distr:pom:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-document-annotation (http://uima.apache.org) org.apache.uima:uimaj-document-annotation:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Eclipse: uimaj-ep-cas-editor (http://uima.apache.org) org.apache.uima:uimaj-ep-cas-editor:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Eclipse: uimaj-ep-configurator: Descriptor Editor (http://uima.apache.org) org.apache.uima:uimaj-ep-configurator:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Eclipse: uimaj-ep-debug (http://uima.apache.org) org.apache.uima:uimaj-ep-debug:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA-AS Eclipse Plugin: uimaj-ep-deployeditor (http://uima.apache.org) org.apache.uima:uimaj-ep-deployeditor:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Eclipse: uimaj-ep-jcasgen (http://uima.apache.org) org.apache.uima:uimaj-ep-jcasgen:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Eclipse: uimaj-ep-pear-packager (http://uima.apache.org) org.apache.uima:uimaj-ep-pear-packager:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Eclipse: uimaj-ep-runtime (http://uima.apache.org) org.apache.uima:uimaj-ep-runtime:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA-AS Eclipse Plugin: uimaj-ep-runtime-deployeditor (http://uima.apache.org) org.apache.uima:uimaj-ep-runtime-deployeditor:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-examples: SDK Examples (http://uima.apache.org) org.apache.uima:uimaj-examples:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-test-util: JUnit utilities (http://uima.apache.org) org.apache.uima:uimaj-test-util:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - UIMA Base: uimaj-tools: Tools (http://uima.apache.org) org.apache.uima:uimaj-tools:jar:2.3.1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - Apache Velocity (http://velocity.apache.org/engine/releases/velocity-1.6.2/) org.apache.velocity:velocity:jar:1.6.2 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) From: 'The JASYPT team' (http://www.jasypt.org) - JASYPT: Java Simplified Encryption (http://www.jasypt.org) org.jasypt:jasypt:jar:1.6 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) From: 'XStream' (http://xstream.codehaus.org) - XStream Core com.thoughtworks.xstream:xstream:jar:1.3.1 License: BSD style (http://xstream.codehaus.com/license.html) uima-as-2.3.1/LICENSE000066400000000000000000001040471160020716200140570ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ========================================================================= == For the Java Service Wrapper == ========================================================================= Copyright (c) 1999, 2006 Tanuki Software, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the Java Service Wrapper and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sub-license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Portions of the Software have been derived from source code developed by Silver Egg Technology under the following license: BEGIN Silver Egg Techology License ----------------------------------- Copyright (c) 2001 Silver Egg Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sub-license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. END Silver Egg Techology License ------------------------------------- ========================================================================= == For Saxon 8.9 == ========================================================================= MOZILLA PUBLIC LICENSE Version 1.0 1. Definitions. 1.1. ``Contributor'' means each entity that creates or contributes to the creation of Modifications. 1.2. ``Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. ``Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. ``Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. ``Executable'' means Covered Code in any form other than Source Code. 1.6. ``Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. ``Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. ``License'' means this document. 1.9. ``Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. ``Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.11. ``Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. ``You'' means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, ``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, ``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``Utilize'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. 2.2. Contributor Grant. Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims. If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled ``LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. 6. Versions of the License. 6.1. New Versions. Netscape Communications Corporation (``Netscape'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works. If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a ``commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and ``commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the United States of America: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Santa Clara County, California, under the auspices of JAMS/EndDispute; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. EXHIBIT A. ``The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________.'' ========================================================================= == SVG Icons == ========================================================================= This product contains icons from the SVG Icons project. The icons are licensed under the BSD license, but the actual license text is not provided by the SVG Icons project. Here's the generic BSD license template. BSD License Copyright (c) , All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. uima-as-2.3.1/NOTICE000066400000000000000000000027071160020716200137560ustar00rootroot00000000000000Apache UIMA-AS Copyright 2008, 2009 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). Portions of UIMA-AS were originally developed by International Business Machines Corporation and are licensed to the Apache Software Foundation under the "Software Grant License Agreement", informally known as the "IBM UIMA-EE License Agreement". Copyright (c) 2007, 2008 IBM Corporation This product includes software, Apache ActiveMQ, developed at the Apache Software Foundation (http://www.apache.org/). This product includes software known as "The Saxon XSLT and XQuery Processor from Saxonica Limited", whose home page URL is http://www.saxonica.com/ Saxon includes the org.apache.xerces.util.XMLChar module from the Apache Xerces product, renamed as net.sf.saxon.om.XMLChar but otherwise unchanged. See the copyright statements included in the source code of that module for conditions of use. Saxon includes code for performing Unicode normalization that is derived from the sample code published for this purpose by the Unicode consortium. For the terms of use of this code, see http://www.unicode.org/terms_of_use.html, which should be regarded as forming part of these conditions of use, and part of the Saxon documentation. This product contains icons developed by the SVG Icons project (http://sourceforge.net/projects/svgicons), licensed under the BSD license (see LICENSE file).uima-as-2.3.1/README000066400000000000000000000535011160020716200137300ustar00rootroot00000000000000 Apache UIMA Asynchronous Scaleout (UIMA-AS) Version 2.3.1 README ---------------------------------------------------------------- 0. Building from the Source Distribution ======================================== We use Maven 3.0 for building; download this if needed, and set the environment variable MAVEN_OPTS to -Xmx800m -XX:MaxPerSize-256m. Then do the build by going into the .../uima-as directory, and issuing the command mvn clean install. This builds everything except the ...source-release.zip file. If you want that, change the command to mvn clean install -Papache-release Look for the result in the two artifacts: ../uima-as/target/uima-as-[version]-source-release.zip if run with -Papache-release) and ../uima-as/target/uima-as-[version]-bin.zip (or ...tar.gz) For more details, please see http://uima.apache.org/building-uima.html 1. What's New in 2.3.1 ====================== - UIMA-AS repackaged - includes base UIMA - New ActiveMQ version - includes ActiveMQ 5.4.1 with its dependencies - Each thread uses dedicated Serializer/Deserializer instance, removing a bottleneck - Many bug fixes - Multiple improvements to increase performance - Improved error handling and stability - Fixed CDE slow startup with an aggregate containing a remote delegate - Improves and fixes bugs related to XMI delta serialization - Fixes a bug preventing shutdown of C++ services - Improved debugging with optional dumping of JVM stack if process() takes too long - Added detection of failed client before processing a CAS - Fixed bugs in JMX Monitor integrated with UIMA AS service - Improved performance by increasing prefetch size on reply queue - Fixed processParentLast logic 1.1 Contents of Apache UIMA-AS binary distribution -------------------------------------------------- The Apache UIMA-AS binary distribution includes - Apache UIMA Java SDK - Apache UIMA Asynchronous Scaleout extensions - Saxon - Apache ActiveMQ - Spring Framework It includes the base UIMA binary distribution which it depends on. UIMA-AS components, in addition to those that come with base UIMA include: shell scripts: -------------- bin/startBroker.sh/bat: starts the ActiveMQ broker, which must be running before UIMA AS services can be deployed. bin/deployAsyncService.sh/bat: deploys an AnalysisEngine as a UIMA-AS service. Takes one or more UIMA-AS Deployment Descriptors as arguments. bin/runRemoteAsyncAE.sh/bat: Calls a UIMA-AS service. Takes arguments specifying the location of the service, and an optional CollectionReader descriptor file used to obtain the CASes to be processed by the service. documentation: -------------- docs/d/uima_async_scaleout.pdf: UIMA-AS documentation, including the specification for the deployment descriptor file syntax. examples: --------- examples/deploy/as/... (Sample Deployment Descriptors) Deploy_RoomNumberAnnotator.xml: Deploys Room Number Annotator Primitive AE Deploy_MeetingDetectorTAE.xml: Deploys Meeting Detector Aggregate AE with all delegates in the same JVM. Deploy_MeetingDetectorTAE_Whiteboard.xml: Deploys Meeting Detector Aggregate AE using the whiteboard Flow Controller. Deploy_MeetingDetectorTAE_RemoteRoomNumber.xml: Deploys Meeting Detector Aggregate AE that uses remotely deployed RoomNumberAnnotator. Deploy_MeetingDetectorTAE_3MeetingAnnotator.xml: Deploys Meeting Detector Aggregate AE with three instances of the MeetingAnnotator component. Deploy_MeetingDetectorTAE_Sync_3Instances.xml: Deploys 3 instances of the Meeting Detector as a Synchronous Aggregate (meaning the delegate AEs do not each get their own input queue). Deploy_MeetingAnnotator.xml: Deploys C++ Meeting Annotator. Note: requires installation of uimacpp SDK into $UIMA_HOME. MeetingFinderAggregate.xml: Aggregate descriptor that use the same components as the CPE examples MeetingFinderCPE* in base UIMA. Deploy_MeetingFinder.xml: Deploys MeetingFinderAggregate illustrating scalability and error handling similar to the CPM examples; see Section 4 on migration below. descriptors: ------------ descriptors/as/... (Other Sample Descriptors for use with UIMA AS) MeetingDetectorAsyncAE.xml: Specifier that can be used to call a UIMA AS Service from an existing UIMA application; see Section 2.5 below. 2. Installation and Setup ========================= 2.1 Supported Platforms ----------------------- UIMA AS Requires Java 5 or later. It has been tested with Sun Java 5 on Windows XP and Linux, and with IBM Java 6 on Linux. Other platforms and Java (5+) implementations should work, but have not been significantly tested. 2.2. Environment Variables -------------------------- After you have unpacked the UIMA AS distribution, you must perform the following environment variable settings (the same as for normal Apache UIMA setup): * Set JAVA_HOME to the directory of your JRE installation you would like to use for UIMA. * Set UIMA_HOME to the apache-uima-as directory of your unpacked Apache UIMA distribution * Append UIMA_HOME/bin to your PATH Note: The Mac OS X operating system has special procedures for setting up global environment variables; see http://developer.apple.com/qa/qa2001/qa1067.html for how to do this. 2.3 Running the Setup Script ---------------------------- You must run the script UIMA_HOME/bin/adjustExamplePaths.bat (or .sh). This updates paths in the examples based on the actual UIMA_HOME directory path. 2.4 Setting up Eclipse ---------------------- Eclipse users should install the UIMA Eclipse Plugins and UIMA Examples Project using the procedure described in Chapter 3 of the Apache UIMA Overview and Setup guide, which you can find online at http://uima.apache.org; click on Documentation -> HTML Online Version -> Overview and Setup -> 3. Eclipse IDE setup for UIMA. Since UIMA AS requires Java 5, you must be sure to set up your uimaj-examples Eclipse project to use a version 5 (or later) JRE, and you must set your compiler compliance level to 5.0. To do this go to Window->Preferences and navigate to the Java->Compiler page. Remember to run the base Eclipse using Java 5 (or later), as well. 3. Getting Started ================== 3.1 Starting the ActiveMQ Broker -------------------------------- UIMA AS services require an ActiveMQ broker to be available with which to create/register the service request queue. If no broker is available, start a new broker on the same machine the services will run on or another machine; this is done by first setting an env parameter ACTIVEMQ_BASE pointing at a writable directory, or simply by cd'ing to a writable directory, and running: startBroker.sh/bat The first time run this script will create a new directory $ACTIVEMQ_BASE/amq (or ./amq) and default configuration files will be copied there. The configuration files can then be customized to modify broker behavior for subsequent startups. Note: only one broker can be started at a time on the same machine with the same configuration file, or on different machines from the same writable directory. When the broker starts it will print a message such as: INFO TransportServerThreadSupport - Listening for connections at: tcp://yourHostname:61616 Note this URL since you will need it to run services and clients. The tcp listening port must be exposed to any clients or services using the broker. To connect to a broker running behind a firewall using HTTP tunneling, see section 3.6 below. 3.2 Deploying an Analysis Engine as a UIMA AS Asynchronous Service ------------------------------------------------------------------ a. Create a Deployment Descriptor. Examples can be found in the examples/deploy/as directory, and the syntax is documented in docs/d/uima_async_scaleout.pdf. Note: One of the things that the deployment descriptor may contain is a broker placeholder with this syntax: ${defaultBrokerURL}. The placeholder is replaced at runtime with an actual broker URL. The value for the placeholder comes from System properties. The brokerURL attribute of element is optional. If not present, a default of tcp://localhost:61616 will be used. The examples assume the broker is listening on tcp://localhost:61616. b. Run the command: deployAsyncService.sh/cmd [testDD.xml] [-brokerURL url] The argument to the command is the deployment descriptor you created in step (a). An optional argument -brokerURL specifies a URL of the broker that the service will use to create connections to queues. This argument takes effect only if your deployment descriptor does not explicitly name the broker URL in the xml element *or* the brokerURL attribute is set to a placeholder ${defaultBrokerURL}. Omitting brokerURL or using a placeholder is a way to keep your deployment descriptors portable. You don't need to edit your deployment descriptors when switching brokers. Note: If you use import by name in your deployment descriptor, UIMA AS searches the CLASSPATH as well as directories on UIMA_DATAPATH to resolve the import. Note: deployAsyncService.sh/cmd scripts launch UimaBootstrap main program which loads UIMA jars dynamically from UIMA_HOME/lib, UIMA_HOME/apache-activemq-5.4.1, UIMA_HOME/apache-activemq-5.4.1/lib, and UIMA_HOME/apache-activemq-5.4.1/lib/optional directories. If you want to use a different version of ActiveMQ, set the ACTIVEMQ_HOME environment variable to the location of ActiveMQ you intend to use. When using different version of ActiveMQ ( older than version 5.4), start the broker using a startup script located in ACTIVEMQ_HOME/bin directory instead of UIMA_HOME/bin/startBroker.[cmd|sh] script provided in this release. This is due to the fact that the 5.4 branch of ActiveMQ xml schema has changed. The activemq_nojournal.xml provided in this release two optimizations: schedulerSupport=false to disable broker message scheduler, and producerFlowControl="false" to turn off producer flow control. Also, if you want to deploy your own annotator that is installed in a different directory than UIMA_HOME/lib, set the UIMA_CLASSPATH environment variable to point to one or more Classpath entries; these entries can either be directories of Java class files, Jar files, or directories of Jar files (in which case, all the Jars are added in an arbitrary order). Separate multiple entries using File.pathSeparator. Note: Both UIMA AS client and UIMA AS service by default add a time-to-live (TTL) to every request message. This enables expiration of messages that are not consumed. Currently, the UIMA AS client multiplies the Process Timeout value by 10 and uses this as TTL. The UIMA AS service sets TTL to the Timeout value multiplied by the number of outstanding requests. To disable TTL, add a system property -DNoTTL. A convenient way to set this parameter is by adding -DNoTTL to the env parameter UIMA_JVM_OPTS before running deployAsyncService and/or runRemoteAsyncAE. 3.3 Calling a UIMA AS Asynchronous Service ------------------------------------------ To test a remote UIMA service you can use the script: runRemoteAsyncAE.sh/cmd brokerUrl endpoint This connects to a remote AE at specified brokerUrl and endpoint (which must match the inputQueue endpoint in the remote AE service's deployment descriptor). A subset of the optional arguments to runRemoteAsyncAE are: -c Specifies a CollectionReader descriptor. The client will obtain CASes from the CollectionReader and send them to the service for processing. If this option is omitted, one empty CAS will be sent to the service (useful for services containing a CAS Multiplier acting as a collection reader). -d Specifies a deployment descriptor. The specified service will be deployed before processing begins, and the service will be undeployed after processing completes. Multiple -d entries can be given. -o Specifies an Output Directory. All CASes received by the client's CallbackListener will be serialized to XMI in the specified OutputDir. If omitted, no XMI files will be output. The full set of arguments are documented if you type the command with no arguments. 3.4 Quick Test of an async service ---------------------------------- Start two terminal windows, each with an environments setup as described in section 2.2. * In the first terminal window start the broker (as described in section 3.1), by running the commands: cd some-writable-directory startBroker.sh/bat * In the second terminal window, deploy a sample service and send it some CASes: cd $UIMA_HOME/examples/deploy/as runRemoteAsyncAE.sh/cmd tcp://localhost:61616 MeetingDetectorTaeQueue \ -d Deploy_MeetingDetectorTAE.xml \ -c $UIMA_HOME/examples/descriptors/collection_reader/FileSystemCollectionReader.xml If you get an UnsupportedClassVersionError, Java 5 is probably not being used. If the driver fails to find the input data, adjustExamplePaths was probably not run. 3.5 Calling a UIMA AS Asynchronous Service from an Existing UIMA Application You can also call a UIMA AS Service from the DocumentAnalyzer or any other UIMA application using a new JMS client Service Descriptor (see section 1.7 in the UIMA Asynchronous Scaleout documentation). However, note that this is a synchronous interface, that is, it will process only one CAS at a time, so it will not take advantage of the scalability that UIMA AS provides. To process more than one CAS at a time, you can use the Asynchronous UIMA AS Client as described in section 3.3, or write your own application using the UIMA AS Client APIs. An example JMS client service descriptor is provided in examples/descriptors/as/MeetingDetectorAsyncAE.xml The JMS service makes use of the customResourceSpecifier capability in Apache UIMA. For more information on the customResourceSpecifier see the "Custom Resource Specifiers" section in the Apache UIMA Reference manual. 3.6 Firewalls between clients and services ------------------------------------------ A service running behind a firewall can be accessed as long as its input queue is on a broker that is accessable. For example, the service can register with a public broker running outside the firewall. Alternatively the broker may be configured to tunnel over HTTP. For details see http://activemq.apache.org/configuring-transports.html Note: The ActiveMQ 5.4.1 jars distributed with this UIMA AS release include bug fixes described in http://issues.apache.org/activemq/browse/AMQ-1308. Previous releases of UIMA AS included custom ActiveMQ 4.1.1 jars (which we have patched) to remedy the problems. When using ActiveMQ HTTP connector, make sure that both a client and a service use either ActiveMQ 4.1.1 or ActivemMQ 5.4.1+ jars. 3.7 Monitoring a broker and its queues -------------------------------------- When the broker starts it will print a message such as: INFO ManagementContext - JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi Connect a JMX console to this service with: $JAVA_HOME/bin/jconsole service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi (Note: jconsole is available in Java SDK (not JRE) distributions from Sun) If your console is not on the same machine as the broker, replace localhost by the name of the broker's machine. The default ports for the broker (61616) and for the JMX server (1099) can be overridden in the broker configuration file created when the broker is first started. For more details see http://activemq.apache.org/jmx.html 3.8 Monitoring UIMA AS service ------------------------------ UIMA AS service monitoring is available via JMX and jConsole. To enable this, please set the following before starting a service: set UIMA_JVM_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port= -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Connect a jConsole to this JMX service as described in 3.7 above using the appropriate port, e.g. $JAVA_HOME/bin/jconsole service:jmx:rmi:///jndi/rmi://localhost:8009/jmxrmi Under the MBeans tab, expand org.apache.uima in the left panel to view UIMA components enabled for JMX monitoring. 3.9 Stopping UIMA AS service ---------------------------- A service can be stopped from a command line or remotely using jConsole and JMX. When the service is launched it displays a prompt on stdout: Enter 'q' to quiesce and stop the service or 's' to stop it now: It reads stdin expecting either 'q' or 's', ignoring all other characters. When 'q' is typed, the service will quiesce and stop. As part of this, the service closes its input queue and waits until all CASes still "in-play" are finished. When the input CAS is returned the service stops. When 's' is typed the service closes its input queue and immediately releases all CASes being processed and stops. To stop UIMA AS process remotely or if the process runs in a background use jConsole and JMX. Using approach described in 3.8 above launch jConsole. Once the connection is created, in the left pane open: org.apache.uima ee.jms.service Uima EE Service Controller Operations Here you will find two buttons labeled: CompleteProcessingAndStop StopNow CompleteProcessingAndStop will initiate quiesce while StopNow will initiate a hard stop. 4. Migration from CPM to UIMA-AS ================================ Migrating a collection processing engine from the CPM to UIMA-AS is straightforward. First, migrate the CPE descriptor to a standard UIMA aggregate descriptor: create a UIMA aggregate that includes all the components specified in the CPE descriptor. Transfer any parameter overrides in the CPE descriptor to the aggregate descriptor. Note that the aggreate descriptor must set to false to be consistent with collection reader and CAS consumer delegates. Second, test this aggregate descriptor by instantiating the aggregate and sending it a single CAS. The contents of the CAS are not important; its purpose is to start the collection reader delegate which will then create the actual CASes to be processed by the other aggregate components. The CAS Visual Debugger, CVD, is a useful tool for doing this test. Next, create a UIMA-AS deployment descriptor that specifies desired scaleout and error handling. Vinci services are still supported, although it is recommended to replace them with UIMA-AS services to enable more efficient load balancing and greater scaleout capability. An example of this kind of migration is embodied by the sample descriptors: Original: $UIMA_HOME/examples/descriptors/collection_processing_engine/MeetingFinderCPE_Integrated.xml Migrated: $UIMA_HOME/examples/deploy/as/MeetingFinderAggregate.xml $UIMA_HOME/examples/deploy/as/Deploy_MeetingFinder.xml 5. Known problems/limitations with Release 2.3.1 ================================================ 1. No automatic refresh for broken connections with temp reply queues. 2. When connecting to an AMQ broker behind a firewall, avoid using the maxInactivityDuration=0 decoration on the brokerURL (see: http://activemq.apache.org/configuring-wire-formats.html) as it turns off AMQ 'keep alive' messaging. Without these, a firewall may assume a connection has become stale and close its ports. 3. UIMA AS does not (yet) support PEAR specifiers. The deployment descriptor should not point to PEAR file. Instead, PEARs must be unzipped and classpath adjusted to point to required resources. 4. To monitor multiple UIMA AS services on the same machine, each must be assigned a unique JMX port (see section 3.8). 5. Handling of timeouts on Cas Multiplier delegates not working For up-to-date information on UIMA-AS issues, see our issue tracker: http://issues.apache.org/jira/secure/BrowseProject.jspa?id=12310570 Crypto Notice ------------- This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See for more information. The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code. The following provides more details on the included cryptographic software: This distribution includes portions of Apache ActiveMQ, which, in turn, is classified as being controlled under ECCN 5D002. uima-as-2.3.1/RELEASE_NOTES.html000066400000000000000000000064021160020716200157640ustar00rootroot00000000000000 Apache UIMA Asynchronous Scaleout v2.3.1 Release Notes

Apache UIMA-AS (Unstructured Information Management Architecture - Asynchronous Scaleout) v2.3.1 Release Notes

Contents

1. What is UIMA-AS?
2. Major Changes in this Release
3. How to Get Involved
4. How to Report Issues
5. List of JIRA Issues Fixed in this Release

1. What is UIMA-AS?

UIMA Asynchronous Scaleout (AS) is an augmented version of Apache UIMA that additionally provides a set of capabilities for achieving flexible scaleout. It is a second generation design, replacing the CPM and Vinci Services. The CPM and Vinci are still available and are not being deprecated, but new designs are encouraged to use UIMA-AS for scalability, and current designs reaching limitations may want to move to UIMA-AS.

UIMA-AS is integrated with the new flow controller architecture, and can be applied to both primitive and aggregate analysis engines. It fully supports CAS Multipliers.

2. Major Changes in this Release

Please see the README for this information.

3. How to Get Involved

The Apache UIMA project really needs and appreciates any contributions, including documentation help, source code and feedback. If you are interested in contributing, please visit http://uima.apache.org/get-involved.html.

4. How to Report Issues

The Apache UIMA project uses JIRA for issue tracking. Please report any issues you find at http://issues.apache.org/jira/browse/uima

5. List of JIRA Issues Fixed in this Release

Click issuesFixed/jira-report.hmtl for the list of issues fixed in this release. uima-as-2.3.1/aggregate-uima-as-eclipse-plugins/000077500000000000000000000000001160020716200214255ustar00rootroot00000000000000uima-as-2.3.1/aggregate-uima-as-eclipse-plugins/pom.xml000066400000000000000000000056001160020716200227430ustar00rootroot00000000000000 4.0.0 org.apache.uima uima-as-parent 2.3.1 ../uima-as-parent/pom.xml aggregate-uima-as-eclipse-plugins pom 2.3.1 UIMA-AS Aggregate: ${project.artifactId} The aggregate for building the Eclipse plugins that are part of the UIMA-AS framework ${uimaWebsiteUrl} scm:svn:http://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/aggregate-uima-as-eclipse-plugins scm:svn:https://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/aggregate-uima-as-eclipse-plugins http://svn.apache.org/viewvc/uima/uima-as/tags/uima-as-2.3.1-rc7/aggregate-uima-as-eclipse-plugins ${project.artifactId} ../uimaj-ep-deployeditor ../uimaj-ep-runtime-deployeditor ../uimaj-as-osgi-runtime ../uimaj-as-camel ../uimaj-eclipse-feature-deployeditor uima-as-2.3.1/aggregate-uima-as/000077500000000000000000000000001160020716200163245ustar00rootroot00000000000000uima-as-2.3.1/aggregate-uima-as/pom.xml000066400000000000000000000054541160020716200176510ustar00rootroot00000000000000 4.0.0 org.apache.uima uima-as-parent 2.3.1 ../uima-as-parent/pom.xml aggregate-uima-as pom 2.3.1 UIMA-AS Aggregate: ${project.artifactId} The aggregate for building the uima-as functionality, the eclipse plugins, and the docbooks ${uimaWebsiteUrl} scm:svn:http://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/aggregate-uima-as scm:svn:https://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/aggregate-uima-as http://svn.apache.org/viewvc/uima/uima-as/tags/uima-as-2.3.1-rc7/aggregate-uima-as ${project.artifactId} ../uimaj-as-activemq ../uimaj-as-core ../uimaj-as-jms ../aggregate-uima-as-eclipse-plugins ../uima-as-docbooks uima-as-2.3.1/issuesFixed/000077500000000000000000000000001160020716200153375ustar00rootroot00000000000000uima-as-2.3.1/issuesFixed/css/000077500000000000000000000000001160020716200161275ustar00rootroot00000000000000uima-as-2.3.1/issuesFixed/css/maven-base.css000066400000000000000000000043711160020716200206640ustar00rootroot00000000000000body { margin: 0px; padding: 0px; } img { border:none; } table { padding:0px; width: 100%; margin-left: -2px; margin-right: -2px; } acronym { cursor: help; border-bottom: 1px dotted #feb; } table.bodyTable th, table.bodyTable td { padding: 2px 4px 2px 4px; vertical-align: top; } div.clear{ clear:both; visibility: hidden; } div.clear hr{ display: none; } #bannerLeft, #bannerRight { font-size: xx-large; font-weight: bold; } #bannerLeft img, #bannerRight img { margin: 0px; } .xleft, #bannerLeft img { float:left; } .xright, #bannerRight { float:right; } #banner { padding: 0px; } #banner img { border: none; } #breadcrumbs { padding: 3px 10px 3px 10px; } #leftColumn { width: 170px; float:left; overflow: auto; } #bodyColumn { margin-right: 1.5em; margin-left: 197px; } #legend { padding: 8px 0 8px 0; } #navcolumn { padding: 8px 4px 0 8px; } #navcolumn h5 { margin: 0; padding: 0; font-size: small; } #navcolumn ul { margin: 0; padding: 0; font-size: small; } #navcolumn li { list-style-type: none; background-image: none; background-repeat: no-repeat; background-position: 0 0.4em; padding-left: 16px; list-style-position: outside; line-height: 1.2em; font-size: smaller; } #navcolumn li.expanded { background-image: url(../images/expanded.gif); } #navcolumn li.collapsed { background-image: url(../images/collapsed.gif); } #poweredBy { text-align: center; } #navcolumn img { margin-top: 10px; margin-bottom: 3px; } #poweredBy img { display:block; margin: 20px 0 20px 17px; } #search img { margin: 0px; display: block; } #search #q, #search #btnG { border: 1px solid #999; margin-bottom:10px; } #search form { margin: 0px; } #lastPublished { font-size: x-small; } .navSection { margin-bottom: 2px; padding: 8px; } .navSectionHead { font-weight: bold; font-size: x-small; } .section { padding: 4px; } #footer { padding: 3px 10px 3px 10px; font-size: x-small; } #breadcrumbs { font-size: x-small; margin: 0pt; } .source { padding: 12px; margin: 1em 7px 1em 7px; } .source pre { margin: 0px; padding: 0px; } uima-as-2.3.1/issuesFixed/css/maven-theme.css000066400000000000000000000053611160020716200210540ustar00rootroot00000000000000body { padding: 0px 0px 10px 0px; } body, td, select, input, li{ font-family: Verdana, Helvetica, Arial, sans-serif; font-size: 13px; } code{ font-family: Courier, monospace; font-size: 13px; } a { text-decoration: none; } a:link { color:#36a; } a:visited { color:#47a; } a:active, a:hover { color:#69c; } #legend li.externalLink { background: url(../images/external.png) left top no-repeat; padding-left: 18px; } a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover { background: url(../images/external.png) right center no-repeat; padding-right: 18px; } #legend li.newWindow { background: url(../images/newwindow.png) left top no-repeat; padding-left: 18px; } a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover { background: url(../images/newwindow.png) right center no-repeat; padding-right: 18px; } h2 { padding: 4px 4px 4px 6px; border: 1px solid #999; color: #900; background-color: #ddd; font-weight:900; font-size: x-large; } h3 { padding: 4px 4px 4px 6px; border: 1px solid #aaa; color: #900; background-color: #eee; font-weight: normal; font-size: large; } h4 { padding: 4px 4px 4px 6px; border: 1px solid #bbb; color: #900; background-color: #fff; font-weight: normal; font-size: large; } h5 { padding: 4px 4px 4px 6px; color: #900; font-size: normal; } p { line-height: 1.3em; font-size: small; } #breadcrumbs { border-top: 1px solid #aaa; border-bottom: 1px solid #aaa; background-color: #ccc; } #leftColumn { margin: 10px 0 0 5px; border: 1px solid #999; background-color: #eee; } #navcolumn h5 { font-size: smaller; border-bottom: 1px solid #aaaaaa; padding-top: 2px; color: #000; } table.bodyTable th { color: white; background-color: #bbb; text-align: left; font-weight: bold; } table.bodyTable th, table.bodyTable td { font-size: 1em; } table.bodyTable tr.a { background-color: #ddd; } table.bodyTable tr.b { background-color: #eee; } .source { border: 1px solid #999; } dl { padding: 4px 4px 4px 6px; border: 1px solid #aaa; background-color: #ffc; } dt { color: #900; } #organizationLogo img, #projectLogo img, #projectLogo span{ margin: 8px; } #banner { border-bottom: 1px solid #fff; } .errormark, .warningmark, .donemark, .infomark { background: url(../images/icon_error_sml.gif) no-repeat; } .warningmark { background-image: url(../images/icon_warning_sml.gif); } .donemark { background-image: url(../images/icon_success_sml.gif); } .infomark { background-image: url(../images/icon_info_sml.gif); } uima-as-2.3.1/issuesFixed/css/print.css000066400000000000000000000003361160020716200177770ustar00rootroot00000000000000#banner, #footer, #leftcol, #breadcrumbs, .docs #toc, .docs .courtesylinks, #leftColumn, #navColumn { display: none !important; } #bodyColumn, body.docs div.docs { margin: 0 !important; border: none !important } uima-as-2.3.1/issuesFixed/css/site.css000066400000000000000000000000651160020716200176060ustar00rootroot00000000000000/* You can override this file with your own styles */uima-as-2.3.1/issuesFixed/images/000077500000000000000000000000001160020716200166045ustar00rootroot00000000000000uima-as-2.3.1/issuesFixed/images/collapsed.gif000066400000000000000000000000651160020716200212420ustar00rootroot00000000000000GIF89a€!ù , DŽ`ºçžcŠ5 ;uima-as-2.3.1/issuesFixed/images/expanded.gif000066400000000000000000000000641160020716200210630ustar00rootroot00000000000000GIF89a€!ù , „j œ´Î;uima-as-2.3.1/issuesFixed/images/external.png000066400000000000000000000003461160020716200211370ustar00rootroot00000000000000‰PNG  IHDR Óº&gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe< PLTEuuuÿÿÿ™ÿÿÿÑðPtRNSÿÿÿ@*©ôPIDATxÚb`&& @ P6#@ `ÀÄÄäX˜Ć2™Ê« ›‰d@AÔ3ƒ (± *‡½ÜtIEND®B`‚uima-as-2.3.1/issuesFixed/images/icon_error_sml.gif000066400000000000000000000017621160020716200223150ustar00rootroot00000000000000GIF89a÷ÿÿÿ ²±«£ q x v m¸;@’GJf46éÒÓ_ Á· œ › ‚ i [ ¾½¹·«¦ ˜ — – “ Š ˆ ~ } s q p n X V L ž  … ƒ  v l ¾~ ®Â"±",¢9?‚6;{6:Ždfå³¶ðàáÂ$¿'¿)©OWͱ³ÞÐÑÅ-Å/«*Ç"4À"3Øs}ôÖÙñÕØðÖÙúðñûòóÇ%8Ç&:È(=È*@È+AÃ*?É5H½=MÀM\ùñòÄ+BÉ.FÉ/GÉ0IË2MË3OÈ2NÇ%9J.F¯p«±r®N3O²v´³x·µ{»@-EL6RO8V08G3O1:bGm3=4>7 C5AgOx?2ME7TmW†|d™}gŽu²š„Á^Vƒøððèààöððýýýûûûúúúôôôÿÿÿ!ù,Ï; H° AJýéÃg’ÁN’Þ´YcŒ—* FrÃM™/]¨HI‚h $5iÎŒ³å “%B€øéTÉ ™0P8ÁÒ$À“2,Êã…‹•,Z(µ¤D‡ŒðL‰¢É¥¨@¡€¢;GŒÉák$<Hd‡ >`ê'‘!\2ƒ†?v°hp‰‡  uÚ@‹ .¨Xñà = q˜0 )f$Tp„"F¼ˆQƒ´ÁGrểCÇÁ€;uima-as-2.3.1/issuesFixed/images/icon_info_sml.gif000066400000000000000000000011361160020716200221120ustar00rootroot00000000000000GIF89aæÿÿÿýýþùúüøùûÚàërƒžÑÙæÕÜè×ÞéÖÝè 'SG]}]y¢Vp–OgŠLc…J`EYxCWtI^~FZyeªh„¬gƒ«j…­l‡®mˆ¯pаXl‹t²v´dy˜w´|”·~•¸w­€—¹uŠ©nž„š»ƒ™º…›¼zŽ¬ŠŸ¿w‰¤‹ ¿¡À¤Â…—²™¬Ç˜«Æ‚’©’¢º†•«¡²Ë¦¶Î©¹Ð­¼Ò¬»ÑŸ¬À±¿Ô°¾ÓµÂ֏Ũ¼ÈÚÁÌÝÃÎÞÂÍݲ¼ËÉÓâÆÐßËÔâÍÖäÌÕãÓÛçÒÚæÈÏÙéíóãçíõ÷úôöùóõø@TpAUqyŽ«}ަ•©Åž°É§´Å¹ÆØÀÉÕàæîßåíáçïåêñäéððó÷ïòöÝäíÜãìÛâëçìòæëñìðõëïôêîóØßçâèïñô÷öøúûüýúûüþþþÿÿÿ!ùr,»€r‚ƒ„…‚`fg`l\d LGƒ^qqopnQmbj.‡™MObhNg r\oP6 [igŒ%‚d›mE4k_^eL‚ PRah YcHB‚ËjfV ‚FØ`\- 5Z=97‚D`] I' 1ì30‚@KICA@,¨"‹éøcÇ $X ñA‚ ?tàÀrå…Š!8h 2è† @ Pa†b ;uima-as-2.3.1/issuesFixed/images/icon_success_sml.gif000066400000000000000000000017361160020716200226350ustar00rootroot00000000000000GIF89a÷ÿÿÿ„™º¦¶Î§·Î¼ÈÚÇÑà¿ÈÕc~¢¡±Çßåíw¬™´¦¸Ë—®¿³Ã©½ËSq‚*/‚¡­%(#8='*!37,/(CH'AF&>B/2*,)FI"!Prkœ¼´¢À¸j•†„¬œtœ‹¢Å²FcOƒ­7G;ÅÖÈÈ£¬Ö©·Û´¸ß²2B.²á¥³â¦·ã«¸ä¬¸ä­ºå¯¼å±Â€¶ã©²à¢²à£œÎˆ¬Þ˜«Ü™©Ù—«Û—]•BÎ…¢Ô‹©Û‘Í„­Õ—]”>¡Ô„çñሻf“Çr¿mˆ¶jÐæÂøûöbœ7Jw*U‡0WŠ2•ÑiÔäÈmª;Ag$r³?o¬=ež8fž8b›7ZŽ2YŠ1S‚.Jt)Qy1‰ËW…½Yu¤Qe‹FcˆE—¹{›½{“h­Î×Çîóê„ÊGv·@uµ?k¥:hž7`’3Jr(ÃE^‘3Q|,S~-Dh%}¼DEi&‹ÎQ²Å¢ÖàÍÏ×ÈãëÜIm&Qx+Ot)Mo(êïåLl&Ig%Gc$õ÷òþþþûûû÷÷÷ÿÿÿ!ù‹,» H° A!,X E aCF5pAÆ *01#†"NT0è‡A˜ ¡ =†Y²&€ NR¤I’1ÅÁbà€JðÃ'À:oŒ8bŠ˜3‡ˆ-ÃeË“‹„у™>Ô|‰Â¥ (ØÌq£Å‹•4häÔ±(Ћm®TÉ"Jž;*d(Å"4l¨p ,Pø°( ;uima-as-2.3.1/issuesFixed/images/icon_warning_sml.gif000066400000000000000000000011001160020716200226130ustar00rootroot00000000000000GIF89aæÿÿÿ¸œ§º¡«b`awr}“ޤ˜ º¡¨¿¬²Æ~ް„’²j| £¯ÇfsŠ„™º§·Î·Ä×ÄÏßËÔ⣴ÌÜãì[M@Kƒ? àk®T£N ”G J$ùwñsïrêpÛi×fÖfÔeÎcÍbÇ_¿[¼Z°T©Q¤OšJ E D E ƒ? i2 çnämÃ]¹X·WµV•H ‰A €= h2 ]-Ëbùzù{ìz&«Z¿i&×iù(Ëj&ùƒ1ùƒ2ú†7Ìm-D2%Ìp4úŠBúŽIØ|DÌu@ú”Yú˜aæ\Ì}R׈[¦v[úmI:2̓`û¡vû¤û§ƒÙ‘s=.()ûª‹+*û­‘ç ….!Ó—<,&é¤5&!:*%²‡y*Švp묜*,-¨‡‚š~zÇŸžÿÿÿ!ùv,€v‚ƒ„…† †…oae‹ƒd][s’v iT ‹u^PW†\Z¥MI…gXU¥GAD„SRQ¥?4ƒVONK¥)#C‚nJHFE0=7'6*v B@%¥+8, l !5"9¥.:/Lt"$&(-3:øc‡ Yìø‚f3càÄ‘#¦ ;;uima-as-2.3.1/issuesFixed/images/logos/000077500000000000000000000000001160020716200177275ustar00rootroot00000000000000uima-as-2.3.1/issuesFixed/images/logos/build-by-maven-black.png000066400000000000000000000043661160020716200243330ustar00rootroot00000000000000‰PNG  IHDRZ#ž/ pHYs.#.#x¥?vtIME×úļ•IDATXÃíXiLTY>ï½* ( ±J¶BZ@–€Š›ˆ†%‚‡?hÆ?"jb‚Qd~(„d\ÆA $ &Œ2™¸1 ›€ »‘"R`UJ-¼Zîü8Ìm„žîÎ4É´NêÇ©sÏ}ïÞï~ïœsÀš¬É𬒤¦¦ÖÔÔÔÔÔTWWzxx¬ôQ(‡bY¶¤¤ÄÕÕU&“‰Å⥣¹¹¹ßÄfÙ_ôغu+!¤ªªª¶¶6<<¼¼¼|¥ÏÜÜÜøø8˲™™™NNNçÎKMM¥£~~~1118`rrR©T¶¶¶ÖÔÔ@II‰D"€ôôô¤¤$www???tÞ¶m[JJJ^^µÀúõë¯_¿^__Ÿ””ÄqÜ… eáááÇ …çÏŸ_J¨ß5‰‰‰gÏž---­¨¨(++€ýû÷;;;@TTTxxx@@Àž={Ðùýû÷ÝÝݳ³³K¿¸ºººòòòêêjOOOooï´´4ÈÍÍ%„0 # ¿vhµÚáááööö“'Or÷3Î&“É`0LOOó>þÕ«W‹¥¹¹ùÒ¥K·oߎãöíÛçääô °czz:;;;>>¦¦¦<¸°°PQQQUU¥ÑhZ[[ggg ÃÄÄ!dppÐn·777·µµ€Á`P*•>ôðð¸|ùòÔÔܽ{÷ðáà  :;;—~_ߘ–ý¯äZ9Äqœ@ð#úiii•••ke@~~~___ppðïma̯ôsvvvssC]¯×B‚‚‚<==­Vëàààüü<ùøø2 £R©&''†Y‡Ãáp|«çyæÌÜ€ÕjÝ»wï³gÏìv;!„2<<ìçç'•J¯^½j2™Ðh2™²²²þ°ônllÄ}Z­V£ÑH¾–G-3~;ðue·H¹/A„”“:3Ëø‚‚ù{‘º CíK7lسk×®àààeC,Ë¢?G®®®[¶l‰ˆˆXÍ´%ÆÇÇé>5MSSÓ‡–nÞh4>}ú´»»›ZL&“H$Â'ämsžøóúù<©-_fË—Yóe†¤ÿø^âïÆâz{{µZ­V«MNN¦ï½xñ"ëëë¦ÈÈÈÐó°ÙlCCCééétJQQN¹víÚéÓ§ÕjµÃá°ÛíoÞ¼ùî»ïV???‡Ã+¸qã^.ÂÂÂèÎ{{{7n܈)“ÒD§ÓÑüÒô½X8*CthnnÆYGŽAKPPÐüü~ü6›Íf³¡q``€Ë·ZûÁ~ñ­Ö‰þ¦õ¼¡«z»X¤†x,Öû£££¨ÈårTŠ‹‹÷ÊÊʾ¾¾ºº:±X<33£P(¶o߈e‹H$ÊÎÎÆr122§÷ôô;vìèÑ£´hÆ[…"=..³Ùüöí[Ô#""¨CWW½¹Ò‹,5Àé—&r1»}ƒ@.f‹à¾7Ø…B‘““ƒE`II œ:uÊÝÝjkkœœ°c€F ‘Éd Óéñ0ÒÓÓ322@¥R­2£££z½uÚ „tww£Fó1…Ãß=©pÉ ròwc™¯3{‡Æ¶–eKKK1øÎÍ͉D"Ú@)(((((X¶BäæÎ;‘Å”˜¾¾¾¨tvv® ÃÄÆÆRÒ×PŒT*ÕÌÌÌ2#…#̃{šå.³Ð3ck›²M|¶ĸø¸² üccc‡ƒeY¹\¾{÷n<Ï—/_ÖÕÕ€D"Á]Y,–'OžB–-òñãÇþU*•”­´Ø£Æß$¡¡¡4åååÑ\£R©ÐØÐÐ@oݺ…F­V‹ukŸFÍ¿'‰9`ƒ3cøAŠaUâÄÐuùò…¢V«ÛÚÚ!<ÏÓíyyya™c4×­[·l…Ø+á8n``ßN/– 42 ³ ¡tåcõéïᅩ„ÇEGG£Ž—e Æk‘€½Ÿìv, ‰… ¼ÓÚ¾ð„¶±]äë뛀1‚ž§^¯Ÿ˜˜À:¢²²™Â²lllìµk×JKKÀÓÓsóæÍØCèééÁ‰;vì ÔXɩ߇^¯Y™k(F2™ D„€~aq‰®ÿÚï>œëñ×Ý‹M@ú¥, 0;;[TTDÿò<_VV†ûÉÉÉQ«ÕƒÁb±tuuåååõ÷÷c,Ãp344DåW{{ûêô; Ïó<Ï¿{÷îóçÏhŒŽŽFãüüüëׯi——Îó  VD„Oj© ´½÷ìG>»’ø|aÒ?æÎ™3÷ÎïÌ™™sJ!„`&‰^€`Ž/ƒãùóç&)--­»»{¶ŽÑhÌÈÈ€üüüW¯^1 óîÝ;2j0²²²~!pô÷÷wtt>|øÐ¡C"‘h÷îݳuø|~`` |8::ZRR‚•%É–-[ÂÃÃW¬XA,hµÚÀÀÀœœœÜÜÜššš¦‹ŠŠ ªªJ¯×ÛÙÙY­Ö¯^ææ ‡£££R©ô÷÷ß°aÃ¥K—ŒFãg”íìì\]]¥R©D"!ÂÕ«WÇÇÇûùù%&&VWWïÚµëîÝ»¡[·n%$$À±cÇ”Jå×…Ã~Žzr¹<66óuuuµµµ€slll.„B!fx<EQnnnµµµ­­­*•êËØ€€‰DÒÙÙi³Ù***fëS5>>>]ÒÔÔÔÝÝm±X***Ö­[ )))ÑÑÑ)FóöíÛo‰DÂ0L\\\\\ÜÙ³góóó ERRRaaáúõë—.]êééÉãñüýýÀÇÇG,‡„„ÔÔÔTVV’º£V«=„áØ¹sg{{û¾}û°Î•+WH2þj„¾€l6›Ífû±Q–e9Ž›!™˜˜ }}}aaa3t¾.Á×zqUUU``à½{÷Ðω¨/©mcccÃÃÃ|>ßÅÅ…¢(,´Z­ƒ¢(™Lfoÿ£©šã8Žã>£ðsß,¥¥¥A“ÔÖÖ–žžîææ†óÂÞ½{ÇÇÇ-ËåË—hš¦i:44´«« }Sô?À‘œœLªÆì!55uãÆ$F0ÅÆÆÎ2á 3{l–/ùnƒ&“é'S˲ ÃÌ1CÍŽãBCC§7Z …ÂÁÁaFquww—J¥Dâáá1e¡ö{6w‡íO+lô¶ð´¥úÚþº«.@¬ !ôæÍ›èèh•Jc6›ÉKU*•J¥*..ÆB­V»gϹ\.‹%‰R©ÌÌÌ$z||\­V«Tªèè覦¦'Nxzz:99)•ÊŠŠŠyƒÃd2‘3&&w†„ƒR©Ôh4V«upp âëë;U†þ¼ÎvT6ûÇÕN·oooßÝݧ”——cû^^^&“ !tîÜ9‡¡wtt$¸9rOimm¥ihš–ÉdÓWËÅÅeddd~ਫ«#vËË˱°§§ÇÎÎ O:E–çؾ}ûdp³÷qÿ¾Ä½~‚Þ¾â^ü‡ýËz û}2VY¾|9žU__×9(({^RR‚º~ý:v5** CVSS#ÀÁÁãUPP@zß­[·ž>}:22’D´N§›8rss?ôm4Ý×ׇ…ÓÏì·o߯B½^OúñÌÌÌ÷± 1îM+×vŸ-øÝ8nŸÅƒjµÏ*++C]¼x?nÞ¼™ã8³ÙìããƒýÔjµ}“„¡'®8pÏ:sæ 6‹Ïø”`4?ïæ\ë\}}=f¼¼¼/^Lún’5BBB0ÿôéSÒž!{¹šBÔúOêÖúQÆñú fHtôõõ™L&|]$ ÏŸ?OQTcc#îY­Vë”ÙIâñx2™Œã8Ÿñ€¡¡!²s§çµÿÿDzlcc#æW­ZEš…ÇcÆÓÓ“`D€ãóù+W®Ôó„ûûoad( ܃)_ƒØý+l°ãQ+±¾ŸŸfôz}^^^OO¤¤¤à*†ïVÀÝÝGH¡PH¥Òþþþ®®.Œ¬¡¡3áááós¢5/^¼À<©/V«µ¹¹y†p:ÞÞÞ#ôS02”ú;z〢ÑëfTõ7€_yƒÄuFt444`# …"--¼3QQQ7nܘÝ:@ss3Ìàà`±XŒG=z4w8æt„klldYv†çƒƒƒ¯_¿þiŒ&FQÿ³©}AÑ`³ úb@(ï©°÷ññÁqWUUe4)ŠÊÎÎ&åŒÜ$•––a·M&ÓÍ›7###ñõ-¹|#ž›Íæ––ÌGDDÌOthµZ̈D"òYÓ1Z³f fzzzôzýGpØóAà£Fà ÷Snè0†)¦àX¶l™H$b/µZ­Þ±cˆˆØ´iSee¥ÅbÙ¿ÿÁƒE"Ñèè(BhÉ’% …â“pèt:|i “ÉÈfüÒèÐétb±X,“lôäÉ,tvvÆÂ––¡Pˆå0²ãÑ[¿¾`ì=Ò?£"~2w°€½¼C§§C???@ œ³³³qY%e²¸¸8)) ·,ËŽŒŒP%—Ë?Ž¡££C …BGCCŸÏk×®Ñ1’æt„{ÿþ½ÅbÁÙÑÉÉ GFFpÄÒ4íââBu£££¤í™òçÝÔ÷x"Êc%ˆóÞ,à´¦}¥Á`˜˜˜Àиºº~òc C{{»Á`îîî¾¾¾¸®s700€Ëœ\.ÇÎ3 Ã0 ˆÅâE‹Í ;-À±@ÿ§wýí¿ƒIEND®B`‚uima-as-2.3.1/issuesFixed/images/logos/maven-feather.png000066400000000000000000000064021160020716200231610ustar00rootroot00000000000000‰PNG  IHDRZ#ž/ pHYs.#.#x¥?vgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF xIDATxÚb`H €øÿÿÿ£ FF€blnÚ³gÏ÷ïß!ìß¿?xüä8û÷ïߟ?´¶ €XˆQtãÆ®®.[LL,##CAAMÍû÷ï'Ož\WW7eÊooo g„„„ ²oß¾1cFuu5A»øøøBCCýýý£££&ì=q†ñߟß7¿j›%ôó7£™»¾º€¾§²<· Õƒ €ˆJÏŸ?¿yófZZZJJ ''gpp0¦666mmm cß¾}oÞ¼Ù°aCoo/\öÛ·oÀh'Æ.33³ ­366^½zõ›W¯ž<{sbá‘['>>¿ðú׌}ßÒ'|vJzdt9&çî’Ÿ^=§bp±™E@@ÀÂÂÂÊÊ*;;ûÉ“'@‘Ù³g_¿~ȸzõêÂ… 1y÷î]ˆâ>½´uëÖcÇŽÁMøóçO}}½¯¯ïâÅ‹¥Õ¤I“._¾ ÿüùsUUÕß¿ÉçÖ­[@`Ê&F ™Ë–-›ÒѼ}ãªÝOžïgU:̪¾•Mú›øÍŸ"oo3².?ÚÕþÌ)ôJzÖU ßݽýÿÿ? ƒ €XˆTwçÎÖÖV £8P^^2”••555¡søða`d–••¥xyy½¼¼€Ztuuá&œ>}:77˜¢¢¢ää䘘˜€îééÙµk׳gϘ™™ /Ô²&&&ÁÑ «7lxóàÉž›[ÿ1òK3+J2‰>eggaýÿAýï3ÁŸœ|×~‹Þ9ùgñÑÇš3«©ý7Va××ááã–•eçæáæ$)8ˆØààááQWW:èî9sæ$&&âQ T#** Ì2Àp XXÔ ÊÔÔT`vww¯[·...( ,¸b`¨\¸|åç¿á1Ñúg]¾±ã*ËŸÓ ïþy|÷?';#?ûFAvVN=–Ï\JýýÌzñŸäõK_÷ß`ý¸ö×ï÷r|ÿy9ÿëè y™0É*°rˆ ÉK±rpã÷&@!!!ö‰'Ž= ¯¡á~ÀÁÁa°²²«4)))`šÌ2ööö˜õ¿ž¶–¢œÜ?†ÿ?ï­ÿs;èày>•Íìò/~ýþø÷Å“ßOÖÿ}ÉÈÀ´•]މ_ŒEÒœé;ëqÖ,² _¾~ù÷å:»ÜïZGÜÙpùàY¡GLºÂL"¼R&¬œŒŒX €"68~þüùâÅ X@= ¥¥Œy`VúdóæÍ@ïaÖá?~ü@9wî܃€¡T_\\ ‰ŒŒ,**rtt„„° QUU&+¨ËXX@V%=ú÷yúµgO}þ{ýãï;v¡ïìo¾ÿþ÷öü¿ï/þ¾½ÿëìq†?ŒŒ‚BŒüŒlߘ$¤™lÙYßþ[÷ÞÀéïÃ{ßEïüÐT8÷ºðÒu/NWÍÿ‚*†üÒpGQÁô9°ÀÖŠX•*))S{zzúòåËXÁXŽ nnnSSÓ &ìܹÓÝÝRïkßœœ`1±³³  æ©S§Bl™?~rr2<8à€]>5ó½¯çûƒ[¥Vï×:rùínŽ_ìŸþ³²³ü÷bz΢øŸUæ1Ãÿwÿ¾?ÿÿëÝ`ûäþ­¿ÿÿÿõ‘‘Møÿ¡Íÿ¿=þ%æËðòòC.‘»¿¬Å?2~øûñÍ3Öoûï=ãc°“SòçÚ@µJ%+¤¤À* l71‚²°~ „ ` L˜‰ »uÿþ}ýòñãÝóßoÿ³ü—ãï½ïØt˜þúýå?#+'3Ã'&.&¶L,Ϲÿ1ü8Ä .Êð‘õß÷Ûÿ9˜þ}øÏ$ðë,»fì.qfIvvF†ÿ~þäÒõŠ™t@ X#}÷îÝ………ÀšÅÃÃT½¿ÿüùöéãßï~ðëùß½çî¾öÿÝŽŸ‹ýá~ø‡…õϯŸ9¿ü}ÃÆñô¿€îï·¹9Y¿þüÍÎÅõó÷/A®2Ìì‘L?M¹þ}aüøƒ]XÂÅÒ!DQp Q`ÛÀÖ'<†õ%° ä ó?.½ÿÀ"ÐñÀTóû÷/†ÿÿ|ÿñíÝ›¿?~þ{ûö˯ÿ‡nþåÿ÷—‡ùïN%A†/Œllßò‰sÈÊ1üøóçý‡?ÊÜl¼¼\\<À4t3@AM$¬]»V€M/`› X.BÊ`kXpþúõkÞ¼yÀR– €íË{÷îý:è€"!8€Å¼Ö¶AÐb Ø6sssC+€u3†1ÿþÿüöÿû§ÿ~QâtHüøñ#0‰áW ,à€õAeà bƒh0¶‘ZÀÊ…‹‹ ­r•••6çá"À–„£‹þNôÿS£û§TñO‰üŸr•?]ÎÿÌþÿ÷PöñãÇÀXm»ºº;8pKm6{0X±bDغ ¶ƒ€õ°ÊFLKK °‘&R`T4 Xµ—””ÈËËkC 2`O08ˆØàƼ‰ t1°Å¬#+ }@.0Ò^¾| ¸ Úíþäc¢‡æ"›,M€Íˆ–7BÌv  €"ÀôÀ†2<Ülˆ`›˜O!Í|`á…[ÀîË—/øƒ €ˆ `Kn.ЕÁGÁkY`×¥2üüü`‰ûÇß™1ÿÎù÷ðÂÿ×÷ÿÝ>ò·Ó eC”Û`]§N‚Ä3°‚øØŠ,]ºâUH:tØ*ŠÓ)$¼€KxÛ×Çǧ¡¡ÁÚÚž¢Ý(üÁ@ÄÇĉá«§OŸB‘ûì[¶l[ðö80£æã?ÿ?¿ý÷øò¿«{þÎŽƒÇ–6ˆ$0‘CtmذÈ9s&„ ¬‰A ÌAÀÄŸÀüò A÷jRRDWcc#ÄXHÒKxÿþ=þà bë9`ŒAÀt+&&owÃK `3¾rå ¼ydxÿ”).ï`xó€áïo”GÁ€§ 'Q ì@CülÝÍ?{ö,d˜ÆÂ0Œ€YjðT iø°' ϹÈåV@,D¶>®°ŒŒà…“'OBÀâ Fð€VÀ Ô÷è¿é _ÞƒAVQÎ[èÿÞ) ~10³2Ê@Ô«©©Á[«“&MæD Ø©Ôb± –Öð€ƒ`¹ôêóçÏU;$tàAvæÌÃÒÒ’ Oˆ¨à¦±Û·oÃG«àÍ­óçÏ£ "‡¢¢"$Œþ¯¯…0!xW2¹002ýxþÿ®~"E^Q´ÔôÄ '+**àÖAÀ‚cÙ²eh-1HRº’0õôô€õDöøñãÄ@5Lî ²Ï5ÈÇ ‡ÑϯÿŸ_Gä `·Øâ8µ‚ìFED² t·k×.`3° ¯Îà#IÀÖàÂ… !Þæ©U«V ËàáeøàÜçÀçÒ¥K¶••AŸQ©XtAœœœpg!‡‘¹¹9„LáÀ¤Ž,l ì< _߃æs¥´þ¿ºÃðù-4€”Á!##4Ød‚D5°dõ÷÷‡Ë=ì »ÈÀ¶oBB°ï TüõëW bqqq`:ÂÀòõõë×@°dgF< €ˆJ@C¹Á˜á¥Ñ…  ‚‚‚‚@qˆ 0*€…DF̬L>• lœàNΧÿÏ®3ZÅ3Ë2°°ƒ¢rqt1;Í& Hµ ¯&-±ÔÔTHsÀF0Ûcyyy„póæM ^ àÁÌwÀ" (hkkKL¿ €ˆêÂ}úô 'ÒØÂƒ]I±@GÃ'€:`ŒÁ›=ÿ¼{üÿé`Tprò3|~É, |â H®¶»íKHÐ`|ÀÕ\»v H= ,Võ¤^V+*HA<ÿ € `ôðóóœv ÑY8”à ¦ÑP@4ŠP@€„Z¤':ævrIEND®B`‚uima-as-2.3.1/issuesFixed/images/newwindow.png000066400000000000000000000003341160020716200213330ustar00rootroot00000000000000‰PNG  IHDR Óº&gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe< PLTEuuu™ÿÿÿÿÿÿ€8ÉÙtRNSÿÿÿ@*©ôFIDATxÚb`fff„f€b±™@€‘ €€Æ „8@!³™ @`6Ô€±L€Ø& ±´Â^IEND®B`‚uima-as-2.3.1/issuesFixed/jira-report.html000066400000000000000000000663011160020716200204710ustar00rootroot00000000000000 JIRA Report - JIRA Report

JIRA Report

Type Key Status Summary
Bug UIMA-1298 Closed A shared remote CM hangs when one of its clients runs out of memory
Bug UIMA-1680 Closed Async Scaleout Monitor has many issues
Bug UIMA-1728 Closed UIMA AS Service logs falsely Stopping Collocated Delegate Cas Multiplier message
Bug UIMA-1734 Closed UIMA-AS Deployment Descriptor doesn't work with Eclipse 3.4.2
Bug UIMA-1742 Closed UIMA AS Aggregate not exposing number of consumer threads on its delegate's reply queues
Bug UIMA-1743 Closed UIMA AS aggregate may hang when one of its primitive delgates fails during initialization
Bug UIMA-1751 Closed Fix NPE while looking up MessageProducer
Bug UIMA-1754 Closed Incorrect description of getCAS() method in UIMA AS documentation
Bug UIMA-1766 Closed Fix Memory Leak in UIMA AS Service
Bug UIMA-1770 Closed UIMA AS Aggregate Client sends FreeCas requests to a wrong broker
Bug UIMA-1772 Closed Fix UIMA AS Aggregate Log Entry When Executing Flow Controller step
Bug UIMA-1781 Closed UIMA AS Client sends a CPC request too soon
Bug UIMA-1786 Closed UIMA AS aggregate CM hangs due to client not sending Free Cas Request
Bug UIMA-1791 Closed UIMA AS logs Timeouts at INFO level instead of WARNING
Bug UIMA-1792 Closed UIMA AS dumps debug messages to stdout
Bug UIMA-1797 Closed UIMA AS processParentLast logic is not working correctly
Bug UIMA-1800 Closed UIMA AS should block msg submitter thread if a thread pool is empty
Bug UIMA-1801 Closed UIMA AS Aggregate sends STOP message to colocated delegate during shutdown
Bug UIMA-1807 Closed UIMA AS jmx monitor throws javax.management.AttributeNotFoundException while collecting stats
Bug UIMA-1831 Closed UIMA AS test deployment descriptors contain absolute paths instead of relative paths
Bug UIMA-1844 Closed add exclude for release.properties to those poms that override the default apache-rat-plugin configuration of excludes
Bug UIMA-1846 Closed Correct issues around building eclipse plugins and update site
Bug UIMA-1847 Closed Eclipse plugins not working with more recent version of maven-bundle-plugin
Bug UIMA-1849 Closed Deployment file in UIMA AS extended tests uses absolute instead of relative path
Bug UIMA-1850 Closed UIMA AS process error handler incorrectly handles a CAS that arrives after a timeout
Bug UIMA-1851 Closed Fix UIMA AS jUnit test to generate files into uimaj-as-activemq/target/temp directory
Bug UIMA-1854 Closed fixup uima-as eclipse plugins for deployeditor and add to eclipse update site
Bug UIMA-1855 Closed Address problems reported by Findbugs in UIMA AS
Bug UIMA-1856 Closed Restore RunRemoteAsyncAE in UIMA AS examples to its original state
Bug UIMA-1872 Closed UIMA AS Primitive Service ResourceInitializationException is Silently Handled
Bug UIMA-1883 Closed UIMA shell scripts (e.g. cvd.sh) do not support space in filenames
Bug UIMA-1902 Closed UIMA AS detection of missing client reply queue is not working leading to client timeouts
Bug UIMA-1915 Closed UIMA AS client code synchronizes same critical region twice
Bug UIMA-1936 Closed UIMA AS code base should log all trace msgs instead dumping to stdout
Bug UIMA-1937 Closed UIMA AS JMX Monitor throws javax.management.AttributeNotFoundException: No such attribute: AvailableInstances
Bug UIMA-1942 Closed Our batch scripts can't handle the default path for 32bit software on Win64 machines as it contains parentheses
Bug UIMA-1944 Closed change build parenting poms to introduce additional parent, add top level build point for multi-module projects
Bug UIMA-1955 Closed remove unused dependency on missing activemq artifact
Bug UIMA-1960 Closed enable uima-as to check for proper version of base UIMA
Bug UIMA-1971 Closed AggregateAnalysisEngineController should disable Delta CAS serialization if a remote delegate replies with a full CAS
Bug UIMA-1973 Closed Add getTaskExecutor() method to UimaDefaultMessageListenerContainer
Bug UIMA-1974 Closed UIMA AS assembly script creates bogus folders in bin directory
Bug UIMA-1975 Closed UIMA AS extended tests import mx4j classes for no reason
Bug UIMA-1976 Closed Deprecate BrokerDeployer in UIMA AS
Bug UIMA-1979 Closed UIMA AS allows concurrent access to JMS Session instance
Bug UIMA-1980 Closed UIMA AS extended test testTerminateOnFlowControllerExceptionOnDisable() fails
Bug UIMA-1981 Closed UIMA AS releases parent CAS prematurely
Bug UIMA-1986 Closed Fix Synchronization on Long could deadlock Reported by Findbugs
Bug UIMA-1994 Closed Fix NPE in UIMA AS Client When Running with Log Level > INFO
Bug UIMA-1995 Closed AMQ 5.4.1 Broker from UIMA AS 2.3.1 not starting on Linux
Bug UIMA-1996 Closed Remove deprecated destroyApplicationContextOnStop property from activemq-nojournal.xml
Bug UIMA-1997 Closed UIMA AS build does not generate distribution for linux (*.tar.gz)
Bug UIMA-2001 Closed Fix UIMA AS deployment desciptor from extended tests
Bug UIMA-2005 Closed Binary assembly script for UIMA AS doesnt copy AMQ README.txt
Bug UIMA-2007 Closed uima-as-osgi plugin is missing most of its content
Bug UIMA-2010 Closed Rollback UIMA AS poms to 2.3.1 SNAPSHOT
Bug UIMA-2027 Closed UIMA AS binary assembly script doesnt include uima as docs in a distribution
Bug UIMA-2030 Closed Fix invalid paths in various uima as scripts
Bug UIMA-2031 Closed FileSystemCollectionReader.xml in UIMA AS examples doesnt specify Language parameter
Bug UIMA-2033 Closed some parent poms putting apache snapshot repo for plugins under wrong xml element
Bug UIMA-2038 Closed UIMA AS process does not terminate reliably
Bug UIMA-2044 Closed UIMA AS Spring Container throws ava.lang.IllegalArgumentException: Display name must not be empty
Bug UIMA-2058 Closed UIMA AS example program RunRemoteAsyncAE calls System.exit()
Bug UIMA-2063 Closed UIMA AS Build Requires spring-aop-3.0.3.RELEASE.jar
Bug UIMA-2064 Closed UIMA AS client doesnt always throw ResourceProcessException
Bug UIMA-2069 Closed Remove hardcoded port numbers from UIMA AS tests
Bug UIMA-2072 Closed Fix UIMA AS log message
Bug UIMA-2075 Closed UIMA AS deploy script Deploy_NoOpAnotatorWithCpCDelay contains wrong AE descriptor name
Bug UIMA-2076 Closed Modify maven-failsafe-plugin in uimaj-as-activemq pom.xml to use UTF-8 encoding
Bug UIMA-2080 Closed UIMA AS serice ShutdownHook dumps message to stderr
Bug UIMA-2081 Closed UIMA-AS extended test intermittent failure - message InvalidDestinationException: Cannot publish to a deleted Destination: temp-queue ...
Bug UIMA-2083 Closed UIMA AS service always uses binary serialization
Bug UIMA-2085 Closed UIMA AS source distribution contains plain vanilla versions of LICENCE and NOTICE files
Bug UIMA-2087 Closed UIMA AS assembly script includes an incorrect version of .classpath
Bug UIMA-2088 Closed UIMA AS .classpath for examples contains duplicate jar entries
Bug UIMA-2090 Closed UIMA AS eclipse launch scripts not setup correctly
Bug UIMA-2091 Closed UIMA AS assembly script should copy project file from base uima examples
Improvement UIMA-1542 Closed dd2spring error messages specifying descriptor Keys should include parents
Improvement UIMA-1667 Closed UIMA AS should also log the ActiveMQ version on startup
Improvement UIMA-1779 Closed UimaAsynchronousEngine should have javadoc for constants
Improvement UIMA-1798 Closed Add exclusion of uima-cpe in uimaj-as-activemq pom
Improvement UIMA-1799 Closed UIMA AS should provide a way to increase prefetch size on a reply queue
Improvement UIMA-1865 Closed lock down transitive dependency version for Eclipse components
Improvement UIMA-1868 Closed cleanup distribution assembly
Improvement UIMA-1869 Closed Remove KEYS files from source and bin distributions
Improvement UIMA-1876 Closed Upgrade UIMA AS to a new version of ActiveMQ
Improvement UIMA-1885 Closed Allow placeholders for endpoint names in deployment descriptors
Improvement UIMA-1935 Closed update eclipse feature projects for 2.3.1
Improvement UIMA-1952 Closed Change UIMA-AS binary build to include base UIMA
Improvement UIMA-1978 Closed Copy runUimaClass.* scripts from uimaj to uima-as
Improvement UIMA-1999 Closed Modify UIMA AS poms to move RAT plugins to a new pluginManagement section
Improvement UIMA-2004 Closed Cleanup UIMA AS binary assembly
Improvement UIMA-2024 Closed Add to uima-as project a new file containing AMQ components excluded from UIMA AS release
Improvement UIMA-2025 Closed Merge uima-as and uima-as-distr projects
Improvement UIMA-2029 Closed Modify RunRemoteAsyncAE status message on service startup
Improvement UIMA-2048 Closed UIMA AS should identify a delegate service in a Timeout Exception
Improvement UIMA-2059 Closed Modify UIMA AS assembly script to include version in the base directory name
Improvement UIMA-2065 Closed UIMA AS client needs ShutdownHook to close broker connection
Improvement UIMA-2071 Closed Change the specification of sorting keys to correspond to the sequence needed by the latest Jira upgrade
Improvement UIMA-2079 Closed UIMA-AS Service logs a pid on startup, it should be separated with a space
Improvement UIMA-2084 Closed Extend UIMA AS service JMX API to dump service state
New Feature UIMA-1794 Closed Add error handling option for UIMA AS services accessed by core UIMA
New Feature UIMA-1818 Closed Provide simple mechanism to capture all CASes input to specified delegate
New Feature UIMA-1938 Closed Modify UIMA AS Primitive Service to optionally dump JVM stack if process() method takes too long
Task UIMA-1843 Closed update poms to refer to released version of parent-pom-eclipse-plugins-ibm-notice
Task UIMA-1988 Closed Update uima-website KEYS file with a new Public Key for JC
Task UIMA-1989 Closed Update UIMA AS README for the new 2.3.1 release
Task UIMA-1998 Closed Update LICENSE and NOTICE files for UIMA AS
Task UIMA-2000 Closed Remove Docbook Processing from uima-as-parent pom.xml
Task UIMA-2009 Closed Modify Eclipse update site scripts
Task UIMA-2055 Closed Refactor UIMA AS JmsOutputChannel code

uima-as-2.3.1/uima-as-docbooks/000077500000000000000000000000001160020716200162015ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/pom.xml000066400000000000000000000051141160020716200175170ustar00rootroot00000000000000 4.0.0 org.apache.uima uima-as-parent 2.3.1 ../uima-as-parent/pom.xml uima-as-docbooks pom 2.3.1 UIMA-AS: ${project.artifactId} ${uimaWebsiteUrl} scm:svn:http://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/uima-as-docbooks scm:svn:https://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/uima-as-docbooks http://svn.apache.org/viewvc/uima/uima-as/tags/uima-as-2.3.1-rc7/uima-as-docbooks ${project.artifactId} uima_async_scaleout uima-as-2.3.1/uima-as-docbooks/src/000077500000000000000000000000001160020716200167705ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/000077500000000000000000000000001160020716200204105ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/async.camel.driver.xml000066400000000000000000000234721160020716200246310ustar00rootroot00000000000000 %uimaents; ]> Asynchronous Scaleout Camel Driver
Overview Apache Camel is an integration framework based on Enterprise Integration Patterns which uses routes for rule-based message routing and mediation. The camel project has a large number of components which provide access to a wide variety of technologies and are the building blocks of the routes. The Asynchronous Scaleout Camel Driver is a component to integrate UIMA AS into Camel.
How does it work? The Asynchronous Scaleout Camel Driver sends the camel message body (without headers) to a specified UIMA AS processing pipeline. Accessing the analysis results which are written into the CAS is not possible from a camel route. There are basically two usage scenarios. The Camel Driver can be used to drive the processing of a UIMA AS cluster in which each server instance runs a cas multiplier to fetch the actual document from a database. In this scenario the camel route only sends an ID of the document to the cas multiplier which does the actual fetching of the document. In the second usage scenario the Camel Driver is used to send a document in a one way fashion to a UIMA AS processing pipeline which then takes care of processing it. In case an error occurs inside the processing pipeline the exception is forwarded to camel and set on the message as response. Error handling is described in the Error handling in Camel documentation. The camel driver expects a string message body; if it is not of the type string it might be automatically converted by camel type converters. The string message body is set as the CAS's document text. An Analysis Engine calls CAS CAS.getDocumentText() to retrieve the string.
URI Format The Asynchronous Scaleout Camel Driver is configured with a configuration string. The configuration string must contain the broker location and name of the JMS queue used to communicate with UIMA AS. It has the following format uimadriver:brokerURL?queue=nameofqueue&CasPoolSize=n&Timeout=t which could for example be specified as uimadriver:tcp://localhost:61616?queue=TextAnalysisQueue. The CasPoolSize parameter is optional but if it is present n must be an integer which is larger than zero, otherwise the UIMA AS default will be used. The Timeout parameter is optional but if present t in milliseconds must zero or larger.
Sample Camel enables a developer to create quickly all kinds of applications out of existing and custom components. The sample demonstrates how UIMA AS is integrated with other technologies. Readers who are new to camel should read the Getting Started chapter in the camel documentation. First a simple sample: A user wants to test a UIMA AS processing pipeline, sending it a set of test documents to process. The plain text test documents are located in a folder "/test-data". A camel route for this defined with Java DSL could look like this: from("file://test-data?noop=true"). to("uimadriver:tcp://localhost:61616?queue=TextAnalysisQueue"); In the route above the file component sends a message for every file to the uimadriver component. The message contains a reference to the file but not the content of the file itself. The uimadriver component expects a message with string body as input. An internal camel type converter will read in the bytes of the file, decode them into characters with the default platform encoding and then create a string object which is passed to the uimadriver component. The uimadriver then puts the string into a CAS and sends it via the UIMA AS Client API to a processing pipeline. Note that results from the returned CAS cannot be retrieved in a camel route. A more complex sample. A web site has an area where people can upload pictures. The pictures must be checked for appropriate content. The pictures are pushed to the site via http, stored in a database and assigned to the human controllers to classify them either as appropriate or non-appropriate. That is achieved with an existing camel route and a servlet which receives the images and sends them to the camel route. from("direct:start"). to("imagewriter"). to("jms:queue:HumanPictureAnalysisQueue"); The message containing the image is received by the direct:start endpoint, the image is written to a database and replaced with a string identifier by the "imagewriter" component, in the last step the camel jms component posts the identifier on a JMS queue to notify the reception of a new image. The notification is received by a client tool which the human controllers use to classify an image. To lessen the workload on the human reviewers, a system should automatically classify the pictures and only assign questionable cases to human reviewers. The automatic classification is done by an UIMA Analysis Engine. The AE can mark an image with one of three classes appropriate, non-appropriate and unknown. In the case of unknown the AE is not confident enough which of the first two classes is correct. To be scalable, the processing pipeline is hosted by UIMA AS and contains three AEs, one to fetch the image from the database, a classification AE and an AE to write the class of the image back to the database. The first AE is typical a cas multiplier and receives a CAS which only contains the string identifier but not the actual image. The cas muliplier uses the identifer to fetch the image from the database and outputs a new CAS with the actual image. The Camel route blocks until the CAS is processed by the following two AEs and depending on the class in the database the picture is assigned to a human controller or not. from("direct:start"). to("imagewriter"). to("uimadriver:tcp://localhost:61616?queue=UimaPictureAnalysisQueue"). to("class-retriever"). // filters messages with class appropriate and non-appropriate filter(header("picture-class").isEqualTo("unkown")). to("jms:queue:HumanPictureAnalysisQueue"); The first part is identical, after the imagewriter the string identifier is send to the UIMA AS processing pipeline which writes the image class back to the database. The class is retrieved with the custom class-retriever component and written to a message header field, only if the class is unknown the image is assigned for human classification. Note: instead of using a CAS multiplier, a more straight-forward approach would use just one CAS, having 2 views: one view would contain the string identifier of the image, and the other view would have the image to be analyzed (or a reference to it in the DB).
Implementation The Asynchronous Scaleout Camel Driver is a typical camel component. The camel documentation Writing Components describes how camel components are written. The source code can be found in the uimaj-as-camel project. The implementation defines an asynchronous producer endpoint, which is implemented in the org.apache.uima.camel.UimaAsProducer class. The UimaAsProducer.process method gets the string body of the message, wraps it in a CAS object and sends it to UIMA AS. Since the producer is asynchronous the camel message is registered with the reference id of the sent CAS in an intermediate map, when the CAS comes back from UIMA AS, the camel message is looked up with the reference id of the CAS and the processing of the camel message is completed. For further details please read the UimaAsProducer implementation code.
uima-as-2.3.1/uima-as-docbooks/src/docbook/async.errorhandling.xml000066400000000000000000001105521160020716200251100ustar00rootroot00000000000000 ]> Error Handling for Asynchronous Scaleout This chapter discusses the high level architecture for Error Handling from the user's point of view.
Basic concepts This chapter describes error configuration for AS components. The AS framework manages a collection of component parts written by users (user code) which can throw exceptions. In addition, the AS framework can run timers when sending commands to user code which can create timeouts. An AS component is either an AS aggregate or an AS primitive. AS aggregates can have multiple levels of aggregation; error configuration is done for each level of aggregation. The rest of this chapter focuses on the error configuration one level at a time (either for one particular level in an aggregate hierarchy, or for an AS primitive). There is a small number of commands which can be sent to an AS component. When a component returns the result, if an error occurs, an error result is returned instead of the normal result. Configuration and support is provided for three classes of errors: Exceptions thrown from code (component or framework) at this level error messages received from delegates. timeouts of commands sent to delegates. The second and third class of errors is only possible for AS aggregates. When errors happen, the framework provides a standard set of configurable actions. See for a summary table of the actions available in different situations.
Associating Errors with incoming commands Components managed by AS may generate errors when they are sent a command. The error is associated with the command that was running to produce the error. There are three incoming message commands supported by the AS framework: getMetadata - sent by the framework when initializing connection to an AS component processCas - sent once for each CAS collectionProcessComplete - sent when an application calls this method Error handling actions are associated with these various commands. Some error handling actions make sense only if there is an associated CAS object, and are therefore only allowed with the processCas command.
Error handling for CASes generated in an Aggregate by CAS Multipliers Error handling - CAS Multipliers CASes that are generated by a CAS Multiplier are called child CASes, and their parent CAS is the CAS that originally came into the CAS Multiplier which caused the child CASes to be created. Each child CAS always has one associated parent CAS. The flow of CASes is constrained to always block returning the parent CAS until all of its children have been generated by the CAS Multiplier. In addition, the framework (currently) blocks the flow of the parent CAS until all of its children have finished all processing, including any processing of the children in outer, containing aggregates (which can even be on other network-connected nodes). (There is some discussion about relaxing this condition, to allow more asynchronicity.) A child CAS may only exist for a part of the flow, and not returned all the way back up to the top. Because of this, errors which occur on a child CAS and are not recovered are reported on both the child CAS, and on its parent. The parent CAS is not processed further, and an error is reported against the parent. The parent CAS may have other outstanding children currently being processed. It is not yet specified what happens (if anything) to these CASes.
Error handling overview When an error happens, it is either "recovered", or not; only errors from delegates of an AS aggregate can be recovered. Recovery may be achieved by retrying the request or by skipping the delegate. Commands normally return results; however if an non-recoverable error occurs, the command returns an error result instead. For AS aggregates, each level in aggregate hierarchy can be configured to try to recover the error. If a particular AS aggregate level does not recover, the error is sent up to the next level of the hierarchy (or to the calling client, if a top level). The error result is updated to reflect the actions the framework takes for this error. Non-recovered errors can optionally have an associated "Terminate" or "Disable" action (see below), triggered by the error when a threshold is reached. "Disable" applies to the delegate that generated the error while "Terminate" applies to the aggregate and any co-located aggregates it is contained within.
Basic error handling chain for AS Aggregates for errors from delegates Basic error handling chain for aggregates
The basic error handling chain starts with an error, and can attempt to recover using retry. If this fails (or is not configured), the error count is incremented and checked against the thresholds for this delegate. If the threshold has been reached the specified action is taken, disabling the delegate or terminating the entire component. If the Terminate error is not taken, recovery by the Continue action can be attempted. If that fails, an error result is returned to the caller. For AS primitives, only the Terminate action is available, and Retry and Continue do not apply.
Basic error handling chain for AS Primitives Basic error handling chain for aggregates
Error results Error results are returned instead of a CAS, if an error occurs and is not recovered. If the application uses the synchronous sendAndReceive() method, an Error Result is passed back to the client API in the form of a Java exception. The particular exception varies, depending on many factors, but will include a complete stack trace beginning with the cause of the error. If the application uses an asynchronous API, the exception is wrapped in a EntityProcessStatus object and delivered via a callback listener registered by the application. See section 4.4 Status Callback Listener for details.
Error Recovery actions When errors occur in delegates, the aggregate containing them can attempt to recover. There are two basic recovery actions: retrying the same command and continuing past (skipping) the failing component. Every command sent to a delegate can have an associated (configurable) timeout. If the timeout occurs before the delegate responds, the framework creates an error representing the timeout. If, subsequently, a response is (finally) received corresponding to the command that had timed-out, this is logged, but the response is discarded and no further action is taken. When errors occur in delegates, retry is attempted (if configured), some number of times. If that fails, error counts are incremented and thresholds examined for Terminate/Disable actions. If not reached, or if the action is Disable, Continue is attempted (if configured); if Continue fails, the error is not recovered, and the aggregate returns the error result from the delegate to the aggregate's caller. On Terminate, the error is returned to the caller.
Aggregate Error Actions This section describes in more detail the error actions valid only for AS aggregates.
Retry Retry is an action which re-sends the same command that failed back to the input queue of the delegate. (Note: It may be picked up by a different instance of that delegate, which may have a better chance of succeeding.) The framework will keep a copy of the CAS sent to remote components in order to have it to send again if a retry is required. Retry is not allowed for colocated delegates. The "collectionProcessComplete" command is never retried. Retry is done some number of times, as specified in the deployment descriptor.
Disable Action
Disable action Disable Action
When this action is taken the framework marks the particular delegate causing the error as "disabled" so it will be skipped in subsequent calls. The framework calls the flow controller, telling it to remove the particular delegate from the flow.
Continue Option on Delegate Process CAS Failures For processCas commands, the Continue action causes the framework to give the flow controller object for that CAS the error details, and ask the flow controller if processing can continue. If the flow controller returns "true", the flow controller will be called asking for the next step; if "false", the framework stops processing the CAS, returning an error to the client reply queue, or just returning the CAS to the casPool of the CAS multiplier which created it. For "collectionProcessComplete" commands, Continue means to ignore the error, and continue as if the collectionProcessComplete call had returned normally. This action is not allowed for the getMetadata command.
Thresholds for Terminate and Disable The Terminate and Disable actions are conditioned by testing against a threshold. Thresholds are specified as two numbers - an error count and a window. The threshold is reached if the number of errors occurring within the window size is equal to or greater than "the error count". A value of 0 disables the error threshold so no action can be taken. A window of 0 means no window, i.e. all errors are counted Errors associated with the processCas command are the only ones that are counted in the threshold measurements.
Terminate Action When this action is taken the service represented by this component sends an error reply and then terminates, disconnecting itself as a listener from its input queue, and cleaning itself up (releasing resources, etc.). During cleanup, the component analysis engine's destroy method is called. The termination action applies to the entire aggregate service. Remote delegates are not affected.
Terminate action Terminate Action
If the threshold is not exceeded, the error counts associated with the threshold are incremented. Some errors will always cause a terminate: for instance, framework or flow controller errors cause immediate termination.
Commands and allowed actions All of the allowed actions are optional, and default to not being done, except for getMetadata being sent to a delegate that is remote - this has a default timeout of 1 minute. Here's a table of the allowed actions, by command. In this table, the Retry, Continue, and Disable actions apply to the particular Delegate associated with the error; the Terminate action applies to the entire component. The framework returns an Error Result to the caller for errors that are not recovered. Error actions by command type Command Error actions allowed AS Aggregate AS Primitive getMetadata Retry, Disable, Terminate Terminate processCas Retry, Continue, Disable, Terminate Terminate collection Processing Complete Continue, Disable, Terminate Terminate
The rationale for providing the terminate action for primitive services is that only the service can know that it is no longer capable of continued operation. Consider a scaled component with multiple service instances, where one of them goes "bad" and starts throwing exceptions: the clients of this service have no way of stopping new requests from being delivered to this bad service instance. The teminate action allows the bad service to remove itself from further processing; this could allow life cycle management to restart a new instance.
uima-as-2.3.1/uima-as-docbooks/src/docbook/async.monitoring.and.tuning.xml000066400000000000000000001601001160020716200264750ustar00rootroot00000000000000 ]> Monitoring, Tuning and Debugging UIMA AS deployments can involve many separate parts running on many different machines. Monitoring facilities and tools built into UIMA AS help in collecting information on the performance of these parts. You can use the monitoring information to identify deployment issues, such as bottlenecks, and address these with various approaches that alter the deployment choices; this is what we mean by "tuning the deployment". Monitoring happens in several parts: Each node running a JVM hosting UIMA AS services or clients provides JMX information tracking many items of interest. UIMA AS services include some of these measurements in the information passed back to its client, along with the returned CAS. This allows clients to collect and aggregate measurements over a cluster of remotely-deployed components. Tuning a UIMA AS application is done using several approaches: changing the topology of the scaleout - for instance, allocating more nodes to some parts, less to others adjusting deployment parameters, such as the number of CASes in a CasPool, or the number of threads assigned to do various tasks In addition, tuning can involve changing the actual analytic algorithms to tune them - but that is beyond the scope of this chapter. UIMA AS scale out configurations add multithreaded and out-of-order execution complexities to core UIMA applications. Debugging a UIMA AS application is aided by UIMA's modular architecture and an approach that exercises the code gradually from simpler to more complex configurations. Two useful built-in debug features are: Java errors at any component level are propagated back to the component originating the request, with a full call chain of UIMA AS components, within colocated aggregate components and across remote services which are shared by multiple clients. CASes can be saved before sending to any local or remote delegate and later used to reproduce problems in a simple unit testing environment.
Monitoring
JMX JMX (Java Management Extensions) is a standard Java mechanism that is used to monitor and control Java applications. A standard Java tool provided with most Javas, called jconsole, is a GUI based application that can connect to a JVM and display the information JMX is providing, and also control the application in application-defined specific ways. JMX information is provided by a hierarchy of JMX Beans. More background and information on JMX and the jconsole tool is available on the web.
JMX Information from UIMA AS JMX information is provided by every UIMA AS service or client as it runs. Each item provided is either an instantaneous measurement ( e.g. the number of items in a queue) or an accumulating measurement ( e.g. the number of CASes processed). Accumulating measures can be reset to 0 using standard JMX mechanisms. JMX information is provided on a JVM basis; a JVM can be hosting 0 or more UIMA AS Services and/or clients. A UIMA AS Service is defined as a component that connects to a queue and accepts CASes to process. A UIMA AS Client, in contrast, sends CASes to be processed; it can be a top level client, or a UIMA AS Service having one or more AS Aggregate delegates, to which it is sending CASes to be processed. UIMA AS Services send some of their measurements back to the UIMA AS Clients that sent them CASes; those clients incorporate these measurements into aggregate statistics that they provide. This allows accumulating information among components deployed over many nodes interconnected on a network. Some JMX measurement items are constant, and document various settings, descriptors, names, etc., in use by the (one or more) UIMA AS services and/or clients running on this JVM. Some time measurements are associated with running some process. These, where possible, are cpu times, as measured by the thread or threads running the process, using the ThreadMXBean class. On some Javas, thread-based cpu time may not be supported, however. In that case, wall-clock time is used instead. If the process is multi-threaded, and the cpu has multiple cores, you can get time measurements which exceed the wall clock interval, due to the process consuming cpu time on multiple threads at once. Timing information not associated with running code, such as idle time, is measured as wall-clock time. The following sections describe the JMX Beans implemented by UIMA AS. The Notes in the tables include the following flags: inst/acc/const - instantaneous, accumulating, or constant measurement sent - sent up to the invoking client with returning CAS
UIMA AS Services JMX measures The next 4 tables detail the JMX measures provided by UIMA AS services.
Service information Name Description Units Notes state The state of the service (Running, Initializing, Disabled, Stopping, Failed) string inst input queueName The name of the input queue string const reply queueName The internally generated name of the reply queue string const (but could change due to reconnection recovery) broker URL The URL of the JMS queue broker string const deployment descriptor The path to the deployment descriptor for this service string const is CAS Multiplier is this Service a CAS Multiplier boolean const is top level is this Service a top level service, meaning that it connects to an input queue on a queue broker boolean const service key The key name used in the associated Analysis Engine aggregate that specifies this as a delegate string const is Aggregate is this service an AS Aggregate (i.e., has delegates and is marked async="true") boolean const analysisEngine instance count The number of replications of the AS Primitive count const
Service Performance Measurements Name Description Units Notes number of CASes processed The number of CASes processed by a component count - CASes acc cas deserialization time The thread time spent deserializing CASes (receiving, either from client, or replies from delegates) milli seconds acc cas serialization time The thread time spent serializing CASes (sending, either to delegates or back to client) count - CASes acc analysis time The thread time spent in AS Primitive analytics milli seconds acc idle time The wall clock time a service has been idle. Measure starts after a reply is sent until the next request is receives, and excludes serialization/deserialization times. milli seconds acc cas pool wait time The time spent waiting for a CAS to become available in the CAS Pool milli seconds acc shadow cas pool wait time A shadow cas pool is established for services which are Cas Multipliers. This is the time spent waiting for a CAS to become available in the Shadow CAS Pool. milli seconds acc time spent in CM getNext The time spent inside Cas Multipliers, getting another CAS. This time (doesn't include / includes ????) the time spent waiting for a CAS to become available in the CAS Pool waiting for a CAS to become available in the CAS Pool milli seconds acc process thread count The number of threads available to process requests (number of instances of a primitive) count const reply thread count The number of threads available to process replies count const
Co-located Service Queues Co-located services use light-weight, internal (not JMS) queues. These have similar measures as are used with JMS queues, and include these measures for both the input queues and the reply (output) queues: Name Description Units Notes consumer count The number of threads configured to read the queue count const dequeue count The number of CASes that have been read from this queue count acc queue size The number of CASes in the queue count inst
Service Error Measurements Name Description Units Notes process Errors The number of process errors count acc getMetadata Errors The number of getMetadata errors count acc cpc Errors The number of Collection Process Complete (cpc) errors count acc
Application Client information This section describes monitoring information provided by the UIMA AS Client APIs. Any code that uses the , such as the example application client RunRemoteAsyncAE, will have a set of these JMX measures. Currently no additional tooling (beyond standard tools like jconsole) are provided to view these.
Client Measures Name Description Units Notes application Name A user-supplied string identifying the application string const service queue name The name of the service queue this client connects to string const serialization method either xmi or binary. This is the serialization the client will use to send CASes to the service, and also tells the service which serialization to use in sending the CASes back. string const cas pool size This client's cas pool size, limiting the number of simultaneous outstanding requests in process count const total number of CASes processed count of the total number of CASes sent from this client. Note: in the case where the service is a Cas Multiplier, the "child" CASes are not included in this count. count acc total time to process total thread time spent in processing all CASes, including time in remote delegates milli seconds acc average process time total number of CASes processed / total time to process milli seconds inst max process time maximum thread time spent in processing a CAS, including time in remote delegates milli seconds inst total serialization time total thread time spent in serializing, both to delegates (and recursively, to their delegates) and replies back to senders milli seconds acc average serialization time average thread time spent in serializing a CAS, both to delegates (and recursively, to their delegates) and replies back to senders milli seconds inst max serialization time maximum thread time spent in serializing a CAS, both to delegates (and recursively, to their delegates) and replies back to senders milli seconds inst total deserialization time total thread time spent in deserializing, both replies from delegates and CASes from upper level components being sent to lower level ones. milli seconds acc average deserialization time average thread time spent in deserializing, both replies from delegates and CASes from upper level components being sent to lower level ones. milli seconds inst max deserialization time maximum thread time spent in deserializing, both replies from delegates and CASes from upper level components being sent to lower level ones. milli seconds inst total idle time total wall clock time a top-level service thread has been idle since the thread was last used. If there is more than one service thread, this number is the sum. milli seconds acc average idle time average wall clock time all top-level service threads have been idle since they were last used milli seconds inst max idle time maximum wall clock time a top-level service thread has been idle since the thread was last used milli seconds inst total time waiting for reply total wall clock time, measured from the time a CAS is sent to the top-level queue, until that CAS is returned. Any generated CASes from Cas Multipliers are not counted in this measurement. milli seconds acc average time waiting for reply average wall clock time from the time a CAS is sent to the reply is received milli seconds inst max time waiting for reply maximum wall clock time from the time a CAS is sent to the reply is received milli seconds inst total response latency time total wall clock time, measured from the time a CAS is sent to the top-level queue, including the serialization and deserialization times at the client, until that CAS is returned. Any generated CASes from Cas Multipliers are not counted in this measurement. milli seconds acc average response latency time average wall clock time, measured from the time a CAS is sent to the top-level queue, including the serialization and deserialization times at the client, until that CAS is returned. milli seconds inst max response latency time maximum wall clock time, measured from the time a CAS is sent to the top-level queue, including the serialization and deserialization times at the client, until that CAS is returned. milli seconds inst total time waiting for CAS total wall-clock time spent waiting for a free CAS to be available in the client's CAS pool, before sending the CAS to input queue for the top level service. milli seconds acc average time waiting for CAS average wall-clock time spent waiting for a free CAS to be available in the client's CAS pool milli seconds inst max time waiting for CAS maximum wall-clock time spent waiting for a free CAS to be available in the client's CAS pool milli seconds inst total number of CASes requested total number of CASes fetched from the CAS pool count acc
Client Error Measurements Name Description Units Notes getMeta Timeout Error Count number of times a getMeta timed out count acc getMeta Error Count number of times a getMeta request returned with an error count acc process Timeout Error Count number of times a process call timed out count acc process Error Count number of times a process call returned with an error count acc
Logging Sampled JMX information at intervals A common tuning procedure is to run a deployment for a fairly long time with a typical load, and to see what and where hot spots develop. During this process, it is sometimes useful to convert accumulating measurements into averages, perhaps averages per CAS processed. UIMA AS includes a monitor component, org.apache.uima.aae.jmx.monitor.JmxMonitor, to sample JMX measures at specified intervals, compute various averages, and write the results into the UIMA Log (or on the console if no log is configured). The monitor program can be automatically enabled for any deployed service by specifying -D parameters on the JVM command line which launches the service, or, it can be run stand-alone; when run stand-alone, you provide an argument specifying the JVM it is to connect to to get the JMX information. It only connects to one JVM per run; typically, you would connect it to the top-level service. The monitor outputs information for that service and its immediate delegates (local or remote); however, it includes information from the complete recursive chain of delegates when computing its measures. You can get detailed monitoring for sub-services by starting or attaching a monitor to those sub-services. ActiveMQ uses Queue Brokers to manage the JMS queues used by UIMA AS. These brokers have JMX information that is useful in tuning applications. The Monitor program identifies the Queue Broker being used by the service, and connects to it and incorporates information about queue lengths (both the input queue and the reply queue) into its measurements.
Configuring JVM to run the monitor Specify the following JVM System Variable parameters to configure a UIMA AS Client or Service to enable sampling and logging of JMX measures: -Duima.jmx.monitor.interval=1000 - (default is 1000) specifies the sampling interval in milliseconds -Duima.jmx.monitor.formatter=<CustomFormatterClassName> -Dcom.sun.management.jmxremote - enable JMX (only needed for local monitoring, not needed if port is specified) -Dcom.sun.management.jmxremote.port=8009 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false This configures JMX to run on port 8009 with no authentication, and sets the sampling interval to 1 second, and specifies a custom formatter class name. There are two formatter-classes provided with UIMA AS: org.apache.uima.aae.jmx.monitor.BasicUimaJmxMonitorListener - this is a multi-line formatter that formats for human-readable output org.apache.uima.aae.jmx.monitor.SingleLineUimaJmxMonitorListener - this is a formatter that produces one line per interval, suitable for importing into a spreadsheet program. Both of these log to the UIMA log at the INFO log level. You can also write your own formatter. The monitor provides an API to plug in a custom formatter for displaying service metrics. A custom formatter must implement JmxMonitorListener interface. See the method startMonitor in the class UIMA_Service for an example of how custom JMX Listeners are plugged into the monitor.
Running the Monitor program standalone The monitor program can be started separately and pointed to a running UIMA AS Client or Service. To start the program, invoke Java with the following classpath and parameters: ClassPath: %UIMA_HOME%/lib/uimaj-as-activemq.jar %UIMA_HOME%/lib/uimaj-as-core.jar %UIMA_HOME%/lib/uima-core.jar %UIMA_HOME%/apache-activemq-5.4.1/activemq-all-5.4.1.jar Parameters: -Djava.util.logging.config.file=%UIMA_HOME%/config/MonitorLogger.properties - specifies the logging file where the information is written to org.apache.uima.aae.jmx.monitor.JmxMonitor - the class whose main method is invoked uri - the URI of the jmx instance to monitor. interval - the (optional) sampling interval, in milliseconds (default = 1000) When run in this manner, it is not (currently) possible to specify the log message formatting class; the multi-line output format is always used.
Monitoring output The monitoring program combines information from the JMX measures, including the associated Queue Broker, sampling accumulating measurements at the specified sampling interval, and produces the following outputs: Name Description Units> Input queue depth number of CASes waiting to be processed by a service count Reply queue depth number of CASes returned to the client but not yet picked up by the client count CASes processed in interval Number of CASes processed in this sampling interval count Idle time in interval The total time this service has been idle during this interval milli seconds Analysis time in interval The sum of the times spent in analysis by the service during this interval, including analysis time spent in delegates, recursively milli seconds Cas Pool free Cas Count Number of available CASes in the Cas Pool at the end of the interval count In addition to the performance metrics the monitor also provides basic service information: Service name Is service top level Is service remote Is service a cas multiplier Number of processing threads Service uptime (milliseconds)
Tuning
Tuning procedure This section is a cookbook of best practices for tuning a UIMA AS deployment. The summary information provided by the Monitor program is used to guide the tuning. The main metric for detecting an overloaded service is the input queue depth. If it is growing or high, the service is not able to keep up with the load. There are more CASes arriving at the queue than the service can process. Consider increasing number of instances of the services within the JVM (if on a multi-core machine having additional capacity), or deploy additional instances of the service. The main metric for detecting idle service is the idle time. If it is high, it can indicate that the service is not receiving enough CASes. This can be caused by a bottleneck in the service's client; supporting evidence for this can be a high reply queue depth for the client - indicating the client is overloaded. If the idle time is zero, the service may be saturated; adding more instances could relieve a bottleneck. A CasPool free Cas Count of 0 can point to a bottleneck in a service's client; supporting evidence for this can be a high idle time. In this case, the service does not have enough CASes in its pool and is forced to wait. Remember that a CAS is not returned to the Service's CAS pool until the client (which can be a parent asynchronous aggregate) signals it can be. A typical reason is a slow client (look for evidence such as a high reply queue depth). Consider incrementing service's Cas pool and check the client's metrics to determine a reason why it is slow. An asynchronous system must have something that limits the generation of new work to do. CasPools are the mechanism used by UIMA AS to do this. Also, because CASes can have large memory requirements, it is important to limit the number and sizes of CASes in a process.
Tuning Settings This section has a list of the tuning parameters and a description of what they do and how they interact. Name Description number of services on different machines started You can adjust the number of machines assigned to a particular service, even dynamically, by just starting / stopping additional servers that specify the same input queue. number of instances of a service This is similar to the number of services on different machines started, above, but specifies replication of an AS Primitive within one JVM. This is useful for making use of multi-core machines sharing a common memory - large tables that might be part of the analysis algorithm can be shared by all instances. CAS pool size This size limits the number of CASes being processed asynchronously. casMultiplier poolSize This size limits the number of CASes generated by a CAS Multiplier that are being processed asynchronously. Service input queue prefetch If set greater than 0, allows up to "n" CASes to be pulled into one service provider, at a time. This can increase throughput, but can hurt latency, since one service may have several CASes pulled into it, queued up, while another instance of the service could be "starved" and be sitting there idle. Specifying async="true"/"false" on an aggregate The default is false, because there is less overhead (no queues are set up, etc.). Setting this to "true" allows multiple CASes to flow simultaneously in the aggregate. remoteReplyQueueScaleout This parameter indicates the number of threads that will be deployed to read from the remote reply queue. Set to > 1 if deserialization time of replies is a bottleneck.
Debugging One of the strongest UIMA features is the ability to develop and debug components in isolation from each other, and then to incrementally combine components and scaleout complexity. All that is needed to exercise each configuration are one or more appropriate input CASes. It is strongly advised to first test UIMA components in the core UIMA environment with a variety of input CASes. If the entire application will not fit in a single process, deploy remote delegates as UIMA AS primitives with only a single instance (see ), and access them via JMS service descriptors (see ). Run as much input data thru this "single-threaded" configuration as needed to eliminate most "algorithmic" errors and to measure performance against analysis time objectives. Thread safety and analysis ordering issues can then be addressed separately. Thread safety bugs. Components intended to be run multi-threaded should first be deployed as a multiple instance UIMA AS service (again see ), and fed their input CASes with a driver capable of keeping all instances busy at the same time. A good application is the sample driver $UIMA_HOME/bin/runRemoteAsyncAE; use the -p argument to increase the number of outstanding CAS requests sent to the target service. When looking for threading problems try using http://findbugs.sourceforge.net/. In addition to looking for exceptions caused by thread unsafe code, check that the single and multi-threaded analysis results are the same. Analysis ordering bugs. In a core UIMA aggregate CASes are processed by each delegate in input order. This relationship changes for the same aggregate deployed asynchronously if one of the delegates is replicated, as CASes are progressed in parallel and then progress thru the subsequent aggregate flow in a different order then they are received. Similarly with a delegate CasMultiplier in a core UIMA aggregate each child CAS is processed to completion before the next child CAS is started and the parent CAS is processed last. When running asynchronously the parent CAS can arrive at downstream components ahead of its children because the parent is released from a CasMultiplier immediately after the last child is created. For applications which require all children to be processed before their parent, use the processParentLast flag (see ). Timing issues. Invariably with complex analytics, some components will be slower and some artifacts will take longer to process than desired. Making performance improvements relies on identifying components running slower than expected and capturing the slow-running artifacts to study in detail.
Error Reporting and Tracing After the system is scaled out and substantially more data is being processed it is likely that additional errors will occur. Java errors at any component level are propagated back to the component originating the request (unless suppressed by UIMA AS error handling options, see ). The error stack traces the call chain of UIMA AS components, within colocated aggregate components and across remote services which are shared by multiple clients. Some errors can be resolved with this information alone. If process timeouts are not used (see ) an asynchronous system can hang if one analysis step somewhere in the system has hung. Given many CASes in process at the same time it can be useful to create a custom trace of CAS activity by appropriate logging in a custom flow controller. Such logging would have a unique identifier in every CAS, usually a singleton FeatureStructure with a unique String feature. Identifiers for child CASes should include some reference to the CasMultiplier they were created from as well as their parent CAS. The flow controller is also the ideal place to measure timing statistics for components of interest. Global stats can easily be measured using the time between flow steps, and time thresholds used to flag specific CASes causing problems. Again the unique CAS identifier can be quite useful here.
CAS Logging Within a UIMA AS asynchronous aggregate, CASes can be saved before sending to any local or remote delegate and later used to reproduce a problem in a simple unit testing environment. Control of CAS logging is done via Java properties: Property Description UIMA_CASLOG_BASE_DIRECTORY optional; this is the directory under which sub-directories with XmiCas files will be created. If not specified, the process's current directory will be the base. UIMA_CASLOG_COMPONENT_ARRAY This is a space separated list of delegates keys. If a delegate is nested inside a co-located async aggregate, the name would include the key name of the aggregate, e.g. "someAggName/someDelName". The XmiCas files will then be written into $UIMA_CASLOG_BASE_DIRECTORY/someAggName-someDelName/ UIMA_CASLOG_TYPE_NAME optional; this is the name of a FeatureStructure in the CAS containing a unique string to use to name each XmiCas file. If not specified, XmiCas file name will be N.xmi, where N is the time in microseconds since the component was initialized. UIMA_CASLOG_FEATURE_NAME optional unless the TYPE_NAME is specified; this parameter gives the string feature to use. If the string value contains one or more "/" characters only the text after the last "/" will be used. UIMA_CASLOG_VIEW_NAME optional; if the TYPE_NAME and FEATURE_NAME parameters are specified this string selects the CAS view used to access the FeatureStructure with unique string feature.
uima-as-2.3.1/uima-as-docbooks/src/docbook/async.overview.xml000066400000000000000000001754271160020716200241340ustar00rootroot00000000000000 ]> Overview - Asynchronous Scaleout UIMA Asynchronous Scaleout (AS) is a set of capabilities supported in the UIMA Framework for achieving scaleout that is more general than the approaches provided for in the Collection Processing Manager (CPM). AS is a second generation design, replacing the CPM and Vinci Services. The CPM and Vinci are still available and are not being deprecated, but new designs are encouraged to use AS for scalability, and current designs reaching limitations may want to move to AS. AS is integrated with the flow controller architecture, and can be applied to both primitive and aggregate analysis engines.
Terminology Terms used in describing AS capabilities include: AS Asynchronous Scaleout - a name given to the capability described here AS-JMS/AMQ/Spring A variety of AS, based on JMS (Java Messaging Services), Active MQ, an Apache Open Source implementation of JMS, and the Spring framework. This variety is the one described in detail in this document. Queue Queues are the basic mechanism of asynchronous communication. One or more "producers" send messages to a queue, and a queue can have one or more "consumers" that receive messages. Messages in UIMA AS are usually CASes, or references to CASes. Some queues are simple internal structures; others are JMS queues which are identified by a 2 part name: the first part is the Queue Broker; the second part is a Queue Name. AS Component An AS client or service. AS clients send requests to AS service queues and receive back responses on reply queues. AS services can be AS Primitives or AS aggregates (see following). AS Primitive An AS service that is either a Primitive Analysis Engine or an Aggregate AE whose Delegates are not AS-enabled AS Aggregate An AS service that is an Aggregate Analysis Engine where the Delegates are also AS components. AS Client A component sending requests to AS services. An AS client is typically an application using the UIMA AS client API, a JMS Service Client Proxy, or an AS Aggregate. co-located two running pieces of code are co-located if they run in the same JVM and share the same UIMA framework implementation and components. Queue Broker Queue brokers manage one or more named queues. The brokers are identified using a URL, representing where they are on the network. When the queue broker is co-located with the AS client and service, CASes are passed by reference, avoiding serialization / deserialization. Transport Connector AS components connect to queue brokers via transport connectors. UIMA AS will typically use "tcp" connectors. "http" connectors are also available, and are useful for tunneling through firewalls via an existing public web server.
AS versus CPM It is useful to compare and contrast the approaches and capabilities of AS and CPM. AS CPM Putting components together Provides a consistent, single, unified way to put components together, using the base UIMA "aggregate" capability. Two methods of putting components together CPE (Collection Processing Engine) descriptor, which has sections specifying a Collection Reader, and a set of CAS Processors Each CAS Processor can, as well, be an aggregate Kinds of Aggregates An aggregate can be run asynchronously using the AS mechanism, with a queue in front of each delegate, or it can by run synchronously. When run asynchronously, all of the delegates will have queues in front of them, and delegates which are AS Primitives can be individually scaled out (replicated) as needed. Also, multiple CASes can be in-process, at different steps in the pipeline, even without replicating any components. All aggregates are run synchronously. In an aggregate, only one component is running at a time; there is only one CAS at a time being processed within the aggregate. CAS flow Any, including custom user-defined sequence using user-provided flow controller. Parallel flows are supported. Fixed linear flow between CAS processors. A single CAS processor can be an aggregate, and within the aggregate, can have any flow including custom user-defined sequence using user-provided flow controller. Threading Each instance of a component runs in its own thread; the same thread used to call initialize() for a particular instance of a component is used when calling process(). One thread for the collection reader, one for the CAS Consumers, "n" threads for the main pipeline, with no guarantees that the same thread for the initialize() call is used for the process() call. Delegate deployment Co-located or remote. Co-located or remote. Life cycle management Scripts to launch services, launch Queue Brokers. Scripts to launch services, start Vinci Name Service. In addition, CPE "managed" configuration provides for automatic launching of UIMA Vinci services in same machine, in different processes. Error recovery Similar capabilities as the CPM provides for CAS Processors, but at the finer granularity of each AS component. The support includes customizable behavior overrides and extensions via user code. Error detection, thresholding, and recovery options at the granularity of CAS Processors (which are CPM components, not delegates of aggregates), with some customizable callback notifications Firewall interactions Enables deployment of AS services behind a firewall using a public broker. Enables deployment of a public broker through single port, or using HTTP "tunneling". When using Vinci protocol, requires opening a large number of ports for each deployed service. SOAP connected services require one open port. Monitoring and Tuning JMX (Java Management Extensions) are enabled for recording many kinds of statistical information, and can be used to monitor (and control) the operations of AS configured systems. Statistics are provided and summarized from remote delegates, to aid in tuning scaled-out deployments. Some JMX information Collection Reader Supported for backwards compatibility. New programs should use the CAS Multiplier instead, which is more general, or have the application pass in CASes to be processed. The compatibility support wraps Collection Readers as Cas Multipliers. Note: this is supported and implemented in base UIMA. Is always first element in linear CPE sequence chain
Design goals for Asynchronous Scaleout The design goals for AS are: Increased flexibility and options for scaleout (versus CPM) scale out parts independently of other parts, to appropriate degree more options for protocols for remote connections, including some that don't require many ports through firewalls support multiple CASes in process simultaneously within an aggregate pipeline Build upon widely accepted Apache-licensed open source middleware Simplification: Standardize on single approach to aggregate components More uniform Error handling / recovery / monitoring for all AS managed components. No changes to existing annotator code or descriptors. An additional deployment descriptor is used to augment the conventional descriptors.
AS Concepts
User written components and multi-threading Threading AS provides for scaling out of annotators - both aggregates and primitives. Each of these can specify a user-written implementation class. For primitives, this is the annotator class with the process() method that does the work. For aggregates, this can be an (optional) custom flow controller class that computes the flow. The classes for annotators and flow controllers do not need to be "thread-safe" with respect to their instance data - meaning, they do not need to be implemented with synchronization locks for access to their instance data, because each instance will only be called using one thread at a time. Scale out for these classes is done using multiple instances of the class. However, if you have class "static" fields shared by all instances, or other kinds of external data shared by all instances (such as a writable file), you must be aware of the possibility of multiple threads accessing these fields or external resources, running on separate instances of the class, and do any required synchronization for these.
AS Component wrapping Components managed by AS have an associated input queue (this may be internal, or explicit and externalized). They receive work units (CASes) from this queue, and return the updated CASes to an output queue which is specified as part of the message delivering the input work unit (CAS). have a container which wraps the component and provides the following services (see ): A connection to an input queue of CASes to be processed Scale-out within the JVM for components at the bottom level - the AS Primitives. Scaleout creates multiple instances of the annotator(s), and runs each one on its own thread, all drawing work from the same input queue. (For AS Aggregates) connections to input queues of the delegates A "pull" mechanism for the component to pull new CASes (to be processed) from their associated input queue (For AS Aggregates) A separate, built-in internal queue to receive CASes back from delegates. These are passed to the aggregate's flow controller, which then specifies where they go next. A connection to user-specified error handlers. Error conditions are communicated to the flow controller, to enable user / dynamically determined recovery or termination actions.
AS Primitive Wrapper AS Primitive Wrapper
As shown in the next figure, when the component being wrapped is an AS Aggregate, the container will use the aggregate's flow controller (shown as "FC") to determine the flow of the CASes among the delegates. The next figure shows the additional output queue configured for aggregates to receive CASes returning from delegates. The dashed lines show how the queues are associated with the components.
AS Aggregate wrapper AS Aggregate Container wrapping an Aggregate Analysis Engine
The collection of parts and queues is wired together according to a deployment specification, provided by the deployer. This specification is a collection of one or more deployment descriptors.
Parallel Flows A Flow Controller Parallel Step will actually run in parallel, when using remote delegates with xmi serialization (the default) sepecified. For colocated delegates, or for remote delegates running with binary serialization, the parallel steps will be run serially in some arbitrary unspecified order. For the parts running in parallel on remotes, existing Feature Structures may not be modified - only new ones can be added. This is checked for, when the results from the remote parallel steps are merged.
Deployment alternatives Deployment is concerned with the following kinds of parts, and allocating these parts (possibly replicated) to various hosts: Application Drivers. These represent the top level caller of UIMA functionality. Examples include: stand-alone Java applications, such as the example document analyzer tool, a custom Web servlet, etc. AS Services. AS primitive or AS aggregate services deployed on one or more nodes as needed to meet scalability requirements. Queue Brokers. Each Queue Broker manages and provides the storage facility for one or more named queues. Parts can be co-located or not; when they're not, we say they're remote. Remote includes running on the same host, but in a different process space, using a different JVM or other native process. Connections between the non-co-located parts are done using the JMS (Java Messaging Service) protocols, using ActiveMQ from apache.org. For high availability, the Queue Brokers can be, themselves, replicated over many hosts, with fail-over capability provided by the underlying ActiveMQ implementation.
Configuring multiple instances of components Multiple Instances AS components can be replicated; the replicated components can be co-located or distributed across different nodes. The purpose of the replication is to allow multiple work units (CASes) to be processed in parallel, in multiple threads, either in the same host, or using different hosts. The vision is that the deployment is able to replicate just those components which are the bottleneck in overall system thruput. There are two ways replication can be specified. In the deployment descriptor, for an AS Primitive component, set the numberOfInstances attribute of the <scaleout> element to a number bigger than one. Deploy the same service on many nodes, specifying the same input service queue The first way is limited to replicating an AS Primitive. An AS Primitive can be the whole component of the service, or it can be at the bottom of an aggregate hierarchy of co-located parts. Replicating an AS Primitive has the effect of replicating all of its nested components (if it is an aggregate), since no queues are used below its input queue.
Queues Asynchronous operation uses queues to connect components. For co-located components, the UIMA AS framework uses custom very-lightweight queuing mechanisms. For non-co-located components, it uses JMS queues, managed by ActiveMQ Queue Brokers, which can be running on the other nodes in a network. AS Aggregate delegates specified as <analysisEngine> elements (or by default) are co-located, and use custom lightweight queuing. AS Aggregate delegates specified using <remoteAnalysisEngine> are not co-located, and use JMS queuing. For JMS queues, each queue is defined by a queue name and the URL of its Queue Broker. AS services register as queue consumers to obtain CASes to work on (as input) and to send CASes they're finished with (as output) to a reply queue connected to the AS client. The queue implementation for JMS is provided by ActiveMQ queue broker. A single Queue Broker can manage multiple queues. By default UIMA AS configures the Queue Broker to use in-memory queues; the queue is resident on the same JVM as its managing Queue Broker. ActiveMQ offers several failsafe options, including the use of disk-based queues and redundant master/slave broker configurations. The decisions about where to deploy Queue Brokers are deployment decisions, made based on issues such as domain of control, firewalls, CPU / memory resources, etc. Of particular interest for distributed applications is that a UIMA AS service can be deployed behind a firewall but still be publicly available by using a queue broker that is available publicly. When components are co-located, an optimization is done so that CASes are not actually sent as they would be over the network; rather, a reference to the in-memory Java object is passed using the queue. Do not hook up different kinds of services to the same input queue. The framework expects that multiple services all listening to a particular input queue are sharing the workload of processing CASes sent to that queue. The framework does not currently verify that all services on a queue are the same kind, but likely will in a future release.
Deployment Descriptors Each deployment descriptor specifies deployment information for one service, including all of its co-located delegates (if any). A service is an AS component, having one top level input queue, to which CASes are sent for processing. Each deployment descriptor has a reference to an associated Analysis Engine descriptor, which can be an aggregate, or a primitive (including CAS Consumers). AS Components can be co-located (this is the default); the deployment descriptor specifies remote queues (queue-brokers and queue-names) for non-co-located components. All services need to be manually started using an appropriate deployment descriptor (describing the things to be set up on that server). There are several scripts provided including deployAsyncService, that do this. The client API also supports a deploy method for doing this within the same JVM.
Deploying UIMA aggregates UIMA aggregates can either be run asynchronously as AS Aggregates, or synchronously (as AS Primitives). AS Aggregates have an input and a reply queue associated with each delegate, and can process multiple CASes at a time. UIMA aggregates that are run as AS Primitives send CASes synchronously, one a time, to each delegate, without using any queuing mechanism. Each delegate in an AS Aggregate can be specified to be local or remote. Local means co-located using internal queues; remote means all others, including delegates running in a different JVM, or in the same JVM but that can be shared by multiple clients. For each delegate which is remote, the deployment descriptor specifies the delegate's input queue; a corresponding reply queue is also automatically set up. If the delegate is local, internal input and reply queues are automatically created for that delegate.
Current design limitations Limits This section describes limitations of the current support for AS.
Sofa Mapping limits Sofa mapping works for co-located delegates, only. As with Vinci and SOAP, remote delegates needing sofa mapping need to respecify sofa mappings in an aggregate descriptor at the remote node.
Parameter Overriding limits Parameter overrides only work for co-located delegates. As with Vinci and SOAP, remote delegates needing parameter overrides need to respecify the overrides in an aggregate descriptor at the remote node.
Resource Sharing limits Resource Sharing works for co-located delegates, only.
Compatibility with earlier version of remoting and scaleout Compatibility There is a new type of client service descriptor for an AS service, the JMS service descriptor (see ), which can be used along with Vinci and/or SOAP services in base UIMA applications. Conversely, Vinci services cannot be used within a UIMA AS service because they do not comply to the UIMA standard requiring preservation of feature structure IDs. SOAP service calls currently use a binary serialization of the CAS which does preserve IDs and therefore can be called from a UIMA AS service. To use SOAP services within a UIMA AS deployment, wrap them inside another aggregate (which might contain just the one SOAP service descriptor), where the wrapping aggregate is deployed as an AS Primitive.
Application Concepts When UIMA is used, it is called using Application APIs. A typical top-level driver has this basic flow: Read UIMA descriptors and instantiate components Do a Run Do another Run, etc. Stop A "run", in turn, consists of 3 parts: initialize (or reinitialize, if already run) process CASes finish (collectionProcessComplete is called) Initialize is called by the framework when the instance is created. The other methods need to be called by the driver. collectionProcessComplete should be called when the driver determines that it is finished sending input CASes for processing using the process() method. reinitialize() can be called if needed, after changing parameter settings, to get the co-located components to reinitialize.
Application API See and the sample code.
Collection Process Complete An application may want to signal a chain of annotators that are being used in a particular "run" when all CASes for this run have been processed, and any final computation and outputting is to be done; it calls the collectionProcessComplete method to do this. This is frequently done when using stateful components which are accumulating information over multiple documents. It is up to the application to determine when the run is finished and there are no more CASes to process. It then calls this method on the top level analysis engine; the framework propagates this method call to all delegates of this aggregate, and this is repeated recursively for all delegate aggregates. This call is synchronous; the framework will block the thread issuing the call until all processing of CASes within the service has completed and the collectionProcessComplete method has returned (or timed out) from every component it was sent to. Components receive this call in a fixed order taken from the <fixedFlow> sequence information in the descriptors, if that is available, and in an arbitrary order otherwise. If a component is replicated, only one of the instances will receive the collectionProcessComplete call.
Monitoring and Controlling an AS application Monitoring & Controlling JMX (Java Management Extensions) are used for monitoring and controlling an AS application. As of release 2.3.0, extensive monitoring facilities have been implemented; these are described in a separate chapter on . The only controlling facility provided is to stop a service. In addition, a configurable Monitoring program is provided which works with the JMX provided measurements and aggregates and samples these over specified intervals, and creates monitoring entries in the UIMA log, for tuning purposes. You can use this to detect overloaded and/or idle services; see the chapter for details.
JMS Service Descriptor To call a UIMA AS Service from Document Analyzer or any other base UIMA application, use a descriptor such as the following: org.apache.uima.aae.jms_adapter.JmsAnalysisEngineServiceAdapter ]]> The resourceClassName must be set exactly as shown. Set the brokerURL and endpoint parameters to the appropriate values for the UIMA AS Service you want to call. These are the same settings you would use in a deployment descriptor to specify the location of a remote delegate. Note that this is a synchronous adapter, which processes one CAS at a time, so it will not take advantage of the scalability that UIMA AS provides. To process more than one CAS at a time, you must use the Asynchronous UIMA AS Client API . Other parameters may be specified: binary_serialization Set to true to specify binary serialization (faster, but requires that the service have exactly the same type system as the client). ignore_process_errors Set to true to specify that any processing errors should be ignored. In order for this to be reasonable, your calling environment must be able to continue somehow, if the service fails. For more information on the customResourceSpecifier see .
Life cycle Running UIMA AS applications involves deploying (starting) UIMA AS services, perhaps over a wide area network, perhaps on many machines. UIMA AS as a few preliminary tools to help. These include the ability of the to deploy UIMA AS services (limited to deployment within the same JVM), and scripts such as deployAsyncService that start up a UIMA AS Service. deployAsyncService has a facility that launches a keyboard listener after starting, which listens for a "s" or "q" keystroke. The "s" stops the service immediately, and the "q" quiesces the service, letting any in-process work finish before stopping. JMX beans for services include a control option to stop the service.
uima-as-2.3.1/uima-as-docbooks/src/docbook/images/000077500000000000000000000000001160020716200216555ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/000077500000000000000000000000001160020716200257045ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.errorhandling/000077500000000000000000000000001160020716200316565ustar00rootroot00000000000000basic_error_chain.jpg000066400000000000000000001776021160020716200357520ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.errorhandlingÿØÿàJFIF``ÿþLEAD Technologies Inc. V1.01ÿÛ„ÿÄ¢  }!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÀBaÿÚ ?ýü € ( € ( € ( € ( € ( €8ψ¾.“ÀñŸŽbе7ƒ¼1­ø”øHhSSÕ£Ñ4ëF[+9 ndŠÝ¨ì~Xã’B±¹·È6ùgñ¿âÝý¥­ýìü.ì¯m ¼³º·ø¹àÙmîmnbY­î •,ÊÉ º:º’ °#ƒ^[Î0Qm74ã£\¡â¼û/‹qn¤\]šömY­-åbÏü.?ŒßônÒÿáØðÿ!RþÙÁ4ÿð/íü»ù§ÿ€0ÿ…Çñ›þÚ_ü;ÿä*?¶p_Í?ü‡öþ]üÓÿÀÂãøÍÿFí/þÿòÛ8/æŸþÃû.þiÿà ?áqüfÿ£v—ÿǃÿù íœóOÿaý¿—4ÿðð¸þ3Ñ»Kÿ‡cÁÿü…GöÎ ù§ÿ€0þßË¿šøø\¿èÝ¥ÿñàÿþB£ûgüÓÿÀoåßÍ?ü‡ü.?ŒßônÒÿáØðÿ!Qý³‚þiÿà ?·òïæŸþÃþÆoú7iðìx?ÿ¨þÙÁ4ÿðÛùwóOÿaÿ ã7ý´¿øv<ÿÈTl࿚øíü»ù§ÿ€3'Uý¡~#xmô)|IðþÃOÖüYá? E-‡Ä jÚ‡Ûü]â;öFÓKŠšôÅ6¢.%Q,K½­ÄÒÉ0I"kC2Ââ*F•''9^׋KEwwÓc|6oƒÅV .nr½¯–‰·wÓE÷è}a^êP@P@P@P@P@P@P@P@ tI£‘Uãudtu ŽŒ ²²°!”© ‚0A ‘þ@þ¶ñgÁû’Ë/ÂËáÝ\±3|6Õ Ä ¦€±--µ…¯àðÛÌ~ý烵ÚøüÛì1r’V…o}zí%ë}íä|y…ú¶:rŠ´+¯h½^“^¼Þ÷ý¼f¯,ñ€ ( € ( +³¶ÿ„ïãæ…§cÍÐ> è/ã]O¼2üCñݦ­á[û²M¥x5,ZÿÂñ_á¿Ä˜‡—¤øÆ&ø/ãgQ¶4žö{Ï|*Öo_äÚxœxïÌZëâ¿U™|œãíp¾Ñ/zƒæÿ·v—ݤŸøO>ÂûlµŠ¼ðÏwäzMy$­'þÑëäO† üþñVµá[ÏÚ;ã&‰ñVý£®´­ÿ &ð¶‘ð‚ÿö«ŸDÒ[TÒuùu¹o,?gÉZÆÂêîk{'ݪF’Íä9„°IqÓ–',¿1« b#žbh¹×äqXxd¼?V•*RÄ~é(֝Ы:t_4e[žª^Ò›~Íxâ)Ã$Xuƒ…¹dêÔUUí\Ê—´’¯jò^Æ*q›½;AB.ñiz¬¿´ß†~øÂÿ üFñ”Ÿþ(éwÆOüfðö»a¬ßxgÄzÂjz­ÿÇ Xñ]†!“ÂѤ‹ „‘Gouuycou,fÚ÷uN¶/†ÀÕ–‹úŽ3 ÒXn_g‚“­V~ª®ëJ·²u¯Q¸áéIÓÃT…j\´°”ëSÏq¸ŠÎ—öU-YÆ8TYb1Ùv]NTjÒÃÅ'…IÔ¤Ü9éε^w +'O|L°ñ?|1á¿ |²Óî¾)øÄüCÔõ¬Þûá–‘ñXü¤ÿº¶Eeq¨\XÜI©Üøm…²YÞÃó]˧XáY`hå•óXâ+Ô ñÌ.”pÐúÅzØœ+Pjôe%K’|Îl̰5gˆÀS­B•IΗ²«xº’¥„ŪJuSÃU¨©Ò›JxŠ5qx8Ë(Ï>3×m%²ñOÅÍnûâ–¿kr»/4è¼G¿ƒü?z¤—ºÃÍ3Âà1Sq£Në&Ñ÷˜Z+ B•ÿ.â“õÞOæÛgéx<:Âa¨á×üºŠM÷–ò96þg¼ÖçHP@P@P@P@P@P@P@P@PŸüTð4>x¯Á&ïû6ë[Òtm]S|š‰,%‹Tð·ˆ LÜé>#±Òõ(†ï,ƒJQR‹„•ã$Ó^OFL¡ÆP’¼dœZòjÍcðÏÅòxóÀ¾ñ=ÕŸö^«{dö¾#Ñ·o}ź5Ìú/‹¼;+dæ}'ÄÚ~­§9ÉìX‚Aü"‹ÃÖ©Eÿ˹4½7‹ù«?™ùž*„°¸ŠØyoJM/8ïó‹OæwUóÇ„>4øOã'ÄïøÃ ¼[ üCÒ>YEŠþ'ø³Àº¾•sàÍ?Y²¹i¤|ñe½ä-ª†G²ˆäËü»`å x,^»”=¦iˆÇÓ4ª^|³'Àû9ÆR¥É8TËjNñ•E(U‡Ã$ÑÝ]à±Ù•'Zµ*˜°s‚¡NqrþÐÆãã7ˆƒk“8ºqjQ–­YšÚç„>)ü@¹øOªø³Cøáï‡-¼k}aáßx‹Æ¶š‡†­üã/i¨ê_ ü1$zëjÞ'ƒý K1n-íd—íÞk-½mAáp˜úºujÕ‚Àfxj‘•(Sq«‹¢¨ÑpµjŠtÕ¹ªÊ^ÎPÚ©k· E8÷Ožk2Ã`)Ñœ£Z¦;Ësª¤çË«àgsŒ§)Öœa(S‚uGŸ‚’k7?´Îâ›»FðÇÇ›‹ kEÒ®n¿µl4qð£Ãõ3|&´†+kñ}¥^Ï‚k¤14 î®Ï|3‡>IG-ŒÝ,U v? ª*p„«ÕÃVÂÉEµÏ*S ¥Rœ’ƒÒ*RRmvÓÍþ«™pÞc‡¦å,‡ÃN´UJ´s|ß5¹­Jt3 TùÚŒÕEVÐJ0œù'áÆë !øŸqðóNðÿÁMR}zÂûÀÚ¿‰u=SâF¿ká]gÁZ£ªèZׇ4Ûo‡z|f¹¨j7m¾«âç–êhm㾊 G–ÿÐÆâ(âªg’§(fY¦…§E»á°µ³%¯ÖöêÕ+Â*2ÃáiË MÂyÕ«9Ô¥Ë˧*8¶®QJ˜|EL$jW­S«õ,"¬>ÙÂUc*•q0Ukâ=¥8Çês§O þ¶ª`ýOàgu†?þü>×®4ë½gÂÒô=JçHšæ}2k»|¹d±šòÎÖy-Ë}Ö–Ú#ª XüD1UáVš”c>“RI>l> ½\®täâïw›QwKLÏ noãé)FŽešfxÚQ’Jq¥ÇâqT£Q'(ª‘§Z1¨£)EMIFsŠR~¯\Gã?-Œ&ðGÁ¸AqñKÄKŠc\‘Âï ,>!ø†nPsö ZÎ/Âã%%ñý«q‚ËêåkŠSkÜ ¹Ÿø¶Šòw÷—øOk"Âû|lj5û¼2ç}¹¶‚òw¼—øO®@àÀtWןv-P@P@P@P@P@P@P@P@PÊZm¯ü <{à²<âEøÅàôû±Ç¬Dúw†>+i«ü1C«¿„©­iº,1ͫǥjMcI¨¬­"Ø]D@Œ–ÈðiBuñ¹^’Š©™ã°xJM¨ÂX¼D0ñ©+FMÆjN)]¥dÑóøzT¦±u+Ô*?QÓ¦ªMÃ/Áb1³„!*”¢çR8wN<Õ"“’mÙYð·Ÿ>(ø3^ðE§Å?†~м3ãØx×Ä^ø±®øæëGñ&µovþΉâ„> £^ÞÙý€ÝÚ_]Ë Åå®ëS É4T(áqˆàéâ*GZ†.­:1:“Áa猭EÎ5ç(T–†*µ/ÝÊ3xwNRƒœd:ÔiC‰Æaêʬ02úð5Jq£ˆÄRÁƵ>YÕŒÕ,N# ±”©¸Ñ©:ÑrT¥êÚį‡:?‹4ßêÞ?ðN—ã­b(gÒ<¨ø«B±ñf« Á¸[y´ß\ߦ¡}­gvá·pÆÖm¤ùm·ž*¸…Wêô§]PæöžÎ.~Ï’š­>~Tù9i5V\Öå¦ÔÝ¢Ó3Ô¨ÇR”éá¤â£VQ”i·*žÊ)M¥åW÷qIëSÜ^ö…üUø_àí{Kð¯‹~$x¾'ÖÖÑô_ øÆÐõí]/ï$Ó¬_KÑõ=F »õ¸Ô!–Ú#2 &‰âLº•…¸©Êž”ñ„£ F”]IFrIÆ.0M©I4ã®ÓM-QO ‰ŽXׇ©]DëºrT£NªumìÓ¥ Âu//r3„¥e$ÞüÞ+ð½¬~$šãÄš¼> ŒËã fÖ4è£ðœK¥Å®4ž$w¹ ¡F4IàÔ ^˜µš;Œù.äÚT£^ö¡*’¥ŸaÕ„£ RSø]HÎpŒ Ÿ4e8Ťä“pÂâjVÂáéáªÎ¾60–”iÍÔ¯•jaéÊŒr«×£VŒ5%*´ªSç E|÷ñWö©ðOÂjú?Šÿ²­t»/ ü3ñ“®Üø¯IÓ"×.þ$øçăNµ‡RHaû—e \k×w°Þ\°Ó¡¾˜Z„±g›«…©ŠÄTÂÉ<=z¦.©ÅÞ•:Ôg_Šª¥N8HÁÂP”yeVtá:´ù—} ¢¶/-Ãf8I{xWÃçÕÒŒ$࿱°Y~*…8Ô‡:”ó*¹„0˜eÊ­]SŒ=´«(Gé}?P°Õl,µM*úÏRÓ5K{ý;QÓîa¼°¿±»‰.-/,¯-⺴š #’9¢vGGVRA±«J®­J©Ê…j2”'Nqpœ'ã(NJQ”ZjQi4ÓM&xðœ':rR„¶”Ziú5£ù7Áë_øKþ%|Mø£(ó4Í oøSr7Flü/x5‰zÅ›uF¿ñô‰áû”è[áe³€7eþ¯(Ãû $fÕ§]ó¿ðíéo{þÞ>÷"Âý_Zx‡Îûòíéoy‰ŸLת{A@P@P@P@P@P@P@P@P@ó·í!dúW…t?‹61»jµø¼k¨y*Z[¯‡óÚÏ¡üO±`€´ñÃà½CRÖⶉu iu£W—Cëj´¾ÓWø–±ô»V~MœY†ëx:Ô-ï8Þ㎱ץڳòlñ?Û ¿Ù«â¶»xEÌ~÷Ö†ÞWˆMão ùWv¦âà‘×rÈždSFH‘Ô•?‹–{°ŒåJRϲh©ÅGš æ”Tã8sEꔡ(Ý{Ñjéüq¥C<œèƼiä\C)R¨æ¡QG#̧7Jtê(É.Y:u)Í&ù'ZKÊþ!è!øiñ࿉¾/üRñÏÅ/‚²x’+JZü<Ð!øqñ¢ùn-|âÏ7ßxf?xjúït‹Oíi:­Ý¥Ì¾{]ÀúwnW:U±¸Œ5<-:µ|&&9ehÊ£ŒÔ©(fJ­YÇëø¬«,h)Jxxcp‘¥NµZujm‰å¯’bç…¥N„0S¥ˆÍ(®g:Ø*Xœ<°µ¨Î¤§(ÒÀã½–#‡RR«áñqŸ²Áb(ÔðY.m4?ß ~#|møEðÓ]ñßÅïjðŒx£àÇŠü[ñ¯ÄÄ>)áŒþ®ñ£NÔ<{w™†#ðõÎá[é4ë­=9®´iR=2øÕž„e‚…|N3' ³òsá38Ú˜œd±”¥KP©V¤ñœU~L=l¦ºÅb&°²«U{xŠ”ég¬}, ± ¹v<õq¥—UËa“ÑÃ×ÂUœéBO†ÅÑx…:˜åˆ¯béEúÆè µ‹—ZÄ¿†~!ñWŒô? ÞxçötøÕà9¤Ö>4êÚ†4¿ÚY|,óõQ¿oh0héi‘ãÝ-5{w´ŠÚÞé5gX5W^† €•|<ñN…,%XG–Ô¯£SRX‡ÍMÒÂÂTq¸\^& GêÿhýF4žƒBµ|&K<]ZÙ{Áå5°ÔóŽi,/ÕéýoMãiïN­E|[ÅІ*†%ÐÅÅÖÃάèξOÅ/øWÀÚgíÛáÞÚøSÅ=ð¦»àÞI ëž(Ò¯¿g­3ÂrKá-*gñ–™®øs\µ¿ŸN†hlI¸žé¡·‰¤_;JUrZXl=W«…â,µ”TÜ•:˜Ì·OV-sS¡Zƒu•j–…£Q9sÓ©úÜ8§<ëÃ\Æ8YÐÁa09m*Aªt±8n Î1u2èÏ–0–64q˜5GW«,^©¹W§›ñÆæ [Å:•Ü«oa¤| ýŒuRò_–ßNÒtÚ[TÔµ]JîN–ö6z}­ÍÌó>(­ä‘ÈD${‘:0¥iɨǚ­HSÚ¼ç+ÊI?'"Œ§Â|=Jœ\êVÈüB§NMÊu'ÂÙ)Ó„Uܧ95F)ÊRj1M´¾~!xú?ü4Ô¼gáY4ÿ_j:~™iðý-n¢ºÓº9?’åIù´}O áu­‹’øw]%7åeÊ“ó’>«¯£>°( € ( € ( € ( € ( € ( € ( € ( € ( € (濉>ñö‹ñ.ËâWÃo ZxÁ|AàïøC|yáé¼Iaá‰ä›Ãº³êþñ Þ£–ò½¤Z÷ì.Ó ,É©i„1M<(ó³ ×aMFJ¤Ý›M®VµV^i?—™åf¹oö„)(MS©I»I¦×+Z«/5»Y÷1?·þ>ÿѾÅÿ‡kÂ?ü…^Wö _ùÿüž'úµ_þ‚aÿ€È?·þ>ÿѾÅÿ‡kÂ?ü…Gö _ùÿü‡úµ_þ‚aÿ€Èåí~*|R½ñޝðþ×àÖ•?ŒôFñ>¯áÔø¿á¨Øè> ¼Õ´ý#Q–?°í0Íw¢jUYž=´ª‰wnÓØUçü?ðêÕú ‡þ#¨þßøûÿFûþ¯ÿòØ5çü?ðêÕú ‡þ þßøûÿFûþ¯ÿòØ5çü?ðêÕú ‡þ#Ñ~ x+ÄÒ|Uâ/ÚZXøëâ/Œ5Ox‚ÆÎù5K}O·Š×Þ ðÜ’EÜ.›àÍC[ƒ , ©]j³Äº/'½„ °¸ztS¿"Õ÷“Õ¿½éå¡ôØ,*ÁaiaÓ¿³Z¾ònò6Ý»+.‡µWAÔP@P@P@P@P@P@P@P@P@P@Ç|aáÿ‡Þñ7޼U|šg†ü!¡jž"×/Ÿìúf‘g-íÛF„ƒ4æ(Yc‰Né$dg€0 ÿh?Þý­®ÿmŸø#Æ:oÃ_^èøþI4ûǰҾ|KÕõï øW‰TLtkðòåôË·Ž(o.üóâcºþ¦ín­¯­m¯l®!»³¼‚«K«iR{{«kˆÖX.-æŠM ‘:::’¬¬$±@P@P@P@P@P@P@P@P@P@P@q¾:ð…¾$è±xgÆšjëž®—«ßø~é‰Ò5Ét[¤ÔtÛ-zÌ|º¦“«ëØÊ|‰äÓ K„šÜËÀC¦iN­ûI|pеM3OÔ´MCörý›ôËýþÎÞïK½Ón<ûY[\i÷vÆÐ\YInÍÁ"221R¤P¶x?Âz/<3£x?ÃÏiáÿZ 7C°žê{¿ìÍ&ìý"Úk—y³ì- Vv±»¹ŠÚÒ·7—’mò ¾GI@P@P@P@â^-øËyáÿ_ü<ðÏÂ?‰¿µÝÂ^ñž¹/‚o>éºv‹¤øÇXñž‡áØî®>%|Rðœ—W·Wžñ)1ØCx°¥¤m4‘›ˆÕ€3?ár|Eÿ£Ný ?ð£ý–?ú%¨ÿ…Éñþ;ö€ÿÂöXÿè– þ'Ä_ú4ïÚÿ ?Ùcÿ¢Z€ø\ŸèÓ¿hü(ÿeþ‰j?ár|Eÿ£Ný ?ð£ý–?ú%¨ÿ…Éñþ;ö€ÿÂöXÿè– þ'Ä_ú4ïÚÿ ?Ùcÿ¢Z€ø\ŸèÓ¿hü(ÿeþ‰j?ár|Eÿ£Ný ?ð£ý–?ú%¨ÿ…Éñþ;ö€ÿÂöXÿè– þ'Ä_ú4ïÚÿ ?Ùcÿ¢Z€ø\ŸèÓ¿hü(ÿeþ‰j?ár|Eÿ£Ný ?ð£ý–?ú%¨ÿ…Éñþ;ö€ÿÂöXÿè– þ'Ä_ú4ïÚÿ ?Ùcÿ¢Z€ø\ŸèÓ¿hü(ÿeþ‰jèþüXx›Å~ Õ¾ø÷á§Š|#¡x?Ä׺?Žgøy{%îãCÆzV…©é·ß<â»FÔ|âX%‚æêÖâ3k˜Lw»zíP›xûâv“à)t­)toøÃÅþ ŠþxÁöv7~!Ö-t—²MWP7Î¥¦hÚdÚ•‚M©ëš¶—d²ßZÛ-Ã]]ÛÁ?Ÿ™f™~O†x¼Ç&-EJWmÉíB*Sœ¬›å„e.XÊV´[WN£å„nû[uÿ _ãS|Ñ~Îwi|Ñ¥ßÅEtˆyE¹ŠÕ.aŠà.¬77«Yo~%ð´[J¾"J-¤Övvê®Ó³étŸtþ§_²_1?ájümÿ£uü;^ÿä*_ñø_þ~â?ðž_æS¯Ù}áÿ Wãoý«ÿáÚðÿ!Qÿ/…ÿçî#ÿ åþaõ:ý—Þðµ~6ÿѺ¿þ¯ÿòñø_þ~â?ðž_æS¯Ù}áÿ Wãoý«ÿáÚðÿ!Qÿ/…ÿçî#ÿ åþaõ:ý—Þðµ~6ÿѺ¿þ¯ÿòñø_þ~â?ðž_æS¯Ù}ç˜é>#ø÷cñ›Ç¿dýž˜é¾'øcðÁ¶ÂØðPhï¼⯺ޡ)qHÂKˆÚb…h#Qä’JYÖÞ¿â%p²Š~ßvÚåú¼î’JÍý›;´¬Û÷]Ò\®GÔ뮉[Íÿ Wãoý«ÿáÚðÿ!TÿÄKáùûˆÿÂy˜}N¿e÷‡ü-_¿ôn¯ÿ‡kÁÿü…GüD¾ÿŸ¸ü'—ù‡Ôëö_xÂÕøÛÿFêÿøv¼ÿÈTÄKáùûˆÿÂy˜}N¿e÷‡ü-_¿ôn¯ÿ‡kÁÿü…GüD¾ÿŸ¸ü'—ù‡Ôëö_xÂÕøÛÿFêÿøv¼ÿÈTÄKáùûˆÿÂy˜}N¿e÷Ž_‹ÿ¬Ÿ«þÍþ(žÁ×/„þ!ü6×5tL±éºÞ¹ Aq (bËóN~U† ™°5£â? Ôš„±uh'´ªaêòߢ¼ÚõiEuhº_ vèšýl{7ƒüaáÿè6¾#ðÕÜ—zmÄ·–Ž—6wšf£§ê:mÜÚ~©¤kN¥š>±c¨[ÜZÝXÞA ðMÇ"+-}½Ô±©Ö¡R5¨ÕŠœ'¥ E«ÆQ’ºqkTÖls4âìÕœz=h  € ( € (çÿÉÓüdÿ²û4ÿêÅý¬hè ù¶Ú#QÕõïhž øñ£Ç–ÿü_¨x[ñ‡ïþiz<¾ ÒìôûëØ4è|oñ¿@Õn-ÒÛS³"i4ÈUŒ„.JœsЯíð4ócR–´ñð§Ì£)ÔYvaŒË1:2«>Yb°8…J-*³‚„½šsQ*ª…]lµŒëá¡„U4¡õÌ% m¹N0N^ÃMÏ—š1—4y®zßÃψ~øŸá˜¢êèåø:ØÚÑ‚µIR¡8ÒRq‹¨â¥8E¹®ê™˜P@†©ãGñ„üw5ÀñŒôïêú%¬VÒ< ¦ø=tíË»›¾"·Xe×ôx’2Í,z !Ž)ž%EªøŒVŸñ0X?®ÕoHªO‡ÁÂ)ï*“«ˆæŠK•S£UÎp“¥µR¥†§ŠqýÍLe i«ªÕ°˜üdM¯sÙeÕÓ’»St×+R”£×Ó$( €8_ˆß4o†“źõ¶§w¦Å®xK@h4ˆmn/猼Y¢x;KE{{kÙ¢Ôõë9nΰG3F’È«Š O–`V•s\e þÕ®Ú„ª=ãMYó8Ær] Í!NR¥ŽªšQÀ`±Øú‹«£—àëckF Öu%J„ãIIÆ.£Š”á滪fa@|ÿáÏù:ŒŸö@?fŸýX¿µ}@ó7†É½ý¡¾:_\þòçHðÏÁï éìzZèñXx¿Äæ”ð’K«øŸQ’W\V;U|‹Xöþ#âÍY¼^MBö§ 5æ—÷¥8E·ÞÊ Ý¯.ìô° (Ô}n—Üj¯ÈNð € ( € ( € (È>“kñƒöŽÓ`ýÝ”ºïÃ_½ºñö¾«ð÷OÒµ Å_áyì¼7£«€ZÔ¹ävoé ªN|+†ŒÕ؈GÊ>ÑÊß''nËM‘äc«¿Eù[ô>ޝ¼9B€ ( € ( Ÿü9ÿ'Oñ“þÈìÓÿ«ö±  (åÙ”«þÓ½€ý§|tyà$øCñ³öçÓôyíüIâÝWÂ?¼{à­/áVŸà¶Óµ_èñ ÿ„ Å?ü"šk<:]厶Mµ•Çk­JÓ—R”ãÁ8øXÍËÅy<.*öµ«æ9¦?'^ÉÓª§?¨Ô©ŸàpøˆÅTjUNÕ:‘ìÇ¨Ñ¯ÆØŠsxz˜< `1iÉ)Ñt¿³pÙÄ£(N2…j0¯K'Ì$å Ø*K0U9g€p5|aàý{À^øÁáÿìßÿ ü)?‹díZ>$ê~4Á>%Ÿã׆"Ô|\|9}ðÛÁqxIñ>•¢ÎËL×—~¹¾_ô››¹'¬¾ªž;…èN¬ñSãº4*k?©Ç‡Ž#–Ö­*³iF¤¨æ<7%?c Ã+{*´,J 1ͪS¡ #¯ÁüYíÒ´9ÑÊ1ÔðØÈÑTâ¥:1uðxœRœ¥V4ðtj]á£ËÎßx[Ç=Ñÿh¯j¾ýŸ4¿ˆÞø¿ñ+IÒho‰ÿ|OàŸˆSÃ^!|3†Á?áFê±ø?ÁÖ¾Ô Òmb±s—Ô¹—º¯„¾|KøûOj_´<^Õ5¯†úo‚›ÂšÆ±sÃðÇáÍÏÂí_?¾jz’[Éà©.üv!üøWáK¿ü6ñÝŸ€ÿd?ø¯^×hxIðÛᮋâ[ÏÄ~ øSáÜ> ¾›ÅÞ5[ êOª^Üø—Â+®“¥Ù[jöP¼œíŸÒ¦ð¹æ>­8a>¡–äx¬R~×F«áÚ·Ë©Ât¿³ðø§SŒUlf5R’Ãæ1Èhai¼êcrÜ6­|ΦiœñU|*ªêFëg´°øjÙ£š«Oˆ…YsÓ¢èJ®Ž+¥VšÌã'ß|Ѽ;ãCþ ÷ãŸè~ñ¯Ž.?f¯‰—¶Þ)ñ6—§júýþ»á¾ÜxbæMoU‚âýõ *îÿX–Ögî-$Ô5 #e’yÙû3*¸Ú¯c0QtóJ¼—ã“§©Ï1żºzÍSŠŒªâ#^¥ ²Œ-RYÐåteìß&ù Zq©•aøÎXJ6„œ)`!KŠçT)V”åNŒVV%'Ë<&Sn¦œ£Ëü%ð¿ŽuŸ‡?þ1I¡~Î~ø¨üCð¤þ+ý¢9³ð®“àk§Ó´k—ñ‹áO\Øø^m+Mñ¾ˆŸØJú]χ&Kk»}C‡"s¥W†°T©*qoG ˜a¯VŽaNx ÏÇ6ÃAC^®7]}f½llk×ú3ö©eºÒ~xo^x¢øaã/ð·Å£u|úf™yáGLñiz¹yÔñ!Öüq„´k»IY Ô#Õ?³nRK}BH¥Æ„!_ˆr ."*¦Ú5iR”UJuó<6]ˆÄet*S”e ß¿§,E‹…\VN\´ª*Òö9^IP¯J–¤$á:X:ù¶˜ÕXÚTRÁU«J­hN¥†«^|ÐQu!ñ÷Æ¿ xkÃZŸí ð—áÕ²ø_ádÿ±Åö­á»xsÃ^ø‰âö–š¯ü"öÚ ÐCàj~µðΩs”š|!³Õ>Óyö«rÇ<]|Žı<7åØ\êIÎR¥S«f¸8JR”¥…ÃbjaêFž”ðøŒv.4œêF;Ô'Ö*á”hãq<ÅøŒ]8Óƒ§:tpúYV6¼%NxŠóŽmƒu*FRÄa²Ì=’©KJ¿|á?…þ4ø¯àχ~Ò¼àíKÃ?±§‹î¼%á›]ÃMâ©j©t Ï®‹§Åªk—šF‘¥ÛÝ_üû¥Óíüù$0¦Ó'­R®i‚¡Q©QÁq· ÏX¨aþ¹—b–&#£JG‚ÃIѦ£J3ƒ”aNnZbiGê3Ç·)c1¼1â MiÎu*⣂ɰ•ðÕ1Ug)TÄW§S4Æþþ´§UªÍ9>¾ñÎóNøçâ_ÙæÈωûEø×á—ÆÑ {‹x4? Cr¿tçYcò-ô»Ûo†> ‚qºO2ë⌙÷ì²UÕÃ`ÛŒ—fx¼òPjTrüJþÐÉÜjSKëU£Ç5ñXŠ|­`ù£Vr…8B¯›Âœ0µ±iPR⌱ä.œ¡Rr­Ž¥:XmyÂ-Ór—cU<=Yû(B¦F•ok:´cWôV…|ÿáÏù:ŒŸö@?fŸýX¿µ}@ާñÕŸ†¯ï~éþÖä€SÉÕü0’ê–ά²Åvº[MÐÏ ÒE&àîß>!ø#â§ÅŽž7øwâ}'ÅÞÕ“áXÓõÍãís½§…õ[¸I*¯ Ì1Iʉ$n…]Aøg‹?ò1Êì§þ=<ÁSÕ~GÓÕù1Ü|ñÀq~Õ´¾üEÕ|GÀσ>ðö­ðï@×o<=§üRñ—#Öuˆ.|g©h—Ú¤ú…e¤iÒZé°\Û+_ùWflBÐÉõù=zyB¸Ž…u³¬vcŒË°UjÇÚG.¡Ã`jâ14iI{9cqU1ÊŒkTö±£…¥Rœ)ÆXš­Î6½JUò̯ UÐúÖ®a©jÕ)ÏW†Â)µháç.2XˆÂî·´ŠŸ#£‡šïþ~ɾýžþ#C¬üñ¯àŸ„š§‡õ{oü¿Õ¼Gâßê~-itÏì?øvçÄzíÍφõõ´¶žÓP¸2ÞGwkean–ñ3ÇžcŸœã*ÅḆ<ÃJXyeø÷8zØ4Ýib°ó•*q…\Ohê‡,%MZ¸‰×”aN‰É< #ˆÁÿ²T£íaŠKžqÆQ”dèÁÁÍ*u¨Ö”gþúT èÓ¥M×ÄU©å÷¿¶ÇÄkØ5ïˆÿexÿövðÆ§«Zêì|yàí'[ÔôŸ ÞIeâø3áuò6§â½Ýí¸ŠþÝ/#·ÈÖ éoчá|¶, <û‰hd–eGZŽ®]P†2x5˜Õ§õ JSƒÄÆTªK ‡’ÄÚ­9AK®²¬ñ˜¼»,¥ý¡Ëñ0˜˜6èAbèKý£‡œá'Š(þí{(Z®:500½Hs¾×âím®é¾3ð?þ |Õþ=ê¿~Cñ{Á—:/4/éSèRjÖVÆ]{SñE’ÛøIm"ínb¾y'–[Ë‹-;ìJ÷~|8àøVmñÎqÐÈ— ãðøk«JUùjVX¸¸ÒTdå[øeP‚j¦ë8¯ka\jsÇž$ÇÅÔöYìñ´¨Ót¦«S¯…Ãañ1¥Z rѼjV§ˆ•iÒxZ´cIB½jѧŸ~0þÖ¼cðká‹>|$ñNã OÚw¿ þ'x3þn‹áCCñ…Mµ¬VóI%õ³ÚÈÉ'µ“ðÞ]„âLº–#1£ÊsL‡2Ì𥄜¡Š¥S(Í ç<<ùž®\¨â3JjnS”ðiCÙbêÁRU+Éå<]GJX Ã(ö8zº¹<= Ï ‹§™aªÅEÖ„è×ÂQŠ£üO®Õ•µhaåV¯­ëÿô_„ÓþÔ¿.þ ɧøïáÿ‚~xƒâ%œ_./¥ñ=Ö¿¢ÏŸ‡£“û.ãLÒ$ðÒÝ_Y­îŸ±êd de|š9KÆPáü¯šË”æ\Qše¸G §Ílªœ³S”ã^rÆR©‡qÀÔœ=‹¢¢ª)U›O±¼^ â°‘Âf…ža(J²œpê†#:¬òÉT¥Nq†+ˆoJMb©NiÆ]oßڛÇZÿÅ¿ ü1ø¥û;x¯à½¯ÄÄ^ øIâoÆ~ñ4þ+°ðͽ¾§¨Zx—AÐAëé¢ÞYܾ—=æ¡4RÉ$+ÍxÆðΕgÜ}‡Í1¼; ̰´iV*Q­]áðعÚÊk”#R8ÂT¯Wš)ÓL^`œrŒU,=YeyÄãBŽ&QtåOSá!ÿ„äó<¶ÿÈ1¶îò>lyÇ•põø‡øë–þÝy*öþËøÚø\.+ø^Ó÷ŸWúÏ'ñ)ûnNoÝsrÇ¥Ö²âWËÿ$ì³èïþñý‡d¯·î¾µõK[÷žÇÚËÞOzÄ¿ÚOâ™ã½Wá·À_Ùï^øûâoXé7ß®‡éZߊu=L¿Å(üGuŵÈ{=15cp°}¥ÖëÝž{›ç1›â8ž­<^]5YêP¡Ký¯O„úäðÆ)K qsJ²R¡õ˜åÔ#/¬S©òãèahWË0¸e*yäjÃ8ÓmÆžSV„ÿ´yœ•(âjFÊèÇ’¾"tëbe áhBµ?ÓªüèôøWâh¯ÚÂí¬ékâI,>ëhlšÄÚLžÖ}N 5¥iðÜÜ[E%ÂFÑÆ÷0£²´¨ú7ÃEn£Óý£oü /Ðò1ŸÇ~IS×ßœ¡@P@PÏþÿ“§øÉÿdöiÿÕ‹ûXÐÐâúÿìßû;ø¯YÔh_|âøT:>“£x[ñ†|?â_xr=Z5½ö™­jZcϦêowcmy$ö?eÍÌk**@ž•\Tç˜UÌéBx`ð–½y⟠À¾ ðêÅáŸêr_ßøÃñ7n¯\ßM5ÌÚ…˜†âIeyFv,yiF8yá'A*Àa%€ÂÊšä–8B”ðtlèá%N:rÃÓå£(S„cµ¬–"8˜W^Þ8ÚðÄâ#SßUñ4ÿ‡ˆ¬¥uV¼.ù*Ïš¤~Ì‘|!øOŽâl_ >Gñ%¤y[âx+ÃIãƒ+éÇGyÅ‹¦ PÈÚA6%ÖM±ò ò¾Zª–©a[ÃSÄ)ª°¤ýœjª•UzФae5:éVš’|ÕR¨ï5p­þÑËíÿ~áìù}§¿ËìTU+s^ÞÉB*¾¨ÚÊÃ|"øPÞ7[á‡ÃÆø®$_ˆ-௠Ÿ¬‹§ÿd¬ƒÅgMþÔ4¿ô0Âë"ß÷?êþZ(7„Uc…Vu5URýÚ¨ªKž¢¨¡nuR^ôù¯Í-ew¨ë7‰(⯠š©ïªjœ¹é¨)]EB~ümË/z6z†µ¢hÞ$Ò5/ø‹HÓ5íX²¸Óu}Z°µÕ4WO»¡º°Ô´Û襷¾²šd’ £tub¬¤Vs§N¬T*ÓHÆPšŒ¢¤”éÎ5)É&šR„ãÂ[ÆqŒ¢ÓIŽ&Ý9Ê›q”[‹q|³‹„ãuovP”£%´¢Ü]Óhæ4…ß ü=á„ðNƒðëÀºƒ#Ômõxü#¤xGÃúg†V´Ômµ‹]M4 ->;ÔaÕì¬ï£¹ æÒÕ„±#.Îs”°“”å)à%á¤ÛrÃÎHʃzÑ”jT©8ÊŸ+Sœäš”›yÂ1¥õŸeOëq© ü©GÛB­«U…k[ÚF®ýž¤ģG÷RN驪x+ÁºåÝÍþ·á/ ë×–Ú-åî© éZ…ÝÕŸ†õ‡ñ‡m.n.í$’{m/ÄI©ÙDìËkxíuŽr\çM*3U)%J¢­G¥v_XÃÆpÃ׿V~Ú„'8Ñ«~zQœã EI§«œÜ'9:q§Š¢ ÛåT±´áGIGeOJ•*X¨[–½:p…U8Â)svþ½Ÿâ„ÿõý[IÔ†“áÛß x K°ðìÚ]ç†ô­~ãDÔ®‰à«Æ~7ñ¤FÔ_øÚ ZÞ%®“ˆ<)c}ie%ýÒJï«j ÚÚýªEˆ¥´VV¡ Ú $š Øa«acnJ¸üF?EËiâ0ynp²ÒZe±¨æýé:®/HE¹©=Ôõ‰Ö?µGÅko‡^ð§‰g¸ø û:¥í÷Œ|{}à½+KŠˆµ ÚÜ£x'Ä׺œ“=Åú t´¶´Ð$ž$ºYc6 C>ý¤µÜÿjüOøeàKG<Ùxá®­â]rÜ çÉñoéÚF¤YÛéúf™cmàÛÈà´²²µ"¶‚4EP?ü3ÅŸùå?öSÿNžžà©ê¿#è*ü˜î>/ø»àoÿþ.\þÐ_³×…<9ñ2x[DðoŃú׈­¼¨ø® Þß7„|Uáj tÍ3^Ó"Öï »]Y^)tè8K§‡Êú|“–U˱<9žT©…ÀUÅ<~ J.«Àc%‡LkaÕÝ\2• :”pñu‹§Js›¢æé,e5‰†N§²ÇåTêá£'*Xœ#J¼é;5ìëЪªT£Qµ B½^vÝtq ðòÏö£ø·ñ'@ñׯ_ Cû;ü:ð%ž¹m§üðÿÄÈ|s¯|Dñ&³§-×üsâ ]ãÁš}Ü¿ÙÚ;Ä× ©[Ïur†4³z×K…ò̯2Â`1ψóâ‚ÃÇ,ð´2Ì;«UöT±<Ó–cQÐIbb¥NLG%)Òª±1¯Í*ØÚ•0T©QXZô±u«óÆuëÔ£í•5.T½–º«‰Œµ«:àÝjUe7Œhzí¯ð›ÀWÿ³'~ øƾ´‡^ð¯ÃïÚSø¥£xDм®Ü]¶yãO†Ï¦M¯jZîc{$WÙhñM,QyÝ,o%ß~.|/ÄÞÃ5ÎsŠÙ.6Xl-,ËKSõª˜JéW–]UUöt#Œ¥IRÃÇ;ÑÄJUjÊ\c¨ÖžSšb3 ˜ÐÅf5s=jÁTÆâž"¥ DêTkG Œ«[êQ”*â2ïgJ†7š+ܾ| ñÂÿ‹Ÿ þÉlú>~ÊgÁçñKÝéѽçŠtŸh·~QÒçÛ“í67žjÚ›dÝåy¡ð‡Ÿ5â>oC15Õ±9ö—æ|=¥.\->o §Q'è}gMóÉN£—Ñ{Ü­Þ5}ø­×ãJN¢¡G<ËòÊjÒNQu0ynO±pêEºø ØhsF•W JpÃÉ׌ßþ üeñîûWêQü>m/XøÇàßÙàxcÃï⯠ݹ×<+mþ3ÐÛT]^+e:=Ô’Ûý²çìpÞy>e¡•\ ×+Ìr|§Âxæ_YÂä'ËâíCíÚm¿öD~"ð!Ñtvû%Íäw7ÿhÔ¿s‹(n ~P‘üÕóÙ^+ ‡Ãq}E_fóL¦ž ”dý¥eœeø©BñŒ”-‡¡V§5NX{œ·s”bõÄQ©<§)ÂÂ7¯…ͲìMHÝ.Z|»6ÃÕÛQ—-\UrŹ˟š1qŒÜ~Õþ~Ù|øƒû,é? |'uá 3Ě֩់ÍñÃw㟠j—ƶ^Ò| 1´—Cñ ‹P0ÜêzÕõ¬VúmâÁÕËÚËsöYngÂòÍø+‰óÊ­ nPò:ܺZÎ1©–Ч‚–=bc)¥„§O R¡J5ñUê:TýÕ­ )˜*ôëq}<8Š&•MçN…l?ʼn¿Ø¿±ÏÁ¾ü1Ô´Ëχ^ øS}âßÞø¾_ø/ÄÞ4ñ¤>´½°Ól´ÝÄ>-ñŸ‰µøH¼Yiec7÷Ú*éºL’Ç‹+VD7W~Ggk7Å`)C5¯G+ÃËñ•pô0´«ÔöõªN® J…Ôp•¡:tñ’«Š‹sç”W-8a… ¡ˆÅâc„X8ÖT©ÂªëUä §ïUœyi.j•*Êœ)ÓN4œ}­IÎN»ÏÙßÀ—ðF¹§_x[Wð–§­üLøŸâÝJÏ]ñV…ã-WSŸÄ~5Ö/­|Aq®øL°¶hu-´û‹{9ak«V¶²ºšyíd•üœçT2*Tñ0ÄS˲l·ÂZ+*Xu*Øi{YÏÚÔ¥ˆeWO’†"«Z4©Óœ`º\?áO>Årßëù„ëF­×-xF†J¥: Q¥Bt*Êu)B”cÎãÊ—»×Šj|Uâï êz·ŒÿhïøFÐËñ+áEßÂOˆ¿¥·Ìw׺‡¼{y¬ø-n]3Åþ‡SðÍäl?/ZIöìàx¿£<3ÿ’^—ý„b?ô¤yÏã?$º<1â-'Åþð÷‹4‘w¡x£CÒ|E¢Ý€ºÒu» }KN¹’ÎæàŸ½Ö¿@9MÊ( € ( €>ðçü?ÆOû ³Oþ¬_ÚÆ€<ó[øíãßx¯ö’×ucໄ_³]¬ZŽ©a‡µ›ÿøÞ Ÿƒú/ÚÂÃ^“Æ–ZW…n¬µ{ò‚æ}WŽú è­„VÙ½íç'×iÐÈq9½Z2¯_ëøÌ¯ BœÕ(ýf†#OV­YB³•:ñÆÂ„éBœgJ¤&5*ÆK½€öùžG–Pª°±Çåø|~+_÷”è¦g›a+rÒ‚¤ãN†+•yNUfÔ¤ýÇÊyÿÿÛ5/|/ÐüCñ_ölø…mñuõ ¼'ð[^þÐñ¯Â}r? j~0°°ñ,¿ðžëÇǺ±Òo´k­v Áí¢,dþÍò5MôkÂŽ¶m„©YãWÅc)ãpôÜpø·–ZXêQ£ÍZ4=¶ÔÆà*O8Ô§„­‡’uªÑ‘ã¬ëá0¹…:TŽ#† ð8‰EbéÓÌ*ª8:žÕºQj§BŽ7 :åúīӭìð³…oXøIãÿŽß4_|^'áV™ð£Æ­>·€îôÚ|CÐ|uk¨I ë²|@‡Ä÷úN»âyV*ö}x;K¶Hµ;‹hõ—{¹Ôs®¿²¨9æ÷çŽ\±•Ýáõ:õ(SÆC ìj)Ë4äðx𮦠§·RÅC Ë©O¦­9UÆã0¸ +`³ Øj¤yþ¸°¸©`+ÕSR¥õ%R¬+bðÉÓÆsR§G [ÙO6k_¼w¤VOx~ßá½î¿ªüMñ=•‚k¦ò:Oxqu-)§ÔnU$ñ^ˆÓ›¨Ý’lcŠÂµ“ã5þÍ­‘cs¼ÊÓŠ­‡†W„–2ÃQsŒS­†â©ÐÉš7gíjs6¡9éÔ¥ý¿‡¤éÏ„̰™vY.xâg›WÃb²Ÿh œý¤¸{óh~!Šçãç„4OköþÐð×Âþ(›YñV«ð¿ÅºŽ•¨jþ(>ŽÞÍu-/K¸Ò›K·Ñ7 ï/S]A-åþÊΖ7„áÜ£>ÆÆ¬©â©áqøÅB)Ë–áó Ølâ4)I¹bqsÂakâ0ö”£F¬©Ð«Gg9ú3À:ùíl“ V8[SÀQ£_zÑxÜË"Ácðõ*Æ’¢á„¡ŽÌ(Æ´`êV©„¥V0”*Î#ê¿~0‰Þ8¹´ð¤Vw_m>|?ñ¿öÿ‘;]_ë_Ž¡«hzm¥âÞˆ O éÐ^\Äm%voX‘4B&ŽN®¦Ä8|L §“æ°Ê)¨IóK†Â¬^e*±qÒ’¥ÉÞJQoŸÏ/dáâPŬMŠ­$éÏ1ÀWÇbhNSÃBuèáp0sj 5# QÄÑ”XÏ K™PjQ«ÈøÃÇ?õO‡Â†-ðÓÃÚ“ð›Ã_5/øçÂþ'ñ…Å®¯­x«Æ~‡ÃqxwAñ׆äWÐx~ ˜ï£nlF—z$†üê-‡Ÿ†Xšô³Úÿ»Œ2ºøL>.3_X«ˆÂÏ(N§½p¥Éz•¡³¥ÏBŸÕª*îµZ´0ø|>K7 ³©šO6…I)ÓTððËÿ±:Š..ujMf5éû Ò„ýÚÿZ¢ð¯ Žã´_Ú/Ç¿tß…¾ðn“á|[ñ¾«ñSLñMÇ‹lµÿø7Á°ü ñ/ü"5-/GÒµ?ßø¼_ø†M6 "Ò]cBeµÖ íÔÅôö²½éQŽ+†x&éeÕr,6QÕJ¥zTqëG €´eFÄGˆ•,N%/gX*õ!AËBæ­ ¸XÊx¨ûlf8†M S½ ¦ðÕóc’Ÿ¶©3˨*”°÷›xŒU*kR)â*døö•ø‰á x·I×ì| x·áׯMáwþ*Üx{Åz¿Âo x[Ä>°ñ®ñwUðe޽³§h7V:®£Üé·~)†ÓG¿ÕMÝçˆfÓ¬Ú[œ!Z…zY6%b)å¸lm\É–)óÂŽi—Ê4a…wõj)f•*áj`±8‡FX…‚äÄã•xÖxifp¯Nxéarü&eƒŽ{:˜¼&.«¡Z§³k>l¢¥ Éâ¨Ñj˜ÚYoµ¤°QÆTþο®üñ߇¾é¾5‹ÇAÀÿÚa *•<$§àðx|VqŒÂÃVsSgCZUká¡ +êToO,E_gGÑÇáªc³üã €ƒŽaì2iÓ•gG^'Ô§ƒŒ!Ë,þЖßü_ñáÍÏ>|PÕ¼¦xcĶŸ~ Þ <®è+—Y²O½Ñÿá/ñSøcÅZN¥ ÞEsdþ!Ô’{[ý2ö'„ÜÍkgÕF𝀫ŠTçB® ðuá+ÊU),NB£¥I:ué{j(¯k,>']Ϋ§^ÃV_WÅah{juáÃTÄRäJ(ËV N½?iQ¾WV…z„©Æ½:ò¥ì¡<,ç[­ðçü?ÆOû ³Oþ¬_ÚÆ±4>€ € ùŠ`ð‡íã›-fxl¡øµá/ë^ ºº–8cÖõ¯ÃâÆ~±,ÀI©éºTžÕD‰g·×.¤$J¼kǯº§*U+×úæ*6½œ(SÄbÝM+ÓźJõðøwNºÂã0¼ÕìîE¦xwá¶¡ñ2Ò÷àƒ|e¢øÃÃí¼šwb‡ÂÚô+ð§‚u¿ˆéâ¹lu?i>!·µx µðŽ™ªÍi¥iöwZ¼â;¹µ'‚œðÕ2|N)ýwáÕY{·©G, ‹Œ½§·Åàð2P§:RÃR©Œ§KVŒ§R™Š½eœÓ¡/«PÏêVž2?£ ]xâó I¯gìicq ¬**±ÄΞ‰ÂÐ9¼>' Øè³¶¢þо2øò5ë›´ñW†²­¼%‚¦•¢x“SµðÆ‘ãÛÞýµ…Æ¡®x{À^Ó¤‡ìqy+ ÎâiN£"ÇŽœheÙÖY[ýª†mZ›ž’Áàd«VÅå´f¯Sê¸ÌËW4«8EbåÌ Üa(é‹©WˆÊkÆ£¡®ƒ„á—Ö±T§^8miÅFr­€Áâ±X2›¨¡‡¯%qŽw‚~ |Rø}oáŸøWãm–›ðsÂ:¤RhÚøei¨|P_ Z´×6^ºø•­xºûD›Ã°ÜIˆ¹OE« &Ö+UÔ“P «·U:ó¨ðµ3K_ Fy¢ÕŒth¼5™‚j­Jµ=%ZòÁÕÀ:øêTñ†XŒxÅ~ö¦gW–yz¸–ÚçXZتë‹–+ÙÂ1iWt)â#Ч‡…wO’¢¥K“¾ðƒ-~ xSÇO{©ê!³Ô|yñ?â…ÑÒ|1«^ê–öþ5ñ>­âùtM?ÃÚÕµ~òÉ/ÚÒ1ao%Åó¦4’U„pòÒ¡“ey]hºôrì,°R”a9ºÑ­ŒÄÖrt©©ÊÿkörWšŒ`êÊq‹|5\±¹¦'O–”ñ‹Ô„#Màrœ¿,»­QÓ‚öŸPöþ÷"‡µöWŸ'´Ÿû(|)áOÃ;»s±oqâïx‹ÅpZø‚ íu½/²Ý.ðãÃÚ…•Ú%Æ›.ðßGðžœl.#Š[V´’£I’E„Z9vE–תëâ2¼» GQÕ§^Uqó·ÇN¦"”§KR8š“üM:•i׆JujSp›ä«_ëÙ¦sš§[Ùæ8ÊÕ(B²©Jƒ©9µJ•HÂxzœ]L^c §N¬'¨ñX™Vo‘ñW‚>/ê?µWˆ|UðëĶ~²_€ðüšÏ‹þjž=ð»v<ñ*úïMHôßxRdñ^•Ú]ÔF |¤6ÚÄßkÓî嬶¼|j‡ÓöŠ„qxÜ©Ón½~ÏŒƒÄa¥){7õyKÙÔç£^—5h)Æ2Q¿¡‹‚á¨r:•°Õ¸‚rå©eN5W Ʊ4Ôdý–)R­*N2¡UÔÂIÒ¬éÓÄR©Ò¯ì×ÿÖ‡ðâ_†ž3O |Føm}âÛû_ø£Â–~.±ñt¿5Õþ&Áão iz¯‡ò×_ÖÝ5`º6¯¡Ée}abÐJm!šÊï¡¿c‹ÃVÁGêøL>WK$úµG:±ž[…†`ã:‘•)<^¾†%bRä©RX¸Ïéâåp4êÐÅÃ'S‹Ìÿ¶%Z›päÇËëêòS©íÒÂO ‹¯ƒŽR•JtÇípÑ©-- à§Ž¼'£øŸTðÇÅ‹kO‹>9ñä_|oâíOáõ–«àÞE¢Xøb Ÿ‡ãÄVÚž“à›ézl60iþ1¶Õ£¸Ó ¹½Öu–ò ô¿qC-Áá- ës«N²U%‹Äãå:¸œeZ”¾¯(âyAá”ÃÒÃP¡…«C¡í%|ÞÚ¶3ŒN¥zôp¸z¢Ýá(`RXz4¡Së”*·Z®9ÔR©_ŒÆUÃTÁFXjxZžøãÿé¾4Ö<7ñS@Ñþ(üAøÄoëvŸ £? õk¨¼=¥øOûþ]øÚ}fÏH—GÒ,ïg¹²ñÕ®©>°­y&¢Ö.ÚK8òáðÙv eƒÁO1­V•fêû|Fg^¶+Z2§ì%‡t±#<5*oØ% KKˆÄb1¤«âqx¬\y«VÃ`p”eG÷R£K/OØó9ªñ¯*¼õiâ%R<ßWœ(áe„öjC#Bý˜®lµ}/Åšßt»ÏÉñö^0¹ðï‚§ð×…µ­RÓ᮫ðÆÛCðÿ†n¼a«\xjÒï,µ ­BïX×nn¯¡½‘öÅy Zua• L§ê´¥ >YG>NœçÏ*¸œÿÛË]MF1£NZÜÔðÔérµ*“–*¶'YÕ«SßÛ8º™ž&ÁÂP"£C&̰Y.tÜ¥^­W…©FU%8*têÒ8*XXQ–3þ˾6›Gøðú7Â?‹>>ñïŒükḾ}›ÆÐé¾>ñ5þ½¬x/Â=‡ÆÂ×AÐn­."±½žûÃZÍü¿jÕf²ºÓMí¤zFX¬&‡0¸ˆÇK†¥J¥%ìÖ&®[1ÃǤê©a¡‹9Ô£MR©Z9ÑgVÐèÅc'<^70ÀߎÆPÃaÝG/kÃå8§ë8xòÓpÇ:xZµiÕœêa¨ÎX[`åS ^®;§×ÿf„Ôuïø·Fñ¬¾ñV©ñ+Á_>jVú]Úx#Ä> øg¦|2‹MÖ4×Ö#2ðΩ£ZêpêI>‰3ÚkrÁmukuo¡Âʾ Q:ª¦*ž?7ÅUXÊT±|êž–/Z”*BO•a£Z•xV„዆·#…ѯ…IRžÒtppÉð9Tc ¯iNYnmŽÎ0xºU' ¨Î|Ur¥8UU(Ñ­NsqÅISõ¯xwân“s®j?¾%é>7ºÔ¤²IÑü)ðþÛá÷ƒü9eeo¶G±°Ô*x=õïÂoˆ{-B)oôË}ÒÉ>ZÙÇèÚÔº4nü¬èãe®¥áýsGYô峘$P]2ö6†m:bëÛäNÇâ·ÃOÛçã7íãKÿ‚¼#'ÃO‰?´WÄýRñÇŒl®´ÃJøkà_xóWðU¥Ì %óiÞÕ5Ÿ>üÉ%€‘¡ƒíó¥ôз‡ô=?Ã:áÍ"9!Òô.ÃGÓ£šinfK-:Ö+Ka=ÌÌÒ\ÏåB…æ‘™äbÎä³M¾A·È× € ( € ù‡_¸ñÿ~>xÛÆÚ?Á¯üLðÏŒ>|𭞣à]oá ‰Ó5ßøÏãÆ­­Yj¶>)xNåCiÿü;,YÃy›®Už7ƒk›Æ÷ü.Oˆ¿ôiß´þ²ÇÿDµð¹>"ÿѧ~ÐøQþËýÔÂäø‹ÿFû@áGû,ôKPÿ “â/ýwíÿ…ì±ÿÑ-@ü.Oˆ¿ôiß´þ²ÇÿDµð¹>"ÿѧ~ÐøQþËýÔÂäø‹ÿFû@áGû,ôKP7?~$Ao4±þÉäx¢y?øHÿeïŸb–*¿í4¥ˆ 218 ¤(“ð7íKªüHѤ×|û3ü|Õ¬mu ÝQ†McöhÒu}ZÓ¤òµ Ä^Ö¿h»MSÚݳ”ótíRÎÒê5–6h‚Ê…€;/ø\ŸèÓ¿hü(ÿeþ‰j?ár|Eÿ£Ný ?ð£ý–?ú%¨ÿ…Éñþ;ö€ÿÂöXÿè– þ'Ä_ú4ïÚÿ ?Ùcÿ¢Z€ø\ŸèÓ¿hü(ÿeþ‰j?ár|Eÿ£Ný ?ð£ý–?ú%¨ÿ…Éñþ;ö€ÿÂöXÿè–  ? ãñ¾½ñŸâ—Äoü0ñÃ-ZøaðWÁ:%Ÿuo†ÚŽ­ªêž ñ_Çw_¹‚†Þ?ñ]µ® §Ä/¢=åÕ¬²Ê÷!)v6 £¨ € ( € (ɾ7Íñ$|6ñ•ð‚Î)¾$ø–øF<)©^Íö]#·Úʽ¬þ3Ö®ö¹‚ÃAÓþÙª*$SÉsqeke RÍy0ãž•ÿµðö‹ãø[áçÄßé?þ|6øñoÂ_µ"²ï~%ëþ<øý®u-3Øhá÷…#·hd¹º²m;íצk¨/Ð?CöçÀº§ˆõ¯øwRñ†ƒÿÇ‹'Ó Oè+Ò € ( € ( € ( € ( ø…ð†ú÷ÄâÂbÓÀŸmí-í.¯îmæŸÁß´«Æ×Âß4[B¯ªØ"»¥žµjcÕôƒ!k9äµ{>øÛä|†Ÿl|sw©xS^ÑîüñOÃ0E?ŠþkwV÷…¬²µ½¿ˆ¼9©@߯¼™Zk¶ #'ýòB)ì­À=~€ ( € ( € ( € ( €>ðçü?ÆOû ³Oþ¬_ÚÆ€>€ € ( € ( € ( € ( € ( € ( €<Ëâ_¯üK´Ó%»¹Ô|9âß ÜM¨x#↥‚ÇÆ Õ&ˆE5Ö4G5ÔJ°_é7ÐÝiÚ•¸û=ý¬ñ ~ú7ƒ¾*ø‡Ã¾#Ó~|r¶Ó´Oj2IiàŸiQIeðûâð@šÚg™¼+ãÕµFšïÂ×ÊÂ+‹"çS²†y,À>† € ( 0ñ÷Å^iš‡‡|Iã¿ëv·z†“à¯E¤Qô« ­­ïµ½STñ­¥h¾Ñ ¸»·í:¦§j×3AaåÊ+ÌÍ3Œ·$ìVgŠŽ‹’Œ[R”¥/å„ ¥9;jùbì“nÉ6®çQòÂ<Í~~Çÿ [ãgðþΓ*õQ'ÅŸ,€v±Û:«Ô+¸8b9?&üKáuÿ/±Ô<¿Vþ§]tZy‰ÿ Wãoý«ÿáÚðÿ!Rÿˆ—Âÿó÷ÿ„òÿ0ú~ËïøZ¿èÝ_ÿ׃ÿù ø‰|/ÿ?qøO/ó©×ì¾ðÿ…«ñ·þÕÿðíx?ÿ¨ÿˆ—Âÿó÷ÿ„òÿ0ú~ËïøZ¿èÝ_ÿ׃ÿù ø‰|/ÿ?qøO/ó©×ì¾ðÿ…«ñ·þÕÿðíx?ÿ¨ÿˆ—Âÿó÷ÿ„òÿ0ú~ËïøZ¿èÝ_ÿ׃ÿù ø‰|/ÿ?qøO/ó©×ì¾ðÿ…«ñ·þÕÿðíx?ÿ¨ÿˆ—Âÿó÷ÿ„òÿ0ú~ËïøZ¿èÝ_ÿ׃ÿù ø‰|/ÿ?qøO/ó©×ì¾ðÿ…«ñ·þÕÿðíx?ÿ¨ÿˆ—Âÿó÷ÿ„òÿ0ú~Ëï<ÇIñÇ»ŒÞ=øƒ'ìôÇMñ?Ä~ ´ƒþÇ‚ƒG}à?|mÖõ KˆšF[üFÓ+A ”’Rζõÿ+…”Söø‹¶×/Õçt’VoìÙÝ¥fߺî’år>§]tJÞhôïøZ¿èÝ_ÿ׃ÿù §þ"_ ÿÏÜGþËüÃêuû/¼?ájümÿ£uü;^ÿä*?â%ð¿üýÄá<¿Ì>§_²ûÃþ¯Æßú7WÿõàÿþB£þ"_ ÿÏÜGþËüÃêuû/¼?ájümÿ£uü;^ÿä*?â%ð¿üýÄá<¿Ì>§_²ûÃþ¯Æßú7WÿõàÿþB£þ"_ ÿÏÜGþËüÃêuû/¼?ájümÿ£uü;^ÿä*?â%ð¿üýÄá<¿Ì>§_²ûÃþ¯Æßú7WÿõàÿþB£þ"_ ÿÏÜGþËüÃêuû/¼?ájümÿ£uü;^ÿä*?â%ð¿üýÄá<¿Ì>§_²ûÃþ¯Æßú7WÿõàÿþB£þ"_ ÿÏÜGþËüÃêuû/¼Qñoã±ó¯¿fývâÒ>f‡Ãß~j:èê,¬µÝSC±ž_ögÕ-ý¼ñWOÄžœÔe‰­E?µ,=NUëȧ/º,>§]}•§K¯Öǰø'ÆÚ´5×t .Ö(îîô½KMÔì®4½oAÖ´éѦӭõ-cû/ZÖ~Í.«¨[iv ýŸáý:úúo6úîÞ,Ålá|ÍÎU˜~[Ábs,n.ÀÒöøÌ\§4ù¡yS¥R¼×=IFå¥J¤¯)E>^Uy8§è¨KÙת—îðÐU*==Ø:”é'mßï*Â6ŠoÞ½¹SkÀ<û}~ÈŸ¼Y¤xÁ¿´«¿k× e£Xjþñ¿„àÔoåeŽÛNµÕ|[á2ÂMNêgŽk?µ îf–8mã’WTo£Äp'a0ØŒU\žnŽœªÕöu°Õ§PÖsT¨Ö©VQ¥Ôªá *T£RµNZTç8ðTÌ0t]?iW•NN*N9!ËNuªÔQä£Zr^Ò¬¡MÍÂ’“©Rœ%ô«xçÂÉ㘾6©ÍáY|k‹ö-Dî𞫇.§ý¢->À6ê“ÅÙÍи;·ˆŒ`¸ùºxLE\+NŸ6_†­Sš+’¶&z´!ÊÚœ¹éá«Kš”#ÉiÊ.PRë«8Ж,±ï¨+7Îðk,F×Qök‡~ÿ/?´÷9¹gËÖW1A@ŒÞ<𥿎ì>˪ìñ¶§á]Kƶ:'Øu&ó¼1¤jºn‰¨jÚKfl"òu=[O‡ìò]-Ãý£zDÑÆîT°xšØl&_W F¼ù¢½LlqrÂÇ•ÉN^Ö8S¼#(ÃÙZ£ƒ>uUªÂJ¯»mZÔh=ùêaéBµXé~^Ju!+Ï–2½¢å$ÒŽYIJPRë+˜   »íwDÒï´m3SÖt­;Rñ Ý҇ôëíBÒÒû\¾³°¹Õnì´kK‰’]Nî .ÊòòHm’GH-&™”G²ëJ…jÊ»£Fuc…¥í«8BRThª”¨ºµ\Söt•jôi{IZÒµ*wæ©Ôš§k7ÉOž¹å¤}¥NogO™ÙsÔå—$/Í.Yr§fjVC ò„ÄÃñ›öµ‹ä·“Sø[«I ð©]ø 6æð¯ü÷’ÃDÒ`fî–áçú;ÃYÊ\-‡‹wTëâ#Ù{Nk/ûzR3ÈÆ+W~‹ò±ôu}ñÊP@P@P@P@G41\E,ÅðOÃ43"ÉÑH¥$ŠXÜ’6F*ÊÀ‚ `ÐËÓxCÅß³ÜÒêß 4CÆ_‹=ιðOOÅLj< O2ïZø'çÊ¢ãGE2Ë?€%‘!á›Ã²ÚÊ£IÔ;A·È÷ïøÓÂß<;§x³ÁºÕž¿áýQ­/ì™°²Á#Aweyo*¤úv§iu¶×V7qCsk<ÁqsDè =SÔu?G°¼Õukû=/KÓm¦½Ô5-Fê  ;hÚ[‹»ËË—H­m¢‰ÞYQK1f€>,øñ_À?>,þÒ-økâ ø^ßYøqáèµëç]7Q¿Ñ<)uo©>—<ñ¡¿°Žéž»L3^HXZ9dü3ÅŸùå?öSÿNžžà©ê¿"¿í±ÿ$[Kÿ²Õû>êëð5|gÉaÃßõ÷ÿªŒÄ×5ÿ’c‹ÿìQSÿR°‡aûYxGÂ~1ýœþ0ØøÂÎÆ{ 'áÿ‹|K§_ÞZ­Ä¾×¼=áýKQѼE¥¸Ä¶š­…ä),S[›a :¥ÔVñ[^ÜÝÉö‰-Úê#€Ë²J>#帯m‹Ë²lû‡éB”iÕÆK WЍÒÃUª•°ôëQöµkâ)S©5ì~¯F)âcŠÂøôqòÇpÿcêЃÅbñYœ£å0©S-ÀÆ¥[&æÕ(:•(RæiÖTcZR¤ªssß¼cñnËàí[ð#ãgŠ´Ÿˆ¾-øe¢ü.ñ>‡ñ7Ið݃äñ§ƒ|âèÞÈëžÒg’ÃFÖô­WAÔì Ù„Š[T²‰&Oq®S†Ê1y燼E’à'”S­Äô2ÜVX‰âaGƒ–_^zê¥VpÆañp«VoØâ#Zå¢éB;b–' ÷ Z´q| g˜ì4ùy*ÁÓ˳,&.X$ ¡ °¥,<ã:³«Ô•OehR^Sñöè¾Ö¾$|AÓáý²|/û1iŸâ3jÆÉK4†]†ÃSªÝL5rNŠ•'BPx©MJ0¾¯-g¯ã 9u/ xWPñ6—¢x‚[ â’[û: V[\^¤Þ&kJ·ñ:ŽÛ{^ RŽRIbéáñTèæÔ°ÒXlÇê0©‹ÂJ”e4ñRŽ?({*Q•`1³Åáñ˜ TiW£G*8cðÌ:–‘¦ÃàŸ Éká]-¾É¢Zê$ñ‰õ‹kHä•"›Ãï5ãóâॎx§ÆA9Nò¡C-Â,Myâñ4žgˆçQXš©No ”åXŒ ê8©JŽ21ýÜd¡<¾ªðY>Q–{jXÇãáSìp±£ ]¶”ñØúü°æ†Ï<Ä丹F2•J“”ãÍ5íd?ã/üœ¿ì}ÿao¿ú¬Þ¹øwýËŽ?ìE‡ÿÕþPm›ȳ,ÿ²‹-ÿÕ^~|ïûe~Ö·_ ¾*è?l~;h?³M›x.ßÇz÷Å KáN»ñ_¿›PÕu-/Eð§†<'c¥^i[•Òoîu íPÆáe´[6Ë7­Áü8³l&e›TË*gQÀbiàèà)â©àãV£¡ õëbq%Æ•*uè{З´•kƤeI¹SëÆÎ8<> š•|ÅV©*²“PÂa©MS§(SŠn¶'^©(Ï÷4°ô«T›U§†OͼûløÛÄ_ÿioøE>)èËÀz§ƒ¾3èßnþ§tÏëQYµŸˆüâÝ$Yè¾#²¼±Õlf–ÎØØIkc,\A<¯îcø>Œ3N ­,šYû9†W‹ËkãV2ŠösÂò×£‹ÃÍâVGjÔäÖ&†*†%Ò—ÕêaRòèÖ䩚àêæ>ÖŒr,×1¡ŒTmˆÂb0Ø\mZ‘«AS ‘ÀÍàç‚åöËF6Æ/mía?wñv£ûV|?Õ~x _Žñ_Ž>7|Aø‡cy­Ý|4ðÖ‰áoèQü6½×¬´í+C²Io¼I…îôýCP²{ÍVÎçV™-mµ ˆ­šP| 5̫洰ùml!Èjâ']â'WŒÄáó¬£ T Üpøz¸º·‚*p«†Â‹ñB×HÓ¬Mñ&¥ðÛEÕìlµI.ôÿ´é .¯£DÇ`ÖjZå¢dòÄ«6Éòš¾3–Hàðœ=–gt*ÊJxIæXŒš§#µIûEF†>®1­:þí¥)T«TàUq¸\¾q5cS€â쯉ÁS•:U+Ô„!Rx¥:ë‡îÿj?Žßôÿ‹úßÿ‡´,žÕ|7á#^Ð~|ý¯ÿioŒþ7:œ)s¬]øºÓ[Òìü9à5Ó¢³XZG®+Íc|÷·Ï¹°ˆù7•`g”WÍ1™+Í!]J±8ÌÆžQ”à(Òp…:±Å*‰•Jµ'd–Tðò§K‡…ZñÄswbœ!K%”j,3,5zÑ•mkâ+BU\(áèSöœÔ]TêIRYŽ)NRÃÒu(y„¾(øßûEÜÿÁ<¾&ÙüS´øgâêŸì.-ì~è:ýµ‡‰¼3áoïø¡m5«íÁõß h÷:CéO#Aa&¤÷–îÒÛÆµô´°9/ çüw‚ž[ý©€¥`±ÞËëui'ƒÄcønµ|ºéÅÍÓ–+…¯KÓÄFž4Ÿ2ÄÖ™ââêbñ\+ÂÆµL&7Ä?Ù«_WuéÖÆarìn#äéQÄà µ±8IÐÄVÄNœœ)ѧ‡ñ/öè¾Ö¾'|FÓáý²|/û1iŸâ3|59M£xsÄŸü5s}â{R÷Àÿ³¿Ã]\µð›i¾±‹Tñ‰§àÏi*°—ûïS°‚ÿuÖ‘mšàF7îxåPcβ<ÅdÙÎ[›:YY|ëIÑçö~ÓÛa1[{NYòrýcžü’¿'.œÜÑî«u°9–¬9éfX«OV­^…i|6o™QpÒQkŸ™Jñ³ùÚoÙ'ã·¼þж7‰þ+|-{»KÝ{áç†~øáü%Ÿ`¸ŽâÄ>(ðµåÕý×…nvZ³§AªëðkKâ]ÅÚ~§ú>£hˆmÒ 0ñH#nË?9G3©K+Í2ç:¹–a—æXrŒ9à)c©¨Ê•Ju!YV–3ž^ÒôÚ¦éÔ¥Vd—DiÂl‚¥*TÕ,ãù(Ô‡´¥ZØeÔÕ9Fñå…(åöÑÊSU}×JTÔ¥óþŸû üU×5ÿEñ«öªñGƆ_¼[¡xÛÁþ¾ø_à_ ëëâÜùž¼ñ7ÄÍ=®uŸIklÓE}(ŠÊ}Mç’Ye‹{ÆÿIO‹rì$«còîÃåùö# ‰ÃÏGˆXh}v“£‹t2äÕ Tä¥)aðîU)aåZTT’—%l%W…Äe´1ը嘵8ŠsqÄW­ƒ§Zž!aªbª§;Î¥*¶!EU•5QRt*Nibø£ö$øª?ÄŸøWö®ñ·¾üPñ‹¼O¯|+Òüá;½vßPñÄÒêÞ$°Ó>(Ü]&­gáë¿O,Òi±Ú*K§Ü\éÓ¼¦òâînl7`iàrŠxÞÃæ®A…¥„Àc*Ö­ 0†ŸêRÄàiòÓÅN‡:”¥:‘•IÆ2„¨8Rö^’¨èfU3L –Œ­ N6Q—µuq”èWÄae?¨V«†¥JT”á…ÆóchB7…tº·ìã7—á»áÚXð> ü áƒâÝÀºeí¾§~·ÏâMwÂÚÆ¿s¦jº=Æ—¤^@þ¼Žæ4¹½µÔ ¾†çK·'j¼[B®aÅx©äÔêax³1Áã1Z•ÜãN†¦gZ¦UJ#R¥l}*”±”ÔÑ’¯‡ÅâhÏÎÃ`iaò¼£*w•,ž¶6µŸM}bxhÅÞN+ì! ÜΧÖèJ­)*N§µÛ_Øêêãá_Åß ø»âæµãŠÿ.|?qãïŒZ߆4ëc4^¿´ŸÃš6…àm#Rµ²Ð¼9§ÙÁs:|çlú­äþo–ÐÛ[æøª… ˆ*å¹<2Ü›…±ñ̨åðÄT«:ø©Õ¥[Z¾2´eRUq…*4åì¹0Øj4(”Ü'R«úµj¿Ú•1x—ˆÄcò¬^QJJ>ÎŽ ˆÃc0ôÝ:” §‹u±rƒ¦ñÕiÆu\'iE|Qû.ü^Ó¼ã“ÓÊcJ1Œqøœ}JªÊUe[ ‚ÂÒ§$•ÜpÐÂNTܧ+O]Â4ùåÍ¥hʶ# YÔ’¥‚ÂONØUkbg_ŠÒß¼ÄS†$Ój OžJQ…<ßü.ÿ„·âgÁ۟Ùÿð©îüouýý™ö¯íïøL|2|;åÿhhCý•ö<ý£wÙ¯<ïõx‹ïÕåÙ‡Ô(g”}µþÙÀSÁ_›“Øû<à Žö¶å—´¿Õ}—%áoiÏÎùy%º_ZÃapÜÞÏêÙŽÍkó}_ ˜a½•®¹yþ½Ïí.ù}—/$¹ù¡çÿþø£Ç>)Ò¾%|#øÅ®| ø­§è/àûÏéþÐËöïí?²>Íý«öÏ3ì÷¾gÙü‘ïóSÇ˳?¨G<°ö¿Û9dòï“Øóæy^cí¾{Kfûgî_Û{Nuìù*]J\ù]<³›—ÙâòüW´¶ÿPU׳亷µöß3äåøg}&ð§ÂïøF>*üZø›ý»ößøZVžµþÄþÌû7öü ÚF¥¥yŸÚ_Úÿiý·ûCÍÛö[O#ÉÛ™·î\jã½®A…Èý—/Õq¹Ž3Ûs_›ëôp4½Ÿ³å\¾Çê\ÜþÑóûKrÃ’óu©{\ÃŽ¿/°Ë©`9-~ogŽÇc}¯5Õ¹¾»ìýŸ+·²çç|üòoþË¿ð„‚ÿŠçûOþv­ñkTÿ‘gì_ð“ÿÂÑþÙýÇüŒÿbfkýÿôÿµ}ŸîÛùŸ'©Šâ¬ÿl²rkdY^Iü[û/ìßì¿öŸá®mý›üsÙûoâÔö¼Ë…öÿZ÷ù~³ÄU³ÿ†ü¾×ûSý“uÍËý¥ü}/삽§îßÿ Áÿè~ÎðœÇóêoÿ —ü#_ê´|}?Ž1ÿïü$?—çý‹þBk»oŸòçÉ q ¸‡øƒêò"y+ö׸ߨø\.ø¾Ï÷_Xú·?ðê{~_ÞòóJÝ®%\ÖÿXeŸKo÷í¸ã#mÿ{õ_­Þÿ»öÞÏþ]s{¼—Ž¿eO‰÷ÿ¼uâÿ„´ÿ‹> øoâÉЮ>(xGKð…üS}ªjzN‡oá;[Áž1Õø}¨ÜøfÊʹ²†æk{ÈêHâ;{{]²üÿ-¥•árœç‡égT2ìF*¾ ¼M\+§eu‰¯Jº¥GNUÓjR§ì›¤éÉJ¤ª\©òO ŒÂrÐͨa°ØZ•êGëzôð’Àº˜­ÑR¢ªT§[’Q†*Š£ ±U)έl{Ø»Ä~ø[ð+Àþøçá¿üñ׊|Qá?ˆ—>Òuéoô/Éâ˜5/ ë¾×RÒæíôo Õ~Ñó}–IÖÒ9.·ï|eGÄŒë0É)âp¹ŽQ†Ês ,EL=*ñì­Ê¥ª3«…„êåtªB’ö²£ÍʫˑJ\Õ°\ùv}€†&´gšcÞg†ÄÎJµ|&5N¥HW¯*‘qÇ5Sˆ­QN4cV´éó%FœèUÜñWì¿ñNñOŠ5Ùóö¤×¾xwÇ:åÿ‹¼Sà{¿…¾ ø§¢jÂ?í­g“øžæÖë–ڌ±›Ë›d¸ïn..Q££óòì÷+Ž—ñ@³Ü>]a…© n#Ч…u'7†–"Œj*‘§ÏÉ…~Î?VŠvG)7Ûˆ½jË PÇÔâj%ÏKðôiСVXy¹F5Õ:jj¼Ïë¡BèóÏê_‡¾ áïƒt/Çâ_øÇûÙá—Å?ñ]­ÜMq5ÕÍþµ­ß÷¼óɲ(’{x„vöÐÃo q'‹™ãÿ´q•1TÃ`£N¡„£= q¥N£ËNÎJ UjI¹Õ«)Ôœœ¤Ù U)Fn­iW­Vr©Rm(Gžnî4©GÜ£FF•*jÑŠ\ÎuêO’øUÿ%·öŠÿá/þ¡÷µûï†òKÒÿ°ŒGþ”;üwè£ëô”( € ( € ( € ( € ( €:üEðî‹7ƒt RÉ´ÍçáF‘`š–ðÞK½BîGÔ´¯õ-oĺ5ܱkz}Þ¥mm¨[ɧéZ]äÀuÀ½[à½ýψ¾iz&¯o« zü>×u9<3m©Á©üCñÇÄ]Pð¾½o§_Á¤jÚ=ÿÄ_éíkydÐêvRi±ËybÚDMqñü]ÂT¸ž†ØŸªbðn~Ê£<jróÂqN.ÍÂ.2R÷5²wiôaëº éÍZëÓccþ_ôo)ÿ‡oÂü…_žÄ&Ìèm‡ÿÁuN¿¯Cþ}¿½ü&¿èÞSÿß„?ù ø„Ùý °ÿø.¨}zóíýè?á0øõÿFòŸøvü!ÿÈTÄ&Ìèm‡ÿÁuCëÐÿŸoïAÿ ‡Ç¯ú7”ÿ÷áþB£þ!6cÿCl?þ ª^‡üûzøL>=Ѽ§þ¿òñ ³úaÿð]Púô?çÛûÐÂañëþå?ðíøCÿ¨ÿˆM˜ÿÐÛÿ‚ê‡×¡ÿ>ßÞƒþ_ôo)ÿ‡oÂü…GüBlÇþ†ØüT>½ùöþôð˜|zÿ£yOü;~ÿä*?âf?ô6ÃÿມõèÏ·÷ ÿ„Ãã×ýÊáÛð‡ÿ!Qÿ›1ÿ¡¶ÿÕ¯Cþ}¿½ü&¿èÞSÿß„?ù ø„Ùý °ÿø.¨}zóíýèåí~2üO½ñޝðþ×à¶™?ŒôFñ>¯áÔøÃá¨Øè> ¼Õ´ý#Q–?°m0Íw¢jUYž=´ª‰wnÓñ ³úaÿð]Púô?çÛûÑÔÂañëþå?ðíøCÿ¨ÿˆM˜ÿÐÛÿ‚ê‡×¡ÿ>ßÞƒþ_ôo)ÿ‡oÂü…GüBlÇþ†ØüT>½ùöþôð˜|zÿ£yOü;~ÿä*?âf?ô6ÃÿມõèÏ·÷ ÿ„Ãã×ýÊáÛð‡ÿ!Qÿ›1ÿ¡¶ÿÕ¯Cþ}¿½ü&¿èÞSÿß„?ù ø„Ùý °ÿø.¨}zóíýè?á0øõÿFòŸøvü!ÿÈTÄ&Ìèm‡ÿÁuCëÐÿŸoïAÿ ‡Ç¯ú7”ÿ÷áþB£þ!6cÿCl?þ ª^‡üûzøL>=Ѽ§þ¿òñ ³úaÿð]Púô?çÛûÐÂañëþå?ðíøCÿ¨ÿˆM˜ÿÐÛÿ‚ê‡×¡ÿ>ßÞ€x·ãëþî/ÙòÎ)åŽKß‹þ†Íð­u-ž‹w/ZYŧ„<]$­½¶½phz̲Ç]+Qž >ðÛä|¥è € ( € (˜ñ¯ŒËVÒ5KK?SÒõ+X/´ýFÂî&‚êÊúÊå«Y¡wŽH¥FGW*À‚E|Óö?þÎY—I‡^ø…ð ‚OÀ·ž ø‡ðbÍF֛뙯üðÎÖ0 ÑÿÒuÍ%a§SOXtý Ûä|£t CñN‹¦x‹ÃZ¾®èÍœ:†“¬i7p_麕‡†êÎòÙÞ9áeèÊÇ¡@× € ( € ã|uà |IÑbðÏ4Õ×<45]/W¿ðýÓ¤k’è·I¨é¶Zõ˜ùuM&-V ×±”ùɧ@— 5¹– €<‡LÒ4[ö’øá¡jšfŸ©hš‡ìåû7é—ú=ý½Þ—{¦Üxÿö²¶¸Óîì' ¸²’Ýš'‚Dddb¥H8 lð„ô_xgFð‡!žÓÃþ´n‡a=Ô÷ÙšLÿÙúE´×.òÿgØZ¬ícwsµ¤no/$Ûä|Ž’€ ( € ( € ( € ( € ( € ( € ( $(,Ä*¨%˜d’O@zù«á€?|s}ñæø|¤Ûê~ø jà˜.|;<ÑEâïŠËpns×~xŸáƵ©xûàUµ›.­{6¯ã߃WQi~ñÍäìPñ„n¥gð'Ä©‚—{•TÒu©FÍb(ngÕ‰°lzÃωø™£M«xr{¸n4ëÇÒ|GáÍfÎ]#Å^×íãŽK¿ø³@ºÅƬ@’Æþ\£ž¡º´–âÒæ ‰€;²ÊWp Ù*¤€Ä.7N23Ž™æ^>ø£aà‹Í3@°ða5µ½ö·ªjž"Õ´­ú$vñý§TÔíZâFh,"¼¹Cy™¦q–ä˜uŠÌñQÂÑrQ‹jR”¥ü°„§'m_,]’mÙ&Õœê>XG™¯ÃïØà?ák|lþÙÒe^ª$ø³àÅÁÖ;gUp:…wç G'ä߉|.¿åö#Oú‡—êÑ¿Ô뮋O1?ájümÿ£uü;^ÿä*_ñø_þ~â?ðž_æS¯Ù}áÿ Wãoý«ÿáÚðÿ!Qÿ/…ÿçî#ÿ åþaõ:ý—Þðµ~6ÿѺ¿þ¯ÿòñø_þ~â?ðž_æS¯Ù}áÿ Wãoý«ÿáÚðÿ!Qÿ/…ÿçî#ÿ åþaõ:ý—ÞyŽ“â?v?¼{ñOÙ鎛â†?üiü-ŽûÀ~*øÛ­ê—4Œ$·ø¦(V‚5A)$¥mëþ"W (§íñm®_«Îé$¬ßÙ³»JÍ¿uÝ%Êä}Nºè•¼Ñéßðµ~6ÿѺ¿þ¯ÿòOüD¾ÿŸ¸ü'—ù‡Ôëö_xÂÕøÛÿFêÿøv¼ÿÈTÄKáùûˆÿÂy˜}N¿e÷‡ü-_¿ôn¯ÿ‡kÁÿü…GüD¾ÿŸ¸ü'—ù‡Ôëö_xÂÕøÛÿFêÿøv¼ÿÈTÄKáùûˆÿÂy˜}N¿e÷Š>-üb¶>u÷ìß®ÜZGÌÐø{âoÃGXuE•–»ªhv3ËþÌú¥¢ÿ·ž*éø“Â³šŒ±5¨§ö¥‡©Ê½yå÷E‡Ô믲´éuúØöøÛBñö†ºî%ÚÅÝÞ—©iº•Æ—­è:Ö'‘©hzæ•v‹6ªZÍ€ñ¸)"#èÏñW…ZY&15¾£¦Is-Ε{i$³­É·•ƒo+~Ö¶EçÁ±ð ]ñVyà?x3ãÖ‡ÄÿKxu mwá¶»àhšÿ‰ü«Çm^7ðqK¨î­nã‚ ‹MBÒÆÛT³Ó¯‚ÁFÁ±õ·‚/ìõÏŽ¿õÛK¨5wðÏÁ=7FÔm¥IíæðáÐ|Qâ]9m&Œ”–Ñï¼S«]£¡!þßœ‡ø³R]É©_Ü… ÒKûÒ©'÷B+äzXhÔõ_‚=Ö¿#;€>CøûxþÊ? â­jƒM`.âÑ5h:}Ž»v±m´û›™¤··¸¹Š7·¶šXþ›ÁÜK‚Ë¥šârš”°4•9T—=T¥©¸Î®%ˆ¥nZ“©J1£RTéÕp©RœeÉW‡ÃÖT*VŠ›©ìS‹ç¦ê]Å%ZÔšœ—-9)¸U“ŒiÊNqOêZù“p  øLL?¿hÛX¾Ky5?…º´¯ڕ߀`Óno ÿÏy,4M&néaþ£¼5œ¥ÂØx·uN¾"1]—´æ²ÿ·¥'ó<Œbµwè¿+GWß¡@P@P@P@P@P@gÄ/è¿ |®xÓ^ûL–-´m…„_hÕ5­Röæ;Cðî‹h7ºî¯¬ÝØi–6ÊAšêþò8ß‚þÖ¼/¢j¾'ñÇÙ§ø¥ñ'ROüCžÖ_´Úi·ïk¦à­ä€dðß…´H­4{FËÛ^jOÜê·%̓cÙh € ( WÆ^ƒÆzÖ‡6¹â¯ •*º·ƒ|E¨xg\µ,0^×QÓäVF¦õp:šü”øßÿ‡²ø£&µ¦þÓß/µT3Ëkÿ ŽøZÏÜymáÕÿ´4[«;wtA¼¥Ó…7ù¬»‰úè{×ìYðÛâÁÛ‰¿ ~$ø“Hñwˆ< að»ÃÖ~#ÑŸP6ú‡†l¼=«Â+ÑjVKksa¡=ŽšbrÓca3—8ü3ÅŸùå?öSÿNžžà©ê¿#îÊü˜î ü¯Óþ+ü~øoñßöÃÿ…Mû1]|uðúüKðέ­ëV_¼+à[Í&ú×à×€·hÖžÕ´‹íKÄ-eSÆtø¤iámâ‰åo¿¡ƒÉ±\²ͳßì_eW<öìUñ~ÕK7¯ÎÛ£(û5NÑ¿6Jú(³dâ\R ãR½l·!§*r”hÆœV~Îr­QÆšIN¤]ÜU%KšrQš¶§À¯‰šÞ£á¯Ú'öüñg…<-á;[øoggað¿Âºü^!×’/ƒV~&¸»¹ø‰â,m#4»¼»zÛI§ÛÜéúu½Ô+,IŸà©eY~MÁy~2¦e‰ÇfPÆÓÅÕƒ¥ö«Ãàð±ÁAN§6O÷øÊ´«NkóÊ2UJT^ Ë9ΰÏ åønÂâ²Úñ¨å,Dy1ÌqÕ%A¡ì!ì(Î>Ò¿;©ûQ­ˆù.Ûþ â/Ãcñ>óöÉøñUiôýK]ý—l?fïøcÃ1é÷×p.³á¯üa»Ð"ÕN·§i²NÖÚÌ­i-Ü*.Úkoõ¿c‡à,%Le,p¶.X\EXáV},× ±4eRICòå5B¦•gW£ EL¨éÆçMGÍ­Š¯Š¡WB¤2¬M*Ujáð59«P«8Qœha±¸˜Ò©R«xÕ­W NÕtåõvþ Ó­>-è?´ÿí—ñJøÌ[EÐ> xKÅðøe¾xaþÓSðwÄÛï†ÚaÖ'’Y¬Ï„/,®®>Ðmåm_ûCË¿Œ$ áñ°x?h`ëeœØøñe„X…‰¨•,e9WŒT’tçõœJwÕÛöT~­õºru«M/^Œa›ñ/Ô¥7CŽÀÑ«:Šrž ¦*®¶SRRƒ¯ŽšÌxKÚQkêTÛ ùΣþ0ý§ü%ð§á—íñã·Š<1âMcà÷ˆ!üK œº¶·©Zj>#ðçˆï/!›N†¢êÁ°“bú˜ì Ê1\…Ê Ëœeô±óÅâ¥Í™7Ï•Q¥EÉB!‹¡<ªƒ¯íjâiãhUÄ[gáà±¼g×Íib§‚˨báZq–.ž[8TÍ15%(Fž?,£ŠÇSÂÓ¥KêØ†°Ô§Rôâ{„LŸ´_ÄoÚá—‹PküaàŸ†×ž·–m1§Ý•ñ§ ó~!éý§þ/ø;]³Ôôããy>Yø_ÄrÅlÞÔ|Eaà]GQ Iz—Fk\iV×÷ÖpÜÛGÜZUêÁ3O’ÿѾiÂÔì#ÿ¥#ÈÆi]ù$}™_~r…P@P@P@P5âßøkÀš,Þ ñ^­¥Ã4©,©=ÍÍíýÜ‚+IÓl¡šóYÖo'+ ®aoswu+¬VðÉ#*kÁ:ñ‹ïo>ßð«ÇÐãµ[/Zñ•׃ ŸXc*Æ"Oh^*Õ5]!š&i•u[[B®ÙbŠSåÐ¥P@ã>!ð.»ã?‹ÖÛ'ɲŸcËý‘,Â^מþ×ëØ¹b­ÉʽŸ²æöùíÍî_”έ?išbs+òû|&]…öv¿/Ô)T¥í9î¯íyù¹yW%­Í;ÝpÖ³n¥üAøÃ­Ùk¯Âÿ>–‰¦Ñ]ôÝCÆ÷vói:¿Ž´}rf¢\k«k©ÙǦJ×—0Ç|×i2í­çœN¶C„Éñ0œñF'ÚåxØUTêà0ï–¤°q²”«S†*+…sª¾©&éQ‚¢ù‡V¤3\uBr¥˜aéSÃâ¤êQÅPÂÆ1ÀÞ“²¥[ :2œe*xŒ4•:”=¬}¼¼›Iý”>:XÏ¥xN÷öÖø¥wð?E–ÆÚÏÀºgƒ|)á‰OáÝË—FÐn¾=h3Ûøˆ•šÚÎÛûkK[›Ë5¸µ nn<ø½ÕÅyLêK2Åp–ÄÞ×ë2­Yà'ˆsJUkå5L>"3¤æ§J¥NYâ$±2mÅÓ— °ÞœðùeOìì, é›„1„&¿y4ë©{%ä°wSú¥5Jšö±¥ïwþ0ý›|C®ü[ñßÄOüX¸ð¿†þ(|&? þ xãÁ– ‡\»Óôoiñ=¿‰n5›kÝ!ô¯øIÌæÆÞ/ô¶µ•f¹ r>ÏáÑÍpñáìvEŠËÖ&uqï1ÁâUiRx*õ!–ÑÄ~æ1p¯ô2èÒ唡{E8ÅΔ[í„Ý fe8Uáé¸N2—´Ž3ígˆŽr¨¥R•U‰Ÿ¶–+ž¤åìèÑGëX­ñƒPøgðöU‡À¿ïu_xe¾Øü·‹CðÞ±w«øß[ºðmÖƒ¥èúf›£Ûj‡FÔõ—°’;Yo&û-½ÍÄ %ØbŒû׫šqGâ±™/ªgŽ>¶g„‡·‚ú­hâ–*jŠ”j<Ü+5n¥HRœ¡‡¥8g O#Âླ‰¤²üŠÄW‚TÛRÃÖjÓ•J2U”+Q´r¥)©'O®ÏöWøs¬ü/øà_ø¬ÜIãFÊãÅÞ?¹½h俸ñ¿‹îæñˆþß4Q¢MuíûY—TPVÉ0 øÏ0ÂãøƒõNYnCƒtW-C gíiFòå†"ª«‰K™ëYêÏ3(…_ª{zЫJ¦)Æq§[—ÛQÃR¥O —áªòÆ ÚarÜ> 7Ê›•){ÍžƒàÞxG\ø“«ÝjúF¥m¼æ—k©%¬àª”¸€\ùR#*²¼L¬ªÊ@ýå:ú( € ( € ( € ( Ÿì?â²ý¡üMý§ûý+à¿„<"ž±n`¶ñ¯ÄXüU/е4%Y)`Þj«¥(âÔ• %U¥EAàÝeQEM©fÜOûo­K ì)eU0*†.•HÇÓX¿¨Î“*˜8B2|Ž2©¸ŠsÆP§:u#,rÌ‹«Ð¤±éÐ̲üÅÕÁã¹éøŸì¹û8üñ×ÀÍ'_ñ_Á¯†š¿ŠuüRûwŒåðfoã‘pŸ|eim©YøÞÒÆ-wLÖ­!вjVz„–m–ÓÅ$²qeÔ#G†ø.8YÏ?õ_…kB®OVwåµzs§ÊãUÖn¬¥¯<ÛuÔ¤N´êg\S,BŽ-SâòÏbhÊ”3.#_ Î¥ S˜¨áq•°´“Âʆ;êÔáŠiýs UšÆaëSQ‡ûUÑÌpÔ¨ÓÆRXz•0²ÅÎT^2\LJÿkÜüXøaá;ßüñ5·Äë> ñÃo‡–ú—‰|aðCQ‡Cñ&µ£Ûøÿâχ|w¯xGR×Ùü-{g>‡.‹á»‰åkù4¹o­ü?y,Ó•BXº”(U©L1yf/G…ŒáúÎ tðt']_0§G *ôg‹¡*UÖ [‚¡˜ÒÃS38¼1uajo˜Ãì*sÔ­ˆÂ˵cZŒ)OêT¯ƒÅƆ.ƒ8Õ­—ýb®*ƒ­>;À¾:øÕðÓÀ´/Äý×áÝׯ߿h]wWð†¥¦ë—>;ñ·‡´Ï‰¾"Õ|c«hž2·ñU–“à»Û+9oa±Ò¯¼9¯ Ù´&i¯¬¢Õ#6ù]ZX|ƒÿ´*Â,U*xIN Áàðø¬ã…†2¬æ§Ά.´ª×ÃBWÔ¨Þž*XŠ¾Î£ÃTÇgùÆÃØdÓ§*Î.Ž&¼8O!©OC–XxÔ…?d±õ*Õ寈¼°Ç í1²ëߴ߃þ=ý 5k]cÁzçÄï?üá¿|EբѼáoíoÙÇÁšýÇ‹¼W;ê {¥iú>u*i°ê:tš…Ô¶vBúÅnšòÚð,= –­H`ëKˆ8²¥z•#ΩR˨哯Sö”½¦"½WG‡‹©N1«ˆUdê:k_›:xœ._œS„êR‡ äòÃÒMBu«cø“‰(áá)(ÕP…U©ÄÊ0¨Ö ˆä÷¹d½ÿö}ý¡-¾'ø¿âÛŸ|$ø¡«xLðljm> ü¼x/]ÐÚžž3‰Âám…ŒèËìク‰Ä_‡¼'B„9gíjCÎ|9ñÿã'Æx~Ãàý§Ãèºïìíà?¯}ñÃþ%ñž©¦ëž,×áøÔâ]/«žb¨Ö†/‘<¾x+S•'¡˜e•ó«)NUs¥N Ú'?dá7z±)BèdÐÌ(TÁãñ¸ÌóަªF¥< l“”a±§û¨Ï¡[Ф©µ†öñö8k†t%…Åðø¹ãoø‹Æ<á%|y«~Ã_ ¼w¤ø7Q–óSÒ®5Ë|_Õ&ðÚÜÚMcq4wS[ÜYÛ\nˆ«Ï²#hÝÖ­„Ê(qv:.´òzYŸ cë¿f§‹ŽO_,ÄcqžÎœeOK,©YQJô勌³©쥿ԱXŸõo'ÄÔ£…Í)ã¸ã*Um9aa˜ákðÞ_F½H'í^ ãiB­jpŸ¶ú«œ)Õö¼µ¬þüa¼qsiáH¬î¾Ú|,øãíÿ"vº¿Ö¾%CVÐôÛKŽ$žÓ ¼¹ˆÚJìÞ ±"h„Mý•p•0˜Ž!Ãâe<Ÿ5†QMBOšXŒ6bó)U‹Ž”•,~NðrR‹|ø¾xÉ{'†-bhäUi'Ny޾;Bpšž¯G ƒ›PQ¨ñlêŽ&Œ êÆxZ\ʃRZŸÿâšñ?Æ…VŸ/†üâ½SðU¨át? xûÃv># CŸùpÓ|Sÿ GØb]±Úi·šnŸ $:tyåýÏÐú€ ð_ø/Æš7î¾(ü2±Ñ0ø@ê6:ˆ/5m?HÔeìL3]èš‚Vgd-*¢]Û´ÇüBlÇþ†ØüT>½ùöþôuð˜|zÿ£yOü;~ÿä*?âf?ô6ÃÿມõèÏ·÷ ÿ„Ãã×ýÊáÛð‡ÿ!Qÿ›1ÿ¡¶ÿÕ¯Cþ}¿½ü&¿èÞSÿß„?ù ø„Ùý °ÿø.¨}zóíýè?á0øõÿFòŸøvü!ÿÈTÄ&Ìèm‡ÿÁuCëÐÿŸoï@<[ñõÿwìùgòÇ%ïÅÿ ÃfŽxVº–ÏE»ž;pp]¡µ¹(%"‘€Rãá6>ë›7ÃÆ7ÕªUK­“”Skµ×ª×¢¿åÛÓÍ‹ð»ÀZŸ„£ñGˆ•£é–ñýªá!’öòãQÔÞÓíâÎÓõ¼‹'¡åxl³'8PRrœ’Rœç'9Í¥µäß*»åŠQ»µÎµY¹½/²ì–ˆæ?g%þÍð6¿àüÿ…ñOâÇ„-b9gЭü}®ë>¶ yk^ˆ÷„{ÆÀ¿ègúô¬®ªèÁ‘€ee!••†U•‡AP¨ € ( € ( € ( ŸþÿÉvý¢ÿî‘ê}@@PÈ~øñ÷ῃÇÃß |uøicáhµÜØê2ü×ï&ÕuæžMgûOÃww·'û:T»¸Öå`-’JÔñ…Z0ŽŽ''ÂdØjx¨SÀa°5ðÕ0ª‚«íù¡‡¡…¥†¥Nª›´UJµ*Ë™M©7„–«uëÖΖwˆ¯QB/ˆ–8¥ˆS§B)ÃÛÕÍçZôU*tcEP£F0”,7øã¿x¿À×Å?Šz´_…šÎ¿¯x0é G‚¾ ÝjZLJ5¯Å'Œ¼icã‹Ý#StMvîK«xGÂÞ_ÙØ\ypZÛ=…Æ*… ”ñRÄÓ¾7”â²mBR£NqñÂÇYQ›¯)V¬°•8δ°Ô*ÎU¡AÕ¥ƒ–Jµä¿u…J–ãðyƒ§YF¼”ð5§‰Ãѧ>Zq(V”aÏ*U1ÂEáêW›­ˆ­WƒÑ?e?év?49¾5è¯á¿ÙÏÄú&¯ðçHÓ~1õmLÒuO \Ù|I¾—â%ãx—Ä-á=RêÖ×WÑcð½¼7·—z…î—©4[ÙvÓÄMæxãVÇPÂb08ˆÒŠÃág‡ÄåÏUàðÑSúgZ8zнLN†”°XlTö°æÄF3Áf¸ ?5 †69„'9εzxŠy”³*TëUrŠÅa9êN5éÎÄש 5®Sо‹þ˾6›Gøðú7Â?‹>>ñïŒükḾ}›ÆÐé¾>ñ5þ½¬x/Â=‡ÆÂ×AÐn­."±½žûÃZÍü¿jÕf²ºÓMí¤zG.+ †áÌ."1ÄÒá©R©IE{5‰«‡ÆÖÌpñÅ):ªXhbçNu(ÓTªV§Ntg_ÙÕ´;±XÉÏÌ07Àã±”0ØwQËÚÆ„pùN)úÎ<´Ü1Ξ­Zug:˜j3–Ø9TÃW«ŽéõÿÙ¡5{ƾ-Ѽk/‡¼Uª|JðWÅO‡Ú•¾€—vžñ‚¾éŸ ¢Óu5õˆÇŒ¼3ªhÖºœ:…’O¢LöšÜ°[]ZÝ[Á¨F𲯂TgNª©Š§ÍñUgV2•,F:§…¥‹ÁÖ¥ “åXhÖ¥^¡8bᇭÈáFtkáRT§…†42|UÂkÚS–[›c³Œ.•IÂj3§_Fœ©NUJ4kSœÜqRTýkÀø›¤ÜëšÄ¯‰zOîµ),£Òt |?¶ø}àÿYY[í‘ìl5x§ÄúÅíÌ“Ius⛫M‘ÚÇg§Ù§’÷TéF$a9U•GRu*N/“ÝŒ#G té(aÒ‚«%_ëX‡ˆ©ZK;£…Ãá%9U„¹£ TérrB.õ&êJnµYÎsnq‹*q¢¨ÓP‹u!V¤½¢óß|ñ¸ñ‡Ö¼U«C¯_kßkQ{|Ô©^¦WS7­V½i)ÖÆVÍêeu«ÖªãB]lºuj8G’¤ñO’RQŸ+ðŸàE¯À¬üK{â½CÅV~ø àï…wVzO‚5iõKëëž2ñ,ºöŸ£hWÚÎ¥¨Þ_'ŠÞ=ÂÎòã}Šù2ÜÉr±G3©Jž3£Z›«G1ŽIJQŒg7åy[ÊZp§JQÄûOm'î¬ÙôÍ"Î[Û¶ iÌP²ÇÒHÉÎþ`þþмû[]þÛ>9ðGŒt߆¾6½Ð%ñü’i÷a¥|ø—«ëÞð<¯¨˜èÖ'áåËé—oPÞ]ø6æÿÄÆ#týMÚÝ[_ZÛ^Ù\Cwgy7V—VÒ¤ö÷V׬°\[Íš"ttu%YXH4b€ ( ™¿j;âÝ—Ã{¯ˆ¿õ'·ø§ðÀ\x£KðåÄ ¡|CÐ-¢xŸÀZî$O·-þŸe%»Á{þŸj¶—6ææVcomò?þþÚ¿kOŠþxn÷á|¾)iþ;ø±â7X–ëUð¯ÃÝáWÃo øóCðŽ¥mknúDڥπüE:k2ˆîø¢ÆÖ Ã5ÃCv–º}¥­…¼V–V6ðZYÚۢŭ­´K ½¼1 QÄˆŠ €:Pš( € ( € ( € (çÿ‡ò]¿h¿û¤_ú‡_P¼]ÝÚiö—7××6ö666ó]Þ^]͵¥¥´m5ÅÍÍÄ̱ÛÛÅ ;¼ŽÊ¨¨YˆšÎµj8j5qа¡‡¡ T©R¤£ téÂ.Sœç&£B)ÊR“QŒSm¤‹§N¥Z”éR§*•jJ0„!)Êrj1ŒcÜ¥&ÒŒRm¶’W<—Á~xÿ]“ÃÕõ¥×އ'‰tÛøǾ_ør)ᵓÄ^»ñ·†t›oø~9®¬wê:Ú•²&£e#J#½·y£:ô²ìÓJŒáW+¡µ¨b)Ô¡ˆÃʬ1^²¥‹ÃóTÂÖ¥8Ö¥JTêÒœ•W)’©EO•XT£”Ö½F¶ì£Nsú¾*“ž·îªÂ´=•YûZ/ÛS礥5á¿ÿiÝ[ÆpXjÿÁ>ðÔ?³G€~8x[…o´‹Qñ‰|}¥kæ{Ý_\º†ÓÃvºo…,¦‰fÝ4o%ÃIs*²$[Ê¥ L׈›§ ¾<9ÉdÛ”³ŒãëC’1”êÔú×-%*KÚIJ4¹kV”dý,nÑÇSÁá¨ç›ñ†ßqV¡ÃÙŽ]…ÂÕ”ýÈAʆ*µLmY¸Ò¼#R+NRõ›ÚoàÅæânOëº-¿…´]?ÄÚΟâχ¼âX|-ª^ǦÙx²ÏÂ.ð†›®êþ{ù»kz~ua‘ʲÜ!†M›{ ª¥:.ðM-üQà?[üJñ^’Öš›I¥x"æMF(µãp–&ÞöúUàx-%¸¸ˆ ° »·3pÕÅPÃà3|άÜpYHQÇTå›öjaeŒ§OÙÆ.¥YOTŠ£ µì×ïƒê§NUq™^_JÒÆg4§[MJ?¿¥OO 9ÆWäŒcˆ«N›ö’‡Ä¥ð{Ç'âÚ[à׆SN“Tñ&®ÑÞøcLñ­Óéø‡â%ð¯„u˜EÆ—â_ˆgÃÞ½ÿ…a¢\Û‹‰c»ñwö$F=;P}Átë³oÙZ”°Ø¼^¿- ˜ T08Š•'a¨âç%á§Œ”–5½èJPöüÐ¥VY¨Ò¯FsÂ…HâpØø]ÔSÃ0ý¶Å$Ö$µK’úÖ&¸\IJg$éb1Z±t*à£Ï‰ö±t©àâê:QxÊÕhàÔªB¤aõš”¹ý†!Ú8jîž”íW‡ÄÒœ'C5O(Î/ëtÝe4SrÄZ’U%ìTÔ#:nn>ÖŸ6ìýñfOŒŸo|vÓhwv ãωº‡}á…¹›LÔü5áøƒÃžÔàg½¼kË›ÍK²¸–XdË,ÎÐÅ:Ä›W¥,&)Äb!8×Åå˜lf"‹©ÉV­7:£ js”_»Œ}¬å¢R›j÷WÙÿiæX<<¯G^…n§îæœð8 ðö‘}ðgâ÷…üNí¦ø¢÷ºAoø–/ˆ>-×/ì<¤ðw†|/¯¦ÞjzeÔrßOSa†wÊ2\e{TÆçÕ]<=;S’›ÄâiC OMׯ‹nŒhTxÚ^Ï ¥O¼>!akIásL~œ”p™^zõj饗eØÊÕ§ˆn 5*u±U¨Ð…Nyc©<.+ Vt«Su½•hσ‹áOxÎ÷Å—àÍSAѼam⟠øËÂ^&ðž¡â›ý;Nðâx›Á'ðõ‡ˆômJ}[O’ÖêûJ‚ÞkyþÖ’›HÞd®WË‚”?|³ õ0¸ocûçWEIÔÂERçkUl,’ÄKÚáÔi·‰ÃûH£ V«ˆ¡ÉS …©Ž¨ªþá,*Xе1q•ogá£&.>Þœ¥JU°¸š“¯‡­N›á_é¾0Ь|E£Ûø‚ÓO¿ûGÙàñG„üUà}qµÌÖ’Ï x×FÒµ44°;Fnì ó¢hç‹|3G#éVŒèJ0›…åMrT§Q%8©ÅIÓ””f”’95R”ïN¤a8Ê+u!QIÂíEÚî2IûªIÁÉ%8µ%iÁÊ Ý)^2K¡¬ŸþÿÉvý¢ÿî‘ê}@@P@P@q¾:ð…¾$è±xgÆšjëž®—«ßø~é‰Ò5Ét[¤ÔtÛ-zÌ|º¦“«ëØÊ|‰äÓ K„šÜËÀC¦iN­ûI|pеM3OÔ´MCörý›ôËýþÎÞïK½Ón<ûY[\i÷vÆÐ\YInÍÁ"221R¤P¶x?Âz/<3£x?ÃÏiáÿZ 7C°žê{¿ìÍ&ìý"Úk—y³ì- Vv±»¹ŠÚÒ·7—’mò ¾GI@P@üý‹ü ðãïÇ_~û.ߊͧ¯†ôXíÌgÁV—³¶³ã>ÕðÙj¾'ŽÆê¢ ¶ÐXCn£jrliP@P@P@P@|ÿðïþK·íÿt‹ÿPëêí>4'‰døCñ:xsJñwŠ¥ðŠáð÷…uË+]OFñ­.‰{–‹©é—̶ڕ•äÌIipËë)ŠBC\Yƒ© +•7R•(Ju(PŽ'B”kÒu±8\4ÜcˆÅáh©â0”[ýî"•(YóYúY<©Ã3ÁN­_aURŒý¬°éTåIKM9áá*ª©^ ÎŒªÇX#ᇖ^"¼ý¤þ xÕ‡í3ãÍ >|MðV¹ãß‹_ 5o‡šO‡¨h÷z Úö³ðÓã—Œ¼wâ_†éq®› (ÃÙa2¬ò»â¼t§FóúÖYŸÇ<ɰ8¥5MQÆ×áÊ« Æá+Æs¡Š¥K JI`¹jùóŽ+-Àcð´+ÃŒá9SÉrlnœ!ˆ–®I˜à%ÂûG%V”¸‹1ÃæÕæ½¢§ƒÂÓn3X#Û|Sáo|5ø½ñëWÔü]ûLøWÂßn|-â/¯À_„ø¿¤x’ÏBøy x7Pð¶°“|ñî§àÿXÞh­¸Õï´m*îÓW¶’Ög–ÛRk_/¬äøì« ¸¼UlÃ5¯S 9Ò¥OO5ös§VŽ2»ÂáhÊ¢ƒÀb)âñ´Vxjx™Ê–òô… fG[(a0øL³‚…^iIàjåØÌdýœ©EÔ¯*.ºxúU©Ð«*µëã©9JT)R:/xq¿fïxW]Ô<ñSøs{û8ü4øU Ý Mñcâ‚u¯‡ºÏ‹õCáOh¿ôrH£¥x’Í—UÒaŸBKŸKm-Õ¹“OžµLTåSˆ0µœ1ìn3£‰¤êrf —SËjÓ«‰Å{(SÅQ­Mb¥WVŒ13̱UéUµ,J‡„jár*ÔyèÓÃÖÏ#^XÒ¤èK5Åá1Ô±p¡N1š¥Yaêá§FŒð´°¹}:”!:“qöÙN×ôï„—ÿð’x/Zøy©j>6këáYGa©é6 ø¯âícKI"·-m,Ri÷¶òÇqg$Ö³G*Ëo4°ºHùÎ †WÃ8_i ÔÀä™nª§+ÆZ4y'KU½“\‰J0|©>H¦’ÓR5óž ÄÓ§ËC…JSµ½¼?³ð0úÅšMN¼¡*•a/ÞR­*”«~ú Á^8Ñü!§xż'ã »†Ÿ¶ÏÆ‹ç„tÝþø“À:Ÿ‹¾$évúï‡+ñ…×h$ñ—Œuáàévž!Óü9¢èúòÀ׺¶‘§‰RÇR¸…$°€]Ï×–Sž“Õ¯S–8Þ0ʳIJ3Ž€Á¼\n"pœ©áþ·UÛ’n!‡ÁP­ˆŒ#Zjô±±)Âïœ_…iÆTÝlVk—WXL¶‚œbñÇêÑ«SS¥Ý«Z[ýšçÄZ2ySÜE,ŸlÌ)"Å)Š©EÖxµIs}F µúrCR­*2ÖÜÜó£R6‡3-梜[©ÂT¨Ò¯5ËF½«B[Þ¿±«ˆä²¼—îhÔŸ3Jï/73Œ_JHPIà($÷À'íXÖ«OJ­z²å¥Bœåfí');E6ì“vI·Ñ6$›i-ÞˆæüãxÿÂÚ|#¨ÿkxgÄÚm¾¯¡ê_d¾°ûnŸt» ¸û§kowm¹yòî ‰Çu¼éΗ²ç\¾Ú•ðÕ;ÒÄQ…z2Ñ»sÒ© ò»J<ܲQ’i:•*ø¬4×-l#„­ù1Jõ0ØŠwWŒ½zU!Í(O—š”dúZ‚B€1…LN"¥•ÛT¨R©Q¨§&£h©I¤öéˆ( €>øwÿ%Ûö‹ÿºEÿ¨uõ}@P@+|døó©èºµçÃß…ÐéwÞ/³Žâêª÷~ø~·°­Åµ£iöÒFþ#ñ¤ÖrCuö‹Hm-®­¯µÑ.,¬õ™â.'Áðý(ÆKëÚªô¨E¥¦Üõ%¯$.¬œ¤î¢šŒœ~Ë„¸3Å¥(Kê™u (ÖÄÊ-ûÛû:1ÓÚT³NJê0‹NrNPŒþN´ð½šëRx¯[¼Ôü]ãYâ’x²ìë!0ÌKOg¦Í"%¿†ô‡v$i:%¶›§§ü³µZüS5â ×8›xÌLÞ4!xQ›jÐOÞq¾’›œ×óÑ9 dœ=N+.ÁÆ5Ò´±-S=w¨×º¥eÍ jÛ×’çK^)ôA@`hZv¯ðûT›Ä_ 5sàZ{‡¼Ô´H£šãá÷Šgr¦aâŸÅq¤·SìPúÆští]p¸¾h·Á7Öäœcšå…*•eŽÁGGF¬›”V‹÷UåT’Q|ÔÒºQMÝ|'ø’g°©V噋Ö5èEF2–¯÷ÔU¡5&Û”ÒVìÜÚ\¯îïƒÿ´ÿŠ7ÖWºp𷎼<-×Äþ–ýuoÈ?c×4KìöÇ^ð­ë$«m¨‹[gÛÜZÝ[Û^[Moí™VmƒÎ0Æ`ªsSzJ.Êtæ·…H¦ùd½Zi©E¸´ßó¦w‘æ?Ž©€Ì)rT½ ÆîX?†¥)4¹ ím”¢ÓŒÔgE{5zGP@P@P@P@PÏþ ÿ‰wíñÏM¹ýÜúç„þx¿M ò‹½4[xÏ—fÜž&k]GÄNªKD5+3 Qu è ùûöžñoˆüðƒT¿ð®­/‡5mcżÿ LXË?„ôÿ|Aðǃ5oÚ®¥›U¾Óô½rî{i.X£¸H$’)iÑŽ73ȲʵeC šcéáëÊ•:²¥5ñÃR« F¥¸Ùaã§Z“öô¥‰S áZ4çŠ2ú¾8Ç*Q¯[+ÊómRŒe VÃajT§:›P©G %õ¼E)>Z¸|=Zm>nWòÆ=2çötø«ÿ o€üSã_xsöEý¥ü]¢øoâ'޼Mñ:ãOñ‡.>ÜG¯E¬xû^Ôµ¸´ûç·±[3ûF=5NŠÒYÛÛOux÷1<^".1§†thT•§F¯%<$1¹¶; '*•-Jto3]%ìì|áí L:n«{i5’Å —Ø7ΩP¬øbð™LrìÆUå:¸¼/<i,F"´±ãˆÁc¡W*.­z»¹a}ïžÂÖ©‹Ërüw?Ö3ZÕ°xi‡J–¶8ýv—ÕܨR§B:‘Äàg[§õXáÛpÄâ#?ø7â_ø›Dø%ð·þ/Ž~,ð/…ÿe¿‡¾7‡Cøñ7à µ«Ïø«Ä-П]ñ‰/¾1ü=Öõ-NÓü:–ÖºfŸ©\Ø}«Q¸ŸRµ–TÓžÞÜ%‰¥­QTŒð˜.ÀajS© 4kpî^¼¨óµ‡VÓþ:x“^–ËÆúW†þ#øïCøoâ? i_ ´Ïxãà÷Š‹i:ÄÞñe®³®'…õˆMíÞ‹‰%ŽÎk«I®Œicëâq8‡N8¼»%Àb+`ðò«J‡ö¦/WŒÆEAPçÃRŽÛÑÂr}OW8£NQ«S‡pó«Gê˜*ŸU…U…Åg´°xjÕýZÔrå–âs(á§*“­7Z®&„°”±r¾.®-ÄάãW*²á¬uí{Â~!øÏð¢ëâOÆÿˆvûJx3Àþ ð·†üO&¡ñCZð¬Ÿô¯Þü3ðÿÄOxóÃ àˆ¬-๿Ô+Ô.­æ±â }Qž1¤ê—‹¢éz’q8µJ°¯ˆ‡âòº•ðê¥*uhÑÅÓšt¤á‡©9áç^¦ ˜O…Ç,=*\ÐÃÕö±cÿfÄñf”],=NÇcÕ*“Z‘ª²œñB¤¢Ý_ªÃO…ÄWËã^¶­:Õ#UT¡Š«Eúν}ãß|UøÝà«O þÔ Ò~Kàß|1»ø9ñ£Á¾‹ÃÞ|;ðïŠ%ñWŒ×Æß¼/©üMñ%î©«@ë'Œl3ðSÇŽ<puÌœÚÛkV¬Ð¾³à½fáU¿âž×ìíÖÎãzȶó-–£}¯Kµx¾ƒ†³Ê¹eJ¿4¾©U¨bi­¥Nÿ/YÒ¿4:üPM)³åx¿†èñ.QW ÉŽ L%Fµ…T¾mÕ:ÉrM|+Ý›MÓ‰úEà/è¿|áŸxuçmÅZ=–±b—q/mRê ÒØjá›ìº•¥À–ÖæÄÅ=´±’Jþ‰„£8ÆpiÂI8µµšºi­-nÇòtá*S•9ÅÆtÛŒ¢Õšqvi§ªi«4uÕD…P@P@P@P@y·¼sâ{ Ğׄ¼á¨ ø‘´äÕìZÏVŠõ x›F76¯®xKRk=:k›(ol.ãI°ºµ»¶¹³Ž@mò ¾Bx#]ø¡{y¦üBø ødYÚ«ÛøƒÂþ8+е‹‘*Æbµ´Ô<;¢jºk4-ç¹²t•áÌ&˜²ñ‡´/èz§†|O£éºÿ‡µ»)ôÝ_EÕìà¿Ó5+ ”1Ïi{grð:œu#¡€FuiB´9't£(N2Œ¥NtêSœjR«J¤jR­F¤aVjr…Z5a ”çÆ2ZÑ­SR5iK–qºÕ)EÆIÆpœ$œgNpr…JsŒ¡R”'FM?&ðŸìãð‡Áž$Æ_‡õ­OÅqxwTðzøÆ¾>ø‡ñYo ëi²Þø^]Gâ婦ðð›J¶’ :GkkWšõíc…µ+ÓuÑ:Žt1øj‘§:¤cd%Jœ¾¶ æâñ-ÁºÓ´å:ŽS•.Z2“¥B9Fôã‚9JœrÊ‘­„Œ%(,-HÓ©IK¢Ò£xT’”iòÆn4§%)Ñ£(ýœ>ø7_Ò*ñN£áX©°‡þ½/Kû5„’éöÞM”Ò@ñ')Ò¯J¬ybpòÂU¯Uº¸Éá§Æ­ލåöUÕ:O]G:z•ÕJ˜z2„ΚååP¥õ…Šti¥Kñ U'¯K’ƒ•9Õ«:W¦Õ)ÍΚŒµ ŸÙËá ú‚ü?k k~¶øw¤?‡¼ªx;Çÿ< âÝÃÒˆþÑáåñ׃¼W¦xŽû@žH-fŸM¼Õn-gžÆÒâhž{H$ˆn^ÓÚ©Ê2ú¶% J©‡ÁÂ4ð”ëB0­õhÆÔ'Z3©IÔ¯(J2ÄWu6­VuåZU¹jʾ7˜ÉÊn8ÌeJµqUé7Ü:ó¯SÚÆ³§(òC“’•(Âøð8|!ð÷Áÿ þü<»ðï‚5]GQ‡GÖ~!|QøCâý3R½´™žøßðÞÛZñ6“â[™îµTÖå¹°½ºñ zýÛßj‘8¸]R%*²ÆQ«Ë 4pØ9a0ñ¿¨¬-&éEa!‡ÃB8iår¡E–Â|= Ôp•áý^”)¸ª?VÆÓœ§:øÌU,UWZ1ÅGR¤åV¬ëKÚÓÆB«£:Õ*³§Fl¤¡‰Uh`|,ý¼¡ø[ÅV¾;Ñ ´Ö|cñ./Š_eð'Ä/‰)yà~ÃÃö~Óî4‹ßÚ:õßÜév··:¿‰îfÓ/5kŸj«s‘;¬ÚFpøL§ AÉO+úåHÖ§ª{ù„=Ž"„(Ы(ÇO > ØÊu!Šxe­NzÊŽW^¾:¾&0ŠÆQÂaeOžx—:9~"x¬5jõ«ÅJx§Šœñ”!J8V˨º°Á¼^+Ómÿe϶š7ô ÝE¦|I]O¢øÇÇFóÄz¯†n×PÒØá«ÉUjU'ˆÄJ®œóöÒÄJN­ià«eÕ'W÷²­¯ Ô§†®êóýbœ(â+aè*ÞÑápÓú¶Ò¡SŽŠg_…^1š­gOñ|‚ør×Â:Ž­áÏŠŸ¼­ø£Ã–1<ZW5Ïø×L¿ø‡¼s]ˆ›Ä×:´‘Jý‘ÃjFâ§ÉR¦.u(Ò©KQUÄágF”ðê({6êåÒƒÀMN.¬e†q«†…,5U<=*Tá4¥:Á*u'åÊQÃVsœ±4c)Æ£Œ1Ro£ía©:­F¯5XÚ¤ç)?^ýþëßÙ<=«xOû ÖÞ°ÿ…aãü 'Âv,í¦øcP? üOáïíŸØ4·&ËOÔ>Õodo¯ ¬p›Ë9Týí|]zíâ%t劅gí¨âeJ3§NXŒ=^zÜiNtoVœ› ý„›¤”¡'…¡…ÃÐýÔ0RœðòI{j3«(ά©buàëT„*Ö娽µhBµ^z°Œ×¬èš.‘á­Jð÷‡ôÛ-Bдë-#FÒ4Ûh¬ôý/KÓ­ã´°Óìm UŽÚÒÞÖ¢Ž$Pª‘¨¶Äb+âëÖÅbjʶ"¼åR¤äï)ÎmÊRo»m³ 4ia©BòS¦´WmîÛr”›”¥)7)ÎMÊrnRnM·åZþ¥ñ¿ZÖuxSÃðF‚—ø™â=}|I¨›«›¿|:Ò¬;½EÈ–8ε®iðÚ“ Ä–ÚŠ¬–/‰©Þx#ÁºG€|5aá®ç·´{Ë»ÍGR™nu}sYÕon5MwÄ:ÕÚEÞkZ¦¯y{}u2Ǽ÷rHÓj!·È6ùeP@ž?µµÏÚ=tɘ>Ÿðçàþ>”ƒ…‡Zø£âÏÿÂHνuÒ~x@Fäf4¾¸T \Jó±S†+ÁÅÚj•jÉu½Âù~öNÝÒ}û7ƒø:sÅç8ùG÷˜jT(AôµyTœôþeì ¯½¤ÖÍœÅ~F~î|ãðÿ^øÙñÃiâ«O|,ÐmnõŸØZéW ¼[¬Ü[[è>%Õ´Lúœ_4仚XôÕ•™,­Ô4¥Bar}üM £°4«aq˜ŠÕðv.s†2sãp8|\£ rÀV”c Vpê͵Û»±òYv3?Í^gWŒËðt0y¦k€§N¦ˆ©ìòì„çV9ž2HÐS’F.M%esÓ.~!ø@ÖôkÚ¥ÅÿïtÝ&ökxCÅwÑËo¨]\éÛ­i¥ZëAð÷ö¥ÌrÜßß¼Ku¼»_´C$ü1ÀTÅRÆãðt•· :ªSÄbpñö\”½¼hέO«F®"T]éB(Ï(TXz2•9½LÊ–\²ü.gˆUó\eË&'ZT½œkÖ§…¤ñ•¨áéÊ­.yT«R}­8Ô¬Üâå™añ¯á¶£áÝKÅÖšåñðÆ—„®Üx_ŶZf£.§1µ²°ðåÕî…x¯X{õûÓtSyë%Œ%Û¬-­\3¡_ …©‡ŠÅc*{:T#Z„ë·Ë©ÎŒ*Ê¥*2¥%Zб… ÐR¯ ’£ Î3ý½•*ygŠqÃdê¯Ö±£^8jr¡SØÕ¥L©*«Âºú»ÃЩR»Äµ‡TÝf©» ñ‡á×ö·â+zm+NðÍÞ—câ8uí Ä~Ö¼?>·ski£kÃZî‘i¬iV×’Þ[´761C$LÓ¬†ÞD‡“æ*¶N‚¯<ÂUa†xz´qëÔ ¥*´©U¡R¥)W¦£iPSöªR§Nj´”ê–y•Õ¥Žªñ ®ŠÄb£Š£_V†Ƥ£‰©GJXᤨ×PÄr{ˈ„')áëF+ñJòÿâGÃo èÚuÄ~ñ¯…~ ëw—"ðÇŠ<3â;{ïßxnÒÆ´ßA¦Üéöó ZõÝo4ÒÓ$vòÀën›¢žSa3ꘚúÎU ¶t–‡¯JKV´*s΄«BN…?v#*U¡Us.Hð×Ï',w RÀÑ›ÁgU³JX‰â0¸¬=JSÂPÄa½”kÆ„£í¥:¾õJsXS~Å®IÈöºñ¤=Ãö;ÔeƒFø»à¦p,|ñkP¹Ð-ÆÙtoø_Âÿ¯×ý×ñψüm"0¨èƒî?¡x;GîÖ\¹ö´šxJ‘Z]«WŒß{GÜ]“’îc×ågí§Â ¼9ðSKðÃZ|Hø¨øÉ|IãIõ[ýKö`ñç‹.îã»ñŽ»w¦ÎÞ!´øg§ésY4rÇw2ˆÊ(#nÑö˜ŒFo:Y_ö^s>žU”SöQÍðØUNµ,³ O Pž.”©Î8ˆÕU©Å¹óK[Ýþm—a2J5s¿íΞ+W;Ï+F­L‹u0Õ³\]\$㉧¯ ”冕'K–¤”i¸Å%k/}ð푹øÃuâ-7CÔì<5sðWÂn‘syáÍWÃðÛ¼>*ñUÉÑ~Ūiö“iwÐYKbòi³Cð#ÃæB€­xXÇRu…Äb![S5Ud£^ž"U¿á>q•hÔ¥R¤kÅÔ“‹­ N.m®g&}Nfy|x|,̨SO W xœ¡R èÕ¥JXtáB~Ê”¡ “p‹„.¼ÇHðlj4Ÿ‚_uðþ¾× µíÅ>(ð¦•sÿ %Æ›og¯iÚŠÛè2ùWÚŒšÄZ§Ø).§þÏtµ†[·†9=šø¼,¸›'ˆ¤èã²ù`iâù©Q­_/¡JIÎ |´ÕH<5Y­(¬åQÆ”*m|&)pö+Ùa*N¶ <­™¼4b£[‡Ãq|mHÑ„Ü#R¥L?û^Kë3§JyªÕ¥|¿içõˆ^4м%âtÐ/ô¯‚>ÓbÕ¼/¯hš÷ˆî¼;ñ\x_ÔÂzÕ…¾¯m£éšv¦±››ý>ÔHòHƒÛBg’ò‰ÒÊžI…Åc(ûygU±Ò:ôjÑÂPŽ[õHÔ©ˆ¥Rt#SV?j9B.ªŒªS‰Í›Æ¦s,ëƒËñW¡Ã8ü¹T¯…Äaëã1Xª•kG G ˆ¥OR–ŒÕWES©[1«:XˆÒú[Ñ…×ÅŸ‡Úæ%ÿ‰G„þ!Y4ræ3W»ðSC»W¶Ó$ÒtÇé·xŠöúÖæ}øµ†á#¹koYRËsÚ:)b¿³’¼éAòÑ«‹”’Œçµ}éÓ¼(Bª…½¥gM*NO¥ ˜Ü…µ'<>'V R­R1ÔªQ¨§Rœ%KäêÒörÄÊ’«ÉR Njp=:¼³Ô=‡ö@µóõ_Ú^„R|Iðç… “‘Âøsáƒ5;‰!o»"ǨxªöÑÙIÛ5ŒÑ6÷ΣìxoìÓ­:ó³ÿ¯ÓŒtìã×tïÔþ^ñ*¿¶âüÂ)§ÃRMyP§9-:ÆS”_fšè}©_^|P@P@P@P@P@P@P@P@P@|ûYxFæ=;ÂôÈi>¾¹oã(¡V7|/ñ<GÄ÷ÑÆƒ÷Í êú'†¼A&ì²éú6²°+Op‰'ÍqfQ,ã&¯‡£lM«Ñ]çM4ãë89Â7²Ri·d}g°áþ ÃbkË—ˆO ˆvøiÔk–oÊH¤¬›äŒ’Wgƒ#¤ˆ’Dêñº«ÆèÁ‘Ñ€dte$2• ‚ñøðêïágÂß øSU–ÚëÄ„j^!ñå£4–·~2ñf©yâ_=¤Ò"I6³ª]ÚÙ™Ylí-cÚ‹Eþ—Áá©à°¸l%%jxZp¥HEE_m]®ßVãñ•qøÜ^:¿ñ±uªV¶æ©'&’ÖÉ^ÉtVG¯×AÈP@P@P@P@P@P@P@P@P@ xÒTx¥D’9£’7Pèèà«££IA€?;þ'|,¿ø%5Æ«áý.ÿTø2Á®4ØdÔ/þåäy쮬!æçá¬HPÚÜÛGpúK$7ImÆùpdñ5*fyE4ëJò¯‡Z{GÖ¥%·´z¹ÂëÞQýãj²ð'ˆTðT¨ä¹íV°ð´0¸§wìc´h×{û(è©Í'ì•¡/Ý$éòÖ·V×¶Ö÷–W]ÙÝÃÍ­Õ¬±Ïmso:,ÏoXAJRè™ôoÁ/‚º´Ú®Ÿñ3âv”Ú^§¦Ê÷ðÔÖ·2xQ¥¶šÒ_x™ìgžÒãÆw·W0Am÷6úU´îY/n¦k?ܸ[…©d4jî5³*ÊÓœnãN?gNé;]')Y94´I$6q¯ÖâjñÃaTðùFJTéJÊuf“^ÖªM¤ÒmB µÞ­ÊMý_^|P@P@P@P@P@P@P@P@P@P@-xÏöPðF«wy®|:Õ5O„#¾¸šòôøRK¿ë7—òÜ\ëŸu$}'í3Ï$³Ï¢ R¹˜†¹¿•AüLÓ‡²œá¶á#*©YV‡¹U[EïÆÎItŒù£åsè²N+Ïx}¥—c§ Ýáê~òƒÖï÷sº„ŸYÓäŸNkhx¦¡ð'ö‘Ð¥òl¡øAñÍpT‡_ñ_à L°ànð½ç‡¼cj# ng$ܤ…XœËñXŸ (9ßšNŒÙ­F5_þ ÒZƒæ~‹ƒñ‡ j8ü–•z‹íáëÊŒ|¿wRßÏÚ/Nرü6ý¤¦q|ðí³ââÿ⾑Ú ;ä°Ð/n@`0»m,WvÅ%—†>bù­,ÒŒcÝR›~Z9EäÚyž”¼aÀ(û™-yMZÊUéÆ>~ò„š·Ow_#©Ò?g?ž `|K⿆ ¬‹){ Zëÿõé ?ï®Úø?MÑopA&M^…J²(”0•}l†ù}&ž;[â×»N1¡5%z³~±œ_#ÂÌ<]Ík' ·-¡€M5ÍVrÄÔO£•kÒTæºyŸHü5ýžþ|2¿OÙZê^)ñÇÙåµ—â¯W]ñX†áv]Á¥8··Ó¼%ap¡DÖÓ´{9J’ÝŸ,~ë–à2ÊJ† O MZü‹Þ•´Nsw”䖜ӓ~g湞o™çþ±™ãjâêkny{°OuNš´)Æêü´ãß[á]ÇšP@P@P@P@P@P@P@P@P@P@P@P@P@P@PÿÙdisable_action.jpg000066400000000000000000001276031160020716200352520ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.errorhandlingÿØÿàJFIF``ÿþLEAD Technologies Inc. V1.01ÿÛ„ÿÄ¢  }!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÀßþÿÚ ?ýpø¿ñâ§„¼qà x+Jð èÞ7³×í-¼Cã[ÛÆ:5¸Õáð¤Vúcȹ¼ðŶ¹©ÛK#Ȳ§‡5$a ûåÅâ~©KÚû7R1i>V“WÑ=z^ËæŽ'÷Ä?ÖZô SÿˆÂKûPÏ·ÀOûïâÛ´çÄþø‡úËCþªàQøIjùöø ÿ}üB£ûvüøŸßÿYhÐ5Oü !ÿ /íAÿ>ß?￈TnÑÿŸûâë-ú©ÿD?á%ý¨?çÛà'ý÷ñ íÚ?óâ|Cýe¡ÿ@Õ?ð(‡ü$¿µüû|ÿ¾þ!Qý»Gþ|O´?è§þÿ„—ö ÿŸo€Ÿ÷ßÄ*?·hÿωýñõ–‡ýTÿÀ¢ð’þÔóíðþûø…Göíùñ?¾!þ²Ðÿ jŸøCþ_Úƒþ}¾ß¨þÝ£ÿ>'÷Ä?ÖZô SÿˆÂKûPÏ·ÀOûïâÛ´çÄþø‡úËCþªàQ:?‚_~%xßXø‘aãm+Á1é^ Ö4Ÿ i¾ ð]Ƽm5_­„š—Šô¿³k‘–š "ï[µìì7³êvL‚m.Zõpµþ³F5½›¤¥ð¦õ²Ñ=;ôòשíàñ?[¡ þÉÑŒïʤÕì´OM¯ÓÊÏ©ôtA@P@P@P@P@yñKÀiñÁ:¯†¢¾þÇÖCYëñ ÃçÍáŸhWQj¾×âˆ:4Ég¬ZÚ´öÂD[»Vº³”ù7R‰Â5!*sWŒ“My=©NiΔÕá8¸µäÕ6øwâ÷ñ¯…lu{Ûì]~Ú[½ÅÞi|ù|5ã âM7ĺÊULñZê¶÷ ’ˆ·V¯mwò®£'áq4%…­RŒ¾ËÑ÷Ù5÷;®‡æ¸¼4ðxŠ˜yý‡£ÚñÞ2ù¯¹Ýt;ŠÀç ùããÿ޼Uà‹ï€pøcTþËÆ¿´‚¼âeû{ý§á}[DñeÞ¡¥çP´œÙù·e‹ý¦ÐÁpžFeWpý™M*xœÝakÇž‡ö^u‰å»_¾Áàe[>hµ/ÝÔJ\·äžÓŒ£¡Ù TÞOħßàhås¡+¿rXŽ"ÉpŸ-ùeÏ„Åâ)ZjJ>Óž 5! ÆÄÿÛöoø3­ê¾ø•ñ?NðψtYthµ ô_ꚪ O¸Õ4Ë‹k B¼›P°k;g2ÞZ$öö²I7RÃ5Ôˆ\bo UB­Z2jË’­P©8Îír{˜šNœ§Ëß¼T\åBº§µ,Ÿ2­NZXVéV£õŠss§Η·©†|’”â¥5Z•E*)ºÑ„}«‚¤ã7×kÿ´7Á_ è ñV»ñB±ðÇÄ [Rð‡ˆsys¡ë:uâmNqªÙÚËmb!Ñì®d y-»I,bÖ%{·XÄЫƒ¯ŒÃb)¸WÀa¥‹«M.y{âpXHΊ‡7Ö\Fc¥‡§‡öµq/NXxU…ä¹°xÑ[ú_eæÑÙ—á%ÅS ®£¼Úû0[¿+éæÑì¿|¦|9ðg‡ü¤Ëqwm¡ÙyWéFÔµÍZæioµÏêÒFª³k:¾µu©ÞJ .u ßvÜÆ*PŠåŒRI.‰h—Èý18ÆJ1ŠI%¢Ih’^GeL  € ( € ( € ( € ( €>^ñ¥—ü+O‹V+„y øÏu§øgÅ ¿-¾ñWNÓ¾ÉàïMü0ÅâoéÑxbæg`>ÝáïÛE—Q™Ï‰œá=¥%ˆ‚÷èi/8ö¯_G#çxƒí¨,U5ûÌ:´­»§ÿÚ=|““=6¾XøÀ ’ÿjŸù þË?öuß?õñÝzüãÿbN#ÿÕdBŸü“üWÿ`ù/þµÜ8Røg¡è×µwíg©]i–7Wòxoà††÷W6ÑO)Ñ®ü'­\^i›¥VÛcq4p¼ÐŒ,ÆÞ07“Î$”¸?A¯ÝbsÜÝVŽÊª§•dѦªZÎ^ÉW®©Ý¿gíªò[ÚO™æUªÃÂNp–&«RŒ£îÊ”ê繇´”$­$äðÔú:qq³½þÒ5o ø+á‡üûXñW†o¼Kàÿ|Nøßyy¥iú¾*¸Ñô½=Ÿˆ£ÑV9îo-|.-mõÇû,WPÁ ¼Ö±Kq Q¿·Oÿ¶ðøìMaZ|‡©,l®–µZ<Vr§é¬C¨ðnªJ'ŠU*ʕԩ[„«ˆ¡â&S^+§Jž”cYO1Ͱt ¹)sb¹¥BËN¬êªR´j3Ûtßxwö ø³ñ_âgÀ/SÕ<ìÁã…z÷Ä |=¬ø_Kø‰ñÄW6WžðÖŸ¿§XÝkž°²¾ÝÉoºÔkÐdCsKäf9~/¼[O‡ösÎjåõp8XÊœêâg—á±ñÅãáNœäãƾ,¤êr~ÇŸ ü)aâ«ü=øÅû?èío¼/¯hÚÃÖ³è“h:Ö¯¬é¶–·ºÕæ«it–¶zt—R˜l/&¸ÿf(ÿQ^ŠÆqŒ³Ú#,§0£Ä˜œ#š beˆÈ±õ£Bœc7)J–»«^¬ðÐp„Uiýg*žËêäÜ?Äù~5òbéá(S§IZU%FC—%‹©ÊQ¡FJ”"£Rj·µ­ p¥5O:T~Í2ðõ—ÆÏÚ×á5åÜÖž?O:§ÄµÐn4ýB&›ÁéÚ^»ûZ‹)¡šî-¢¸3’9 ~[†¯…9Öá\—J7¥–WÎ0x‡t:øž#ϱØxò·y*¸iªŠQMFÖŸ+”9º8††i•â%¨fW5MáVX .†.1’ÒôkTTä¯8ÕŒ9¥B²§öåyç–ç ì¿áaüD×þ)\7Âþ}_áÏÃoš ÍVÞìÚüNñÄRE—V³‡Â–R`&Õõí ïKñZÛÃãïj³ø/ÇöÖ±{Sâ].ÚÒåu‹ rÌ`ѵíÿHñŸwd±ñ ¤r:9~†xLDé}Šû¯o»gæÎ3ÀâªQû7Þoš³‹óLôjä8‚€ ò_ü.ÿ„ÏâÁŸÿnÿfÿ¢׼[­ÿdÿf}³þøJ|ªøCìßnþЃû'ì¿Úkó>ÏyæùNÈ÷ù©¾·Õ1Úü¼ÿ\Êño-ùy>±˜e8ÿm{>nOì¿eìíooÏí#ì¹*t¼Eò¬nYÉo­â²üOµ¿Áõ •jrr[Þö¾ÖÜÜñäå¿,ïeëUÌP@_ñ?XÖ–ËDð/ƒîÞËÇ_5Cáo_ªòøoN[y/¼]ã†W ˆ¾ðÄ…å·œ¦õGÑô÷!µ$Ï~]…úÖ"1k÷týéú-£ÿo==.ú–U‚úî.’ýÍ/~§¢Ú?öóÓ½®ÖÇÐÞðÖ‹àÏ hðåšiÚ†t};BѬQ™Å®›¥ZEeg’B^gX!MÒ;3»nw%˜“ö«M6±úVÓkÔP@P@P@P@P@ó/Å‹/øWÞ<ð÷ÅÛQäøsÄCJøsñUl‚Ö ‹Ù—á׎çÇʧKñ£6{)PM‡Œ º¸™mü;W•›a=¾ÚA~ò…仸ý¥÷j¼Õ–牞`¾³…ö°_¾Ã^K»‡Ûܹ–îêËs©ñ?ˆôxo^ñgˆ.ÖÃBðΩkÚÅ댭®™¤ÙÍ}{>ÑË·‚BrHrkâ±£†£:²Œ¦ •¡Í9ɵS§®j•&ãFêò’WW>?ƒ­Æap8d|]XQ§wh©NJ)ɤùcÞR³åŠo¡ð{þÛ?´¿iÞ<ñ_ìŸã ü;ñ†¹á +á·Šõøzùõ«_x–ÃIÓo|máýL»Ô~¼š-ðÔ [è¯-n.R-8^Ç%å¬÷CG'O3Àd¸Œm<>iŠÄS¡VŠŒ§ 7‹uã ¯ÙÆ®&„œ/„š¡YÓŽ*rTç„©IíS –ÀfQÇ`ð^*¤Õ'NNx|<êÒ8¹ÉUÂâ+S•ãiJp‡´ÂÖT§J½éýoá_‰ßð“|Pø±ðßûì?ð«íü ?öÏö—Ú·?á5ѯµ}¿ÙßÙñf}‹ì^V~Õwçy»ñÝ­ã(ß*©™ÞÞÏÁ{/ûÂà1>ן§´ú÷'''¹ì¹¹åÏË\U«TËiósÿh`~»{[Ùÿ·c0^Ê×|ßîžÓŸÝþ'''¹Ï/Úæî÷á¯ÃxKá&»ãoŠ?uiþøK ø‡O‹Í‹Á:åþ“®kž ñ¶­ageáÏ [Cii$º…Å“ˆçÕí-„n¬óÇÒ°•'_ B‹RU2¬¿7ÄTŸîéapøÜ.É)Ú\õT±.ŽãÆT¤ãe)F¡ý™JŽ#;Ž3&%Ì«åj»§:•18˜T¯N„(áàÜ›¨°ó¯]s¸ápЫZsŸ"Œôü#ûNø–{_ˆzÅ‚ºßŠžøw¬üR³ð6¡âýÅÚŒ<¤Çq—Þñï†íÞÒk‹}J[=BÙìD–-«X¸"WXsÌ¡‡ÁåX¼×ŠŽa¶Téc(¸OV…Zñ­S í5%S ЧB²£‰§xû|6/8BTc*«•ʶi“àUuõ<óõl62”¢¥a¡VéËÙªX˜ºò©O í%:¸jXRŒdÔ;[ã¿ö_Ãÿ~:ÿ„WÏÿ…Ñâo…ÞþËþÜò¿áÿ…“`/~ÙößìwþØþÎÎÏ+ìö?iûÛàé]¸œ·êÜG[‡ý·7°žmoÉkÿeౘ»û.gooõOgohý—´çýç',¼Œ#úÖS˜f–öPÃRÄ{-ùý®? äçÓ——ë^×›’Wö|œ«›ž>câoÚƒâ•ïŠüQ¤| ý˜üQñ¯Â^Öï5ý+Áz_ˆášçÆçL"[Y¥¶kUû}´¶Š 4¼˜:TjahæúòÀåø¥9Д(ω«F•IÓ«^HrIÓ—%ð’SkïÆ.§${U²º4pµ3*4óyR¥Wê³HÑ£õšP«„§ŠÆ(Êž¥HN5+ÃÙÍáhT£V|ί³ÒŸ >#øsâÏ€ü;ñÂßÚè¾!´–t³ÖmŸ¬é¶Wwn¯¡ë–YVËYÓ5k;ë ¸VY‘'²”G,ˆG¬fX*ê—¶¥ˆ§:tkѯBNt1lMb0Øšj.TkЩN­7(Æ\³Jp„“ŠñåÓ­‰ÃU§:ðuêáêÓ© Â¥¸;ÂV’ŒÒU)¶—=)Ó¨—,Ðß‚'ƺ׈>:^®û[7„¾#Œ¥¿Ã=6üÜ\x¦Ð°ù[Æúô « P…¸Ñ´ 1U–)7}FY„ú®<ÊÕj{Óî»GþÝ[ùÜý'Á}K ejÕ­9÷Z{°ÿ·Vëùœ­¹ô¥z'ªP@P@P@P@P@â/èÞ+Ð5¿ øŠÂ S@ñ“¨hzÖ™rÁ¥j–’ØßÙͱ•„rÚÏ*¬¬7eH ñ”ž¿øð³â×ìåã­fèø¯GÐ5†ºÇ‰&E’÷\ðïˆô9ÓÀßü¥ò–îMSCž¾òÄpkG×ì¢m¶E«àó¼ JÃòÆQ©G‡sOÙª¸zЯN3¶¼Š­8©¨ëìÞš³ãŸ.Aža±NµÂ)óºi¸óÑštëÑŒ¾Ì½œçÉ]ÇšÜøŸã^½ûYƒºG€~)|$ð/…<5à¯|°ñÅ'⧈­>$Ç¥üJð†›§ÿÂàk]2ßRð´×šömõÄÚ쑬VÖ×Ån&¸„[û¸Ù~;Šò ÕÔ©†¯ŠÎa8`9¦±aˆ”ê¼De*K ƼéÓæž%ºØ8JRTñR8°Ø<,ϰ9n2¦>1áÜåC:Kðøz9|ä©â)Ë›ÛbêÑÿe› ¡†ŒÖ' ©G J·Ñ+пi‡´?Žü_ð“ៅþ$ø?ãg‡< ¦êÞ½ã½?Â|,ñ/ƒ-µMuoK–Î}KÅz¶•½ÓYhè÷29bYmŸc\xX8Ò«•æy>+õñ،à Š'^ñÅåø\=|;¢ªGŸªåðtÞ„Uh*µ¦¥VxUˆ©—WÃäØ©Ê£ÄåXZØ:¸Jk’x¸KSJPÄOšŽ0XšÐstêÎîstgìè·ÌÞ'ý‹|oâß³ô¾0øY¡|Yñ§ÁÙ>&Zx³àö±ãûŸ‡ÃÆZ_Ž“{ñ7^›ölðoì½oâ†>%øa¦i+ñ{Æ|ywâX¡7þ ºÖÿá,ŸÂÚg…´Š+ÒgÕ^êÆyæÚÛËKéÎëÏÃÙžUK5úÞ#3ör¦–PÃÐT£ˆŠ†+ž“­R¯¶öU¡,-HÒXz’…NjÑ÷3–oNŽkÃø—V®>>:ž:­Wt¡/fùaKB1§QUPu}­JõeJÒ§tÜœªQ›Ãþ ý¯üMá¯ÙÛáç¾xWÂ:À_‰ÿ &×|Mcñþ#Ô>#h~K%|S¢èðDð¶‹k§À/®­næ¸Õ.¦»³ŽÖÆK¤Ðž7.ÄçëˆêÔ•ãèg.x?g+à±Xü§OÚT«N5#Øø}ð»Qð'¯…¿²Î™cá øƒÆ ®Þxæ†÷¾3ŸÃ~øxšÃkot-KÇ ÕüBe¾]jöZ…ÕòÊ5/¦¥ommo`ö–Þ£œs|Ê~zµ°ø<>’•uIMÊ•AÅ*0§OÚ©Ê’’•EIB5g9ÞOÉÊpßÚ9®3*R¥Bu½¿%IFul¡ T!ZtÔ(Ê·³¥WØÓ$ãÉiomSôVÂÆËK±³Ó4ÛX,4ý:ÖÞÆÂÊÖ$‚ÖÎÊÒ·µµ¶‚0!‚8ãDPª½Í¼¬}ÖÞV-Ð@P@P@P@P@P@xoÄÿ‡+ÕüIá߈ ui>5Òtëÿ ë0xªßS›Ãþ&ðv¡ Ôa±¿þÆ‘.¡Õt~ÞÞóN»jã­ÛyxÕZH¹1˜:xÊjœÛ‹‹¼d­uÑ­z5ÓÑô8qø XúQ¥Q¸8Kš2ŠW]×£[®ö}!ñ¯Â/ôðÇŒ-~kê:.¬ö_kø§§çPðî±c¯h÷iÒîí®Ùõm6Ê,JO'Ë•^'tn 9,0ج&2Ž&pÄà+F½ òÅû:±Œ ¥Ë+ÂVŒä¹gG[µt­æÓÈ!Fªtñu# f¾²äƒçÃâiJzwi¸óÓœ£ÍYÆ÷„£$šêÿáý¨?ççà'ýññ £ûüÿŸÝ/õj‡ýÔÿÀbq_u/ÚKá—ï|GÕà}þ™ðûÁ^)ñ¾£a`¾<×¶>ЯõÛ»;#q$q ¹­ì$Ž?5Ñ7ºîe\aQÿŸóû¢êÕú ©ÿ€Äíáý¨?ççà'ýññ ì?óþtCýZ¡ÿA5?ð‡ü#_µüüüÿ¾>!QýƒGþÏT?è&§þÿ„kö ÿŸŸ€Ÿ÷ÇÄ*?°hÿÏùýÑõj‡ýÔÿÀbw¿ >x‡Ã:‡ŠügãíGDÕþ xÁô» ©¼9üƒá? Çtžðƈº¤töë}©kÚ½Ìómyo|Er¸ò-­–?S …§ƒ¤©SmêÛovßD’ôG³ÁSÀPT)7-\¥'¼›êí¦‰$­ÑÑ]'`P@P@P@P@P@P@P@?þÖ?òk´·ýŒŸú®¼G@@P@P@P@P@P@P@P@P@~tÿÁI¿h´øð/Ä~Ô¼®ø‹Høßà‰ ¬üW¥_Ù[éÞñ/ˆ|!¨iÚ\ZݵÌ~d±Ü[^Þ] bÒ&‰z¸VD2}û*~ÑiûQü1ÿ…«aàwÀ~»×5A‹ÄöW×:ôG•o¬Yý‚0‰§&¨n왋4úeØÚ«—úZ€ ( € ( € (  ø§ÃÒæÖü[â=º-°ÍƯâ=_OÐô»plÍ©ÜACh'æp¥yX »ý«>JY<o㿉ÛxŽïá߀üG¬øvàŸõbÏÇ7Öv½Þ{Ûë’^S:3yØœß,Á·F:)ÇxsÅÍÛ‘¼¿¿•椞Vp–Òäjø´ Ú#â-÷>ý¼OjUþ"|@ø}á]éÆ×Ž/jž6™7(bx uÝtF2|ŠÜa’Qø+T®ûB”Õ¾uÝ}½/êRá\âP]9êAþskçb‹|bý£fáÁ=,©Ýö†øëã½t0y?c³Þ‘åÞwÚ_o—·Êo3|\oŽr¤½Ü6-¿8Q_•fu® ̺â0ÑK´ª¿ÃØ¡£â×í „7ü+¿‚3…ù¼ñCÇ–†`¼ùBëþ5ÇÙ·co›öyögw•&6´®:Ë?è—øi~^ÕýMÌØœ>›kSÿ•“'ÇVÇv¥ð#áÕÄ#o†>>k¥àUûãÉñÀßÁæWËkÚØ}í¾°ã|¢NΖ&šï*tÿöʳzKƒóH-*aæ×HÎûu8£^Úu¬ÈOü øÕáÀ¿~öÃJðgŽô×î ²xÆÚƬèv|ý"Ù·FÊîˆÍéÑâ|޳J8øAö©Ó·ÎqŒ~çcϫùÅw‚”’þIB§á 7ø÷„¿hOƒ4Ô!Ñ4oèÖž$ŸýWƒüR·Þñ±Á ßñExÖÓJ××!ÿgáX…$Šöhסˆ‚©‡­ ÔÞÒ§(Î?|[G•Vl<:Ô§FqÞ3‹ƒ_)$ÑìÕ©P@ós|Vø—ã’÷¿¼à뉧·°øƒñÅ:¾—oâFµšHSðo„|7á½F}oÂÒI¬Æ£¬h_j ‹[Í>æÚúƒÎüBÉr\U\%lv*†•gNkzs©9Çߎ—PŒÔ]ã'&ŽªXJ•"¥¤bö¾ÿrýl3ûSö£ÿž_¿ï¯ˆ•áÄYË¿èSˆÿÁ”~¡?ùø¾æÚŸµüòøÿ}|D£þ"Î]ÿBœGþ ¤PŸüü_síOÚþy|ÿ¾¾"Qÿg.ÿ¡N#ÿR¨Oþ~/¹‡ö§íGÿ<¾ß_(ÿˆ³—Чÿƒ)Ô'ÿ?ÜÏý¡þ|vý£¾x§á/Œ£øo¦ø‚+Yìµ[/øO´toL¹ŽûIÖ4çž)'†æ’.ÜKo=Ì òNÙ‹9wý q)×ÊBú„×ü¼Zy3¹øuáoÚá_<#ðçÂwÀ+ x/@Ó|=£Û³|Ai¦›l ›¹\_ÜH¯qq9PÓO<²·Í!£þ"Î\¿æSˆÓþžRÔ&¿åâÓɧö§íGÿ<¾ß_(ÿˆ³—Чÿƒ)Ô'ÿ?ÜÃûSö£ÿž_¿ï¯ˆ”ÄYË¿èSˆÿÁ”ƒêÿŸ‹îaý©ûQÿÏ/€_÷×ÄJ?â,åßô)ÄàÊAõ ÿÏÅ÷0þÔý¨ÿç—À/ûëâ%ñrïúâ?ðe ú„ÿçâû™vÃâ¯Ä _iÖ¿|á}@Õu-;C²øàjZþ…e¬j·éºT>2Ð|Aá½"ÿÂ6ºŽ§uegkwgsâ;T¸ºXïî,PÅ-ÇÒdw“gؘàiF¶%xS­òÔi9ISœ%$ÜToiªrkX§i[¸Z”cͤ¢º®®¿ ŸC×ÚœÁ@PžüAø¡àÿ†vVsø’úwÔui%·ðï†4k9õŸxžòV–×Ãþ±Wº¿òUã{‹©ke}¢öâÚÙdƾ"†”«b*Æ(+¹I¤—E¿VôIjÝ’ÔÖ… ØŠ‘£BœªÔ–Š1M¿Ã¢Z·²Z½5_|rñùo&þÇàw†&?º±Ò ÒYV¦¬Û›æººRkéÞ 'Èð«<=:!Vm(:µ=­HUœ#t§QsF…Gt”-›Šwþ~×?³§Æ?/„>üNÓu¯Éo-Õ®{¤x›Ã7š„vèÒÜ&”¾*Ñ4ÕÕŽYÞÚɧ™!‚iÚ1.è±\7à°µq•ðŽãí' Ò«ìÔß,g8Ò©9ÆŸ5 êÊ*œjN•9MN­8Éaø‡'Äâiá(ã¯V2”©Ö§ rÊœ9J”áKÚÊU#ìèóûZ©NTá(ÒªáígŒ¼7¬x›ÄþÓu/´xÁ‘hsø“Nûü?Ù±xŽÚâóEo¶Oj–·Ÿh¶´¸|ZÍ9ËÄ¢6eÈXz¿T†9Cý–¥zØhÎëZøxP©Z·ç\ÄÑ|Î*ç´e'¨úoF8¿¨¹Û°Ôñ|–—û½ZØŒ=:œÖä÷ªákÓ›rsJ*2„¥ÔVFá@¶ŸãO êž,ñ'ì5/?ŰÐ5OécÔ"þαñ8Ô[BŸí³Z¥¥ßÚF“¨|–ÓÌñ}Ÿ÷Ëôß²ÃÖxEŽPÿexš¸5;Çýâ… .&­>[óû´q˜ióòò?iË9¤c”«R§‰§ƒ”¹qpÿZ„,õ «Oí9’å_½§8r¹)éÍËÊÔšø£Æ^ðdz¾%Ô¿³SÄ~$Ñü!¢·Øïï>Ùâ-zWƒIÓñak9·óå×ÏœEx̲  •†ÃÕÅ׎i^T±”n£û¼% ˜šò擌wB•IÚüÒåå‚”Üb爣‚ÃUÅâ'ìðô%B3¥+K‰£„¢¹b¥'ψ¯JÔZ?<ùaI]×ü5áÏiòi>(ðþ‰âM*^eÓ5ý*ÃXÓäà¯ï,µ&…þRG(x4©V­‡š©B¬èN;Jœ¥ /œZhº´iV³­Jaü³Š”~é&Ž;Lð&·àM¯ð{ÇšïøbÁOÞ«øÛáŒÛs¶àvñeðýà˜|#«ø\±\»¶çßôùf˜.XWkF6Ò¦•]X«üç³çq¼-–â¯*)ા´õ…üé·m;BPG¨xö„¼ðüÐi_4ù²Goiñ@»¹Ô¾_ÈåR5Öï/bŽÿáÍÜ’6k‰.—ºHa‡\¹¹”B¿{”ñ&]šZœ'õ|Kÿ—5,›Ó^I|3ë¢|ÖWqHø¬Ë Çå—œ¡íðëþ^Ó»K¢çŽðé«\·vRlúY]Uу#ÊÊC++ «+ ‚¯ <1Ôå/îô¯‚?µ; šÞûMøWñ þÊtá໳ð–¯qo2ÿ´“FŒ=Ö”Ÿ,]´åNß D~±µÒüàÝ2Æ%·²Ó¼+áë8…‚ÖÓH³··‰ÙHcEî×ñî2r©ŒÅÔ›æœëU”Ÿy9É·ólú«F+d’üަ¹†P@P@ã¿´E¬7¿>7ÚÜ)h¥øGñ6 WFOk‘ºàÇ,r*::U‘X@5ëätóÜ–Q|®8ì%¿ð}?ÂÚ?#:«÷U?Ã/Éžóáë©ït úå·ÜÝèúeÕÀ<÷PM+\ÌŽÇšþµ<#b€ (ʾ*üJ_‡ún›g¥ÙE­øçÅ—7_‚¼9$Í7w–ð ïõ­jx•¤Óü'£ÛŠ+æôI6Ò< Að¿öuýÿ‰5ÍFxç\Ž$×ü]¨Åw—0Äí-¾¤ZE˜¼=áK9O±èö„E÷¸¸{«û›»Û¿Æs\ã›×ö¸‰rÓ‹ýÝ(·ÉMy/µ'ö¦õokE(¯ÖrÌ« •ÑT¨Fõ^Ò«^ü߯H¯³¢]åy>²¼£Ó>]ý ÿä ~Ê_ö^ßÿUoÄjöxwþFY§ý“ÙÏþ•W+ÊkbkK ^Àâq‘Jr¡£C*œ%r’£Í bk(ÕšPƒ¬«b\èQqK똨æµè¨Æ~džiæT°³R„*æ?XÎã sœSÄ(×x<.TéË™$ý”Ui¹KÊ?dïÚ\ñÏÄ(|-ª~ÔøÆ5O ]ê·‚¼eð…þ üKðWˆ4ß"EÒ´84{9t/H©6¥±nšÔ–¿Ù0\X¼–ëtïôÞS†Ãå8ü^$T)`¥Nx|Ç –/ Š¥VN<øˆVQ­‡ÁòÆœðø¸ÐOÚWöX˜§S.Íñ?Úx '6æÄ×xšxœ3ðuhÊ„RŒ(U§R«‹u[æÂÔ©NV…j´áRT«*)âïÚ·ã>¨jŸ¼3ñºˆÚ_‡¼xº7Š>ü1ýŸµ wà§„lW]¶ÑìôÏþо#³ÑuþÐÓeKˆõ:+Á6¥7—oéò@ç¯$ÈrìUl‹/Åe³…<â4 ³ n28,EJÕ¡Z8<ºœë9O :·ÃÒ¬•ðôá<\W*u+ˆs<~ §UÁf-UȽ½Xåø\Æ8PÃQ­Vœ³ ÒpUxYÓÌeJ»• K,"J‹…£µ_üañgíAñçHøQñFøMæøàuî·ã;¿Yx÷[…íÓÆ£KÑt ë6ÚgÙ¯mMîõ ©d’am½»·šÓÁÀ<-u1Ô§‰£‡âLÉSÃÂ^Íbe<‡ãQÕ¬¹§FnZS…:PsÄTª›­Fž¥,_§˜K‰Î2Ÿ©Î8ZØŽŒiÇÚ{ ÚØÉ¿gOÝJ³—%;ÔýÜ):Òäu])Cœ×þ øÓ^ðg‚ü=ñJãMÔ¼uðwöÅømàOx‹D²]?Oñm¾œ–šö‘⸴¸¢Ó/µX´–êÊ Åt“ˆcŠQôÒŽ†a”ç¸ <°˜,Ó"âœL°Ž£«õJøL³:Âb°ÔªÏß«F0ÜØzµ/RT§Q¹ÆMñc^a<¿ˆò,mjx¬VÃJ†"ö~ß Î²:øYÖ¦’…Bs©N­*|ôáSq«QÊLùÒãöë×5äÔ>"Z~Ö^ð üS_ßøöwºýŸ¼câ}æÆÂY±´/üP‡C”:®¥l‘ ë­"³A4ÙµxãÊÅêQáµ€¥B–#‡ëgµ%Nœ±Uéfpn*B*½<'% <=Ü°ÒÆG–x•É]Ï iËš¾ n&´°ùä2<5 ò†ÁÔÅKF…W*u±³t¦èÇogVHÊ­ ¡:vÇ)¥ú÷ðÏÆÖÿ>øÇö¶riðxÏš‰“O–A,–YÓmïžÉæ¢c“4^`UåîÅ|Žu–¼Ÿ6Ìr¿kíÖVŒj[—ÚBj9nù\áË'·ù[v>‹$Ì'™åXuZq£Z½5í¡åW¦Ý:ñ§)%)SXMS”£J²”c&â»IbŠx¤‚x£š £x¦†TY"–)¤‘I‚¯!*UÁ¯17š|®;5¥­·¥Q¤ÓM]=ÿ€rÞñ<Ÿ浆[‰¥ø)swmewaq&ñðîæ[{mWF•†øþ ©bŽ÷N‘Ú-)òÍ­ô‹[‹kOÒ8c‰§^tòÜÆ|Õ»F´ž²kjuYµ¤dõ“÷]æÓ—ÀqB„'ÀC–œu«F+H.³‚[E}¨íÕ¢šÚ@‚ òäzkôâ ý¡ä|qÿ²?ñ/ÿP½j¦_ ½äÐðÌ‘Áá?Ë+¤QCáÝ&I$‘‚Gqé¶ìîîÄEPI$€$×ñÖ.Q§[9>XBu$ÛÙ%)6þIEJ¨éÓ§:“qŒcÜ¥'eÅ+¶Ûi$µoD~sü#ø×ñ ç㇇þ,x›^Ö®~þÔ~,ñ߯:õÅÿöƒeøxÖöß 5í2ÊY¤¶²¸øƒi¤xêîY!Vñ¥Òed‰<ᄅ“`éäUxzXhÊ2¼¯ ÄUæày}b¥z¹–]9¤ùa–åxœš¬iÎqp¯C0µ?kZ¥: Še·¹{o”ɲLVu<_°­‡Ááp§h^ƒQ¸»¼ñrj&-´ÂÚ¼´¸“íO…¯‡§Šàì׉ɰ´*ásgÕ1ÁO_ÚÒ«G¡9âý«„ °Ò£QW§+ûGOÝt£ZP£,(Õ§Åà‹¸¼=¢GhWZ‘&×nZm>þækÛ[Fµ[†3h·ÂámÐ@÷&?„±x³›ÒÍ2ÌÏ–Æ›¯<)â9jT«KeJ6­Ô¥ZJN0ö5`ã9OšƦ*4%‚…Z©hWt0îTÚICˆÄT’“÷y)GÉ;>uRµJ.¤©·Áß¶ÏŸYø§Äß<3ð÷ÁÖ¼C⯊Þ(ðtv? ô«XþÆÔ<%ˆlukÇ×øëÅþð~±ðßãÇÂGñɰø}âOŒ_ ï¼àÿˆ£[Mi¥x[Äo¼†]FóK·–òÖ+å±ûB*Åk©b·“§Á¹† ‹ÄC–âñ9u)WÆ`0ØÚuqøJšŽ&­ZŠpÁÔ”!‹ö3ªèó{V ujÓ㫘aé:U5L¾´éÒ§„ØçWV,8ÎN5y±ÎnX[ÑQ”iÏÚ:SäŒøÏÁD~øBçÅwcÀ|OðûÁ×Úžªügð—Ã)uOƒòkÚR{ÇÆWŪÍxþ ò´(§{hìä¾¹……רd´ð<™cpØß]ËðXœÎ«„Àâ±J–;F¤Ÿ%jt9%x:Q©‰å”ãQQ¥U8*ñö/Ñ«c‰ž ?m[ ùqŠŠU€”u© [„_,èÒ•:õ£OÚºtªA?ß)Ò‡¨üMý­< ðØx*ÂÓÁ>(xÃÇ>¶ñΛðëáŸÇ8Ó<r‘'ü%zþ™o©[Úéz,zÅ®œe7²3Ý\…%Ž)¤‡› ÂØüN/7ÃË„Áa²IÔŽ JÌRjŽ‹«%Z„y*“­Í”ñ XÆx<Ã- Q…xòTÂÔÄ:ŠÚ°|Ðx*¸)E³ö‘æÇa àªÎJ—³üAý±¼à-SFðŇÃ/F4¡…ÂUÀUÀG‚¯™bs ´çQÆ_¼Á`p˜ztê ¥áÞ¬çRœ•ξË †­O®¾UZ¬òúôñò¡ŒË²ÚxV…8ÚrŽ&µz•jR”œ%J¬k8ý]ëN­:U£^Е)ÞÒ¿eÍ;HðO„<0ž4Õu]sKøÅ¡|lñÇŒüA§Å©jß¼[§Ý}§V7–ðß[E£ÛÝÄ–Öv˹[+[xÊ]H¯4ºUÎiË„«K >W–å¸ü¯€IIRÃc°xÌ+u1R©^»««‹ÄÕœT±5¥Q/c ESÇû¬òüÎŽ#0|Ë7Äåø¬N6P²ö™~3/ÅBžªrá°ÊÑ¡†§SÙὬªAIóF|›~ËŸô'›Âß ?j|<ø5=ÝÑ‹áí·ýïûÎY‰xÌ¿Švæ¯Fœ¥m¹œW2ùJèü[0ì&;†Ž‘¡Vqÿ•Iòÿä¶:oÚþHÇû#ÿÿõ Ö«²_ ½äq£Àÿhþ \~ÎvÞø]¤ê×þ5ø§øOᆙ¨é–7·Vþ²ñ´gˆ4ø›¦kÿtÏø:?·xB$ðŠø>{KX.í¢‚jb6Â`P2+G'ÓCÄ|Mξ#‡2Šõ•^|UHàê¼m|5F£¥ë ’«ˆÂº´}éÆ5Ôj{£“•a±ÞU‹ÅTÃàóKˆ•)û W®ùIÁ=(Ç㈩>uÊ5cUFªè.¾!üHð?ÄþÕzìõñ‡ÆZÅo^ø{ãOø+Áw:§Åß…>7ðæ»®x…­gð.­&}'…õ9õ;øf»Lhú=„Ò•ûE¤wi`rµKˆø>†w„¡æÔsl»[©bðï+Ã×ÄRö”©bpôeN§Å?ßN¾—-Z”¹0ëŽÁd¥d£É0Ù–_ŽÃÕNŒæªã0Ïëø(Ô…?kí±8^YÑŒ#*Ø)a1p~Ç 5/Ñ%øñ#ÅŸþ:èŸU}8HðÛ|FÖ-x{Cøoñ¿OÓ.þ2øfßÁž*ñ­s‚n5x4ÿ -ýäñhV©£²j/3Gu>¥q j§KæyØ”²Ž㔳¬iŠÅárŸÜåÕÞ&¨ÓÌ'u+TP‚jµgZ¡ËÍ t•^iG˜WuiðÍ8ajF3šò©Z­5 ÕɳN• s·.xQ© GW³QáýKW´´Cg©]ÀaŽkëK¹s^±Äç8\ðÆqí#‹Âe¸ ŠgNj§"\=†Ëñäç½LªNR¤“¨ªP•%QrxxªØž6Ãâ&¨Ã9Ìx‚:õa:”Ý:¸Ú²ÂT”cïWÁÖ§N Š›µ\ Iœ¹\Oœ<ð§_ø¥ãÏøf=#þ “xÚ|9â¿]~Ó´_ |"ðÔÔན^±Ô/|+¬ëšªZ-†“¦ÛØ\_G4·ßXÁ×ý=|v ‚Ìq°¯ÁÔhVÀãðøj˜ J™¤ªcð¬5RXŠp±¯B­Z8ºÒ«(`ý¢¥Z½ª§>:´)Î…Zxª˜™Ê•)áéU…L%W ÐXÔÆ$é¼57OÚ²£UVtàéR•IS‹é|Yñ'âwÁÏÙ#â쥮~Ì?u?x;៎|ÿ /Fð唿uO®—ª^?Äk¿ˆR_¬Vׯá‰î5Yô§´k™uD:{¼7—M·™[ —ñ.y”ñL3ü]F®#(«ˆÁb+8æ8|N¦‡ÔðØ~Dñ1–"*T*Á£QÖŠ«GÏ[ÔÊpÓÊ1õðô¢óXbñ9| é¨Ôx˜æ8ŒUZqÌ©ÊPt**¸Š”ñꤚ­Nŧ 8¨rv¿¤ñÌÿÁwñ‡„?k~Ï’|ðµ—„¿dûCÈñŒ§¶kèßì<7©ézÕLJ®¼9qáñdëªØÄ 7Q[y­> "ª0ÀOÇTý¦OK>–wŠTežÅ}R8 Uä©…œãV”qtñÞÒRNVéò:ÐtáFñ²™baÃSV(PÁáªbªQ—.idiá'ƒ%(´òéa©â#Rteôq-ûIAÔÀÔ›|=øsñÀ_²ÿ‰’Óöyø•áI¾þÛ^ ø¹aðoL²Ôüaâ¿øW:Wˆ| ­Ãcà»ù™¤ø€ÖZnëC{ òn—M¼7Fmædôs×[‰8"µ|ÿ š8d9ÖUÇÅB…:xÚø>%Ëý­zIF8zR­‹£Vœ¬©V¡RZ:“¸àéÕÿ_0Ø ;ÁÐÎrüð+7kìèe²¨êʤ¦¨âª¬ |M\ ©R¦­h`cÏ]F“ÓøÏðóÆ:GÆ?|\¾±ÿ‚†Xø㎟àOøvÏöHÖmôýs@Õ­<¥èÚÇ…>-|:–#}¢kºziöÏù¸’Ý…ì–K™­%#ƒ$Åa°ùZá§[†ëãò ~g[5Œ«à1xzø§Yb°Ä£OÞ©?eìÚö•èÓ§Y(B K¦½G˜G/ÎiS«‡§‰Ëð”+áª/cÂW¡í})Ò÷•J§)UŸ³›Ž,O4ªGJKß~|7Õ|û ~Òšž±£|]Ю¾"è_|s ¿Ç_i^:ø§¨i÷ —JÒõÏ6“á}!<-¯ßiúU³Üx~æmfîÅ¢XîoÌ»­­9s|},Oð†•\²£ÉçGV9FTpkÔÍ+b+ÑÃVuêÃKÚÕxã)SÃÒ­*ó”iÉóU©ÍN<øŒÇ¾³(T¥B„*bÚZ‘ÂÓœST}ùR§MÍЦçVN¥:Q”)Ó¤©Ê§é§„ÿäUðÏý‹ú7þ›­«ú à: ( ‡à²“Ÿ~4xZí|¥ñF³¡|Zð˵.´?xcDð–» ÷f¹±ñƒµyîUè¢ñ˜eQö¨ÞÌ8ç :xÜ.1/ÝV¥ì›í:r“Õô¼f¬¿ºûiú/âa,&# {T£SÚ%ýÉÆ+EýÙEß·2îwUðÇÙP@?ÄŸè¿ üâˆ~"ƒQ¹Ñ<#¤Ï«ê6úD÷:œð@Q<›.®­¡’åÝÑTKq då@$oƒÃOŽË²úRŒkfXÌ”§uÕÆâiaiJ£Š”•8Ô­QÆ2’‚“ŒdÒ‹™ÉS£‰¬þ &‰š[¸a¨TÄMEhœÜ)ÉA6““IÊ*í]MgÄrx¶ÛI„ø> ¾®Þ6msOV‡ÄÚ0ÛÃásá­†ñÌšl’^ÿh¬žBù>ARì 5J’¥ŒukûÏ Ž£Z­Z’œa,5£†–§ï:¯ª×»§+Pxo}ËÛBÝ]s¡@PöVóÝÝO­­¤2Ü\ÜO"E½¼ÒÍ<ÒÈBÅq«3;)$àSŠm¨Å6ÛI%½öI%×°›QM¶£«¶ôI-Û}:?ÙoJ»´øOoâ;ëi¬î~$ø«Æ¢´¸á¹¶Ñ3Å*«Å9–6U)µyË0Ï—`°²Òt(ÓŒ­·:ŠæÿÉ®~+˜b+‹ÄGà«VrøyŸ/þKc´øïeu¨üøË§XÂ÷·ÿ ~!ÙYÛÆ3$÷W^Ö ·†1ÝÞWEÕ…vÉ{­y?ÈãZ|„ð=å¶¡à¿jS$öwÞðýå¤ñœÇ5µÎ“i<!î£èEã!*X¼U9®YÓ­R2Otã9&¾MXúü1¶ÖVûŽ¢¹†|ßñ§öcð§Æ}wFñü'~xßGÒ¤ðèñ¿Áo\øĺŸ…žîMGþ}fäY^Ûê"j²}¹#ke•'\¬ÁÑý¬Ÿ<ÄäËJž Ác:•pxê+…xŠJP¥ŠTœ£Ë‰§Ju(ª‘’æ¥Q¢Ÿ%IÖµzz5"¿Ù*U©B¢V«Eâ!J˜Ó—Hb ꦛ¾Ÿ#ŠöŠx~ÆŸ-þ\ü+ŠëÇÉ-ß‹“âEÏÅã]Lüa—â¤pˆSâ‹xà©qãEˆ˜Z‹?ÞH¿cÙ#£uÖâ¬Ö®e—æÖ ¯,‡¡X`*s¬Fá•Ôð¸¨Ô©ðœ¥&¥g:nŽÑÆÓŽcÓž=æ°§O,\åZR§†te‚§ÚöTðÃa§„¥MFœ'ENq©:¸‡[_àÏì±à¿ƒ~&Ô|tþ5øµñkâþŒ|3>5øòëÇž&Ñ|(×pê2x_C¸k;+m;F}R#zʶ­;K4¹ŸË,,ωñ™†Ye,(ÀT¯ Mj9v8hâ+Óƒ¥J¥wÍ9MÒ„¥¥(ÅÝ9©:tœ2úªu¨U«ˆ¯]aOaJ¥YJ… ×äUëS¥¤zÐ¥J”«IJq¥OÙÒtãRº«ôÅ|ÙÔíÛ¦?úÔ¥Ê.2JQ’i¦®šz4ÓѦ´h6ò±ð´ÿðOß„—:”¶ÓüAøüß 'Õ[T—öyÿ…³ª§À¢÷û\écÁÉd/Fþ5Qhº°Eº€Ù`øÛ4ÁCQ`òüNi€„!‡Í188×Ì©{~Ç?¬NMN¦‚… s©Nr•(EWö²u%<±”ž.¦:¬kÖÀÏ2•ibž¬ðÒ­,_2ÇIΛS„±Üõ¾±*R§/ßTö.¹É÷4qÇqà i P¢ÇQªÇQÆ¡R8Ñ@Š  t¯”¥9Js“”äÜ¥)6Ûmݶޭ·«oVË„!J¥J§NœTa¥Æ1VŒceÅ$’I$•ú’‚€¶A,÷%ŒUÛÇa,¿î=?˯b*éJ§”eù3Þ<;k=—‡ô++”1\Úhúe­Äd‚cžÞÊ¥BTJÈŒ28¯ëcÁ6h €<âÏÃI|we£êúÝ®ãÿ\ÜßøCY»IM”ÑÞÇ:ß„õól­<¾×-­íâºXÖV·¹±Ó5H¡šëH¶CÁ™eÔ3<\%ue-c+{Ôæ¾ÇÍuïâôlíËñÕ²ìUC¼:¦‰tb•¬µ‹žÊõ#sÅ£•"ü_3ʱyMwCNÉßÙÔ_H®±}ûÅûѺº³Mþµ—fX\Ê‚«†ž±·=7ñÓ}¤»v’ÑÛGtÒê«Î= ÊÚÀšÇŒŸ´û_‡oľøE°Ô|oñ³ã޳à?ƒ¿µ7Ð ñ>¡‘à‡QYø“Q³Õ´Yínoõ›ëñ—ZkÆ.-­´°'úŒ£<« YŸÖÿ³cŽÆbcNx|Åæ9”p•iag…§:òú¥†«)ýN“§fëN­Eˆ«ˆöGÏg©fyÆ&¥„–iÀ੺¸¬K†ÁO1úÅ|&¬ ¥_[0…O«i*0Ãáäá:S©‡Çøæ|føSû|+ø­âbûÀ?-¾*ŸÚÃâ=GO_ß|;½dðGƒµvÞê-FïJKešê8ÚËsý‹lÁÌÖÉ"{™¥*8n&â ”ç79á0q𫉣(ú'ÇÏß¼ û)||øyàíZ÷XÒ|=·Žl< }ã‹­||(ñÕ­¤š}žŸ½:®‘¥Þ¤×Ú²iúÕÍêO>©yt€¬ß/‚Í3Ë?à¼vaÏ›7Àå¿_ö1¦ñ8jùž‹ÃT«ÂW…ÂbeƒŒãˆÃQ•(ºŠTèÊòÊò܉p8i:q¯”ÕÅÔÀûg%EÐÂâká1q„¤ëÁbqXUÎSt«Ï *pŠ¥ ”cE±ø-ñûNøG£ý‚~Ä~?Ô¼¤Gs¨k>Uý¿Œ—Z³TŸR»º»Ô7jr´¡$žV}â5;vÍŒÆbqù_ÖÌq.©›ðÖµ{B”¨aéás|#©îÆ0¦ðØXssÊ6NŸ´«Íï7Åà0x\w†øl5ì+PâC§Ï&ª×ÆTÈ1•×<å.U‰ÄÖ¨÷ötý¥¡ÓŒb¼‹Ä_>xöqÒ?jOøÓÄ2|s‡DðÿŒtŒ’xïÄš®³ãïê3۵߆5-&ëY—MÕ`Ö/¥»Ñ.t¤±y1ÉÉ‘¢ºó¾‘ãñØ^1Áð¶J–IŠÍheÒÊÕ >Ë—Wª£R¯;ƒŸ4°ÍæñÅRœ#ôã‹£ÉJ1ŠñðxL¿3álCç=b÷ö}øñÿöŒý aø¯e®jºN—á‚òZxRÓÄþ ÐôkM~ûÂúÞ|Aum¡êv‹©k6¬ö¶uçE w× Å'Ú?wó´±µ²Ž©W+«âeçTèâ¥NYR¥K•?ܬe,K©Nx‹ÅºŸVÃE8ÆU=‰RþÓÏ2¸f4eÿ«X ¸¬"•JTëU­›fSŒ+û7 öÂJ…hÒ‡¶åOVR´Œ' ÿd ýZûövøwý·«^뚆›ˆtÕµ)¥¸¿¼µðçŠõÝ O’êi¤‘ä•tý>Ú<—8ÐTq<á[4†.cAæ «8Ge[–a15윜êÔœå'ïJr”ž­<7GêxL~]µ+PÊ3l燕V¥Qa°™¦.ŽœœcZÂŒ!F8F1IJ×Ï@5™QK1 ª 31 ªª2I'€ÍÛÊÇ xu¾=̶¶áÇÁ{[¸Ïˆuݤ[üR6s‡øaÎ÷äž!³­&ë[øšM¹[«û7ôN᪔êS̳ |ŽŸ½BŒ—½ÍÒ¥Dþ]áï){ÎÍ#á8ˆ)Μòü ù”½ÚÕbýÛu§¾+í)-÷UÓgÚꪊ¨ŠUPUTaUTp~ˆ| ¤XV2 ŒAêí@5¯ÃŠž_ì„&ð<þåmÁß4}iæðdJò®‰áøfþ Z†òìt­CM¹šÆ,[Á¨}ŠÞÖÎ×óüïüŸ8ÆTÇBµ\z¤ éÎzóO’KÝœ´æq’Œšrqs”¤ú©bêRŠ…””v¾ëÊâÿeþÔó×àýóñ¼oø„Ùwý ±ø*‘¯×§ÿ>×ÞÃû/ö£ÿž¿¿ïŸˆ”Ä&Ë¿èmˆÿÁTƒëÓÿŸkïaý—ûQÿÏ_€_÷ÏÄJ?âeßô6ÄàªAõéÿϵ÷°þËý¨ÿç¯À/ûçâ%ñ ²ïúb?ðU úôÿçÚûÙÌx×Pý¨|àÏø¾H~ßÇáO kÞ${ÇñOzš•wª5œ2LËr̶¦5geP\ hÿˆM—/ù›btÿ§t…õéÿϵ÷³SE´îµ£é:ͳüK}[L°ÔàG_ˆ{ÒûX®âWéó„•A÷Ä&Ë¿èmˆÿÁT‡õéÿϵ÷³Oû/ö£ÿž¿¿ïŸˆ”Ä&Ë¿èmˆÿÁTƒëÓÿŸkïaý—ûQÿÏ_€_÷ÏÄJ?âeßô6ÄàªAõéÿϵ÷°þËý¨ÿç¯À/ûçâ%ñ ²ïúb?ðU úôÿçÚûØeþÔó×àýóñø„Ùwý ±ø*}zóí}ì±kð¿âO.¬Wã'‰|/…t½COÕ‡>hºµ­‡ˆõ *òCN_øƒÄš…ÕΧ ÛßÚZ]O±Ò’âXZ…Åõ“Ig7¿pQâáŽUjã±toìåW•B“iÅÊ0‚W—+jór¶ñQz˜ÕÅT©K(Ǫ_æÿCèÊû£˜( € ó_ˆ <#ñ&)u˜ot¿èë?ü#ž5ðåÒé1ðÓÜl3'XXdßc;E ¹ÒÓoD1­íÊ AωÂáñ”eCF5éKxÉ_Ñ®±’é%fž©¦o‡Ä×ÁÕl5YQ©¥o“[4ú§tÖXøßÂ߯tí]ƒÂ°übøq¥x³^ð燼uà‰¬´oxƒJðäé¥ÞøŽçÀZ¬–ÚV»§®µ«lº—†õ¶mIt׺Óô8⸂ø<Ëõ•L¯¢·Tk_MÝ£U&û(©Å¿æŸSí2þ0²<Ɔ«OkKä¯*nË͸É.Ðèu¾ø£àjhšg‰l`ñ-¾ïƒuµ¸ð׎4·#>V­à¯Ãe­éRpp·Vgi+3_‹Êó k„©EEۙź*‘¼ÊLúü.cƤð¸ªu[Ú*IMzÓ•¦¾qGœ|Dý”g¿‹2¶ñÿĆZOˆ|[mŸj¨kúr_Ç¥¸kÖôÝV´±ñ—ÇnN§mv^Ú­d-mDºeÙÆe”Ó)Ð¥9ºŽêAMüN1« ¨s5Í5979'&ÛYŽ[‚ÍcFúßêÑœ)ÉJtêF|ÎÒ”¡QÁKšp‹“)Τé¨J­G-;ÿÙ«àv§ðÆ?ƒwÿt»Ÿ†ÖúÞ³aá©/5šF§}ª]ë7z¨ºÔ´öþø(Óï-–8/'´Œ-¬¯ D³lÊXÌ.añ¶«k¯èI>¥s.µµÁ¨Iªkw·Ój·×mnë WS_<öñAo´‘%¬+˜fÙŽi_‰Çb¥Z®ÑtQ§.„¡R›§N”aNU!“”bZœÕ*¹Îr”–_—`²µU`pФ«ÝURN¯µ‹‹ƒ§SÛ:žÒ“„§F|Ôœg8òZsNç~|0øi.ƒ7‚¼2Ú<žð¥ç‚46msÄz§Ø<-®·‰n´ 5^ì\+kN×yij >RJ°xÜ×ú÷×+*ë1x9bS¥J*«Àaêap—P„T}–­JmG•TR檧%,0y6[€ŽL7±Ž_,|ðëÚU’¥,έ*øæ¹ç.ooZ…:K™BIû.Nyóyöûþ̾ñÚüIÒ>ønÓűjjÖ×mfçF±Ô„‰}¦øJïS—@Ó.`˜,Öïi¦BmeE–ßÊ‘ÇE!ΰø7¥˜ÕŽÁÓû.ªƒ—3ŠÄJ/íÈùj«Ñr¡üJ›X¬“*Æã´1X8ÖÅ9º“nSTêÍÒ•)JµÉP®åÊsöÔçÏ^Ø™_Õ^á¦x3ÃZ?‰¼Oã ;Mû7ˆüe‰‰5¶_Ëý£‡-®,ôdû$÷Okgö{k»„ͬ0<ÌÊ]•Hòj½ËýŽ5ëâ;-+biÐ¥^|Öç÷ᆣW.Xò^‹”Ü»ž‹Åý{“ý©aéá9ï/÷zU«â)Óå¿'»[^|ü¼ïŸ–RqŒ#ZàŸ„þ‡GÒE…¡tŸÚZ¼æÊŵMFïV¿–}S\¾–EY5 Û©}pU<݉µUu«[©GŸš½JTpøjj0WTp´)á°ðQ„W7%TáÌÓœ¹y§)M¹9§G ‚XšJ„q8ŒF.´¥'g_ZxŒEFæÚ=Z“Ÿ,ya òÂ1ŠQXšįøLßìß¼-­ü[¹‹û{ÆÓOøqhêÞ[Éyñ+Y– ú8dg·ðüºö¡ú+ÜËøO6ÆÚU)}J‹ûU¯Zöv¥ñÝn¹”é#ÇÇq6Y‚¼aSëuVÑ£g®¯Sà·Ouͯå=3BýŸõ¿¥†maŠÚÚ(­íí⎠†5Š!‰DqEQ€±DˆªªªP ¯¤<Z( € ( ⨽øcñÄ„"ïÀ~/µ"A˜È¸ðþ¡ Sçä`ñš¯ð†èÞü&ø_zK“wðïÁWDÈs!7Ó%&B Ëüüœžs@‰@P@P@S㿟 ~ß[èZÿˆÒëÅ÷ñùšO€<5g}â߈:È;m¦x+Ö÷š¼ÖÌòB­zö±ÚCç+Ü\C\yÝ÷‡¾*|r„ÙxÊßQø/ðžìF/ü§êöÒü\ñÍ"I4Ïø›Ãz„úÿܧî.´ÏßjºÜ:6±¦šÖCôÐú+HÒ4¿éZf…¡éözF‹¢ØYéZF•§[Ei§éšfŸo¥…¤ ±ÛZ[ÚÃQŪ¢Fª yX6ò±ã‡Þøƒbºg<á_éñ’ÑYø§ÃúV½oõÛǪZÌ-æRY#Úê@e €@Òì M´±â—²·íI>ñ‡Å†C%’×Â~<¼Ö4kwpØxcâE¯Št=.ãÖZm½±ÇÏ dçÉÄäYF-·[IÉï(ÇÙÉúÊŸ,Ÿ­îºXôðùÎi…IQÆÕŒc´e.x«mhÏ™/D­ÜßàÆ <ãô ükÀ?>hÞ'œ¨áKIðóÅ£3`¶æXU V5 Ë'“[‚òZ¯ÜU°ét§Vÿúv5R—æÔ•¦è×·YÓ·þ›•2‹ü-ý¥ £ñwÀíLçoÙßÂ=ÐÂOöµñ–­æ@_'ìÉŸ3wš¾^É8åÀ™}½Ìf"-u—³jÞŠûïò:£ÆxÔýì%»/iÅÊ_—Ì༠¦~Ñþ;ÅRZÝ|ÒáðÏŽ¼Màg¸š×Çw¦âãÃi§ßjPZ¥Õ¿Û>ЫÏnÍör<ÄVT.Á¦¯Ž­eºå‚ûž¶û™_ëž.ÎØ:I­½éþZ_ïG¡'ÁßÚ*èì¸ø±ðsG‰pì> øËY»•[¯‘%ïÆ»ldLpÒ[ß«oæ5ÙûÍãÀÙ\_½‰ÅJÝ9©%óµ+ýÍËŒs+Z8|<|ùj7òýí—Í3V٫ĸoþÐ_/‡ü´Ó¼)¦ü6ðVäpe·ðEö½lܸ_ùËlܱ´~ȨÛýÚJ=jT©/¾<Êù/êpUâ\æ­ÿÚ½œ{B8ÛÑò¹äÇe ~ÌßtÛ}ZoZx»_´q5¿‰>%j:ÇÄïÚÜZãNÕ¼¨jóèÌN@Mk8c\E qÄ«ût0˜\$y0Øzxxö§Áiß•+¿7×SÈ­‰Äbe͈¯R¼–Îs”ßË™»z#Ý‘$XãUŽ8ÕQ"" ªª UP®ƒÔP@P@“¯ZÝY±É»Òu@¨›Ü›‹9¡{üø ŽOå³eнý>^‚¤]üøYt 6ô"ãÀÚ £äï_Ÿ†Ï#šÝÖ~0|=Ñ|{ ü,“Ä6ºÄ†¸³ðNŠF«â -&–âóÄZý©aá¿ÁjÞgÛõG´ŠvÙohnnç†Þ`M € (€ñgÅ…ÞÝÿ ¿Äx<¡D1ø›Åº…)y D°êWð»Ìì¥R5RÎxPOÀŸÚ7Á:ˆ+àüPø•)8‚Oü2ñ„ºÑ8Àµñψ´Í#ÂRžFâ~‚ mx¯ö‰ñ)Ùá¿„þøse!8Õ~,xîs_²^ˆ[ÀŸ íõ]3Q~¥xöÌ.ÐßyhÀ~ øÏÅwÅOÞ6×íXæ_ ü3Œüð‹“À\øcS¼ñÃDAÚ`›ÇSÀËÄ‘9$“omò=;Á üðÚÆ};À~Ð<+mw(¸ÔGÓ­ío5k°kýkQnõ½IòKÞ_Ïq<„’ò1$Ñ·È6ùµP@óÿìÌ ß±ân ^>ñÿÅ¿ˆÖ ¼«è^:ø¥âÿø]ÃwçÂú†‹– rW @@P@P@P@P@ŒÿSöñ›ö>ø §þÊñxr Ø|ø}£øŽO ^˜þ54o iÚUÜzë mev…ôi¥Ö$’%³®ð„Âà–cÆv:¿ÆOéú¿ü/ûGÏ«GǺwÇø÷Sø•á¨Í¾Ç²¼ÿ„ëG”ØC­ÜO.¥o-ŠÝ‹«ËIo$š6²û8éÅèk•Ö~øSNøÿðÛááøñÿÃW·€~¶¥­i–Ú_߸Ĭ—Ÿ¾&x“LÔ­.fð¬q´Qh:mÄMs-ã%¼‘Þ¼= bq•©*Ò¥&]ŠÇ8¥®Ž/-ªrN<ñkëÎqœ*$¹%Ó©ÏRÝ¥K-Çâù!9P©€¥.~eõ¬m,3”jF ÅM¶ªSª¤—,}œššäîõŽß|cªxâgí;ãrÂÚ‚·z‹üð§à†âmNãâÇÄCáÖ“­išç…u-ÎËM× ÒnúÖØJ,u‰‡Ùîî¬7]Þ_ìñõj`©ÉC0Ââ¥Fpjj”°Õ2œvi…ÄNw“U'ý—šáÝ:i¥<.sQ†&|³Z‹¡Fž*2SÃËšâêFNÕ)Ï'x9b#EF …Z†T}¤Ô•xâc6©:Mu>ººñŸ‰¥Ño¾ þØšï„W^ñw„‡Å).> øoáýî¿à½VÓÄ–7Ò|Ðôx:nô-sNMSZðÿ‡´û™¬Q`¼’âÿL’ÿÎÁO‰’Áa£—¼Ò­(Ú¶ T£T¥*n¥7R¥*ñÅC 9èB¿=VÃb(ÒXŠ5pø§‚9bqëápÕ!AsΕl^šQtß-Z‘Q©JJ”!V:•!Ï5MûEŸ Úü×ô-kƾ5øeñâO‡šw‚u‰oÄ/^0ñÏÄxÃÁz4BêïYÒ4«ÏŠ^+ºÐZ}:öFËAñƒá«û»{ÙOÓÚ^Eeu¡_ B´±j´1´%‚§ýžã|tëcÜáCN”¡ñ寻qâOé^Xt¯5®˜Ÿâ-Aï弎M-/­£žx&¤U(ƵùðQÀeù•\L#9S¡…Í(!ÙøOÃzÝÃh »¦Üx+ž!fž=?Æ¥ïö™ŸZ–ý^m;J„iºÆ‘  ÔàÔ­ìÊTÔòŒ»;ÒÄb玄éI§¦1Åá!:nŸ´‚ŒaB4«sVr–*§F/ *5%¦1CÃaèóT¡_,ÁcyåAƦ%Öæƒ…HÒ©¹=œ`és­ O´—³–U}Ö± ( € òoŽ^-Ô¼ð·Åzžµ¼Y©[ÙxGÀð»[xçR³ðw‚br¹aü$úæ–ó2‚c‚9¤8XÉ—‚<)§x Ážð6‘¤x3Ã…4 Ê¨ÃNðî•i¤XîDùTýšÎ,Àè8£omò:z( € ( € ( € (çÿÙgäøðÒß °Ñïtµ… ¤ëz¦˜«í[@q„ 01€~ú‹â?†^ñ^¿áßë¾Òî¼]᥻ðÇ‹a„Øx§Cq¼Koaâ †þ-2â9%ŠëN3µä3IÜÃ#ÆÀ¿Å¿‡>)ñÍÏÃgÁ^.Ð<â_†Þ4ºñ~›uâj>:Ðõ·x/Åž ºÓï´]'Ǻ_ô/\\G"Öü—‰/¾Û¡| Ó¼!ñsÄzn¿ êž¶ðgÄ_‹/ŠD>5ð6—¥ê¢+}4ø_OžOøG¼?%ÝåÌútój<4°ô– 3Àצ¥O4˱YueBô)TXªøj•1•è·Vq²†óT²¢±5ëbhaèGÙP§µ|UY×ÃV£ËIá+à«áåU}b®X5r`jÍ©aé×®ª:Ñš¯Í…Äbpw䪧 š7ìýãà _àÿŒ>-&¹ð«þ¶©ð·Ã/‡|§ø[Å6šÝ„Z>•­x·Å·úö»ˆüY£èöÖñZ\èÚO…,$ž[»‹Í6èÉm‡^'ŒÆ:¸ÜEuý¹*ø e,d)ƨã°5þ¶ñ‘Â>xʦ' «RW‡„iΞQ:ya.­‡§ÀÒŽSBu¹°5Üñ ®´eNYlêÎK›ìªÕ£j”êcgMQUqµk¼UIg_x’âó^ø‹ñCHñ‹æÕ~ }“PðßÃÛŸ øzÇÃ?¾#Çñ&ßM_j=×®¤ñ½ªK¨A«ÿl%²Çýœmô¨þÁ"ßo†ÄPÂb¡Œ£„Œ+ÏŠÅâœdíWÚåܧ †¤ä¥:8L qØŒMugŠ«*ØŒW5eÑö9«Ã <¾2“ÁÒÊó · §Ë*ÐyŒpðÄbñ5”`±5< ”éáhþâRŒ#:Ó‘Ô'À]ŸG¿á+ÎßÓüdþÉþÂÇúï€ËðGþÏ·ÿlßí¯í³óÿ_eñ÷Q„Ä}R…œþÚào~[ÿiç´³¯kk;{eõnK¿kÍí¹éÛÙ>Œe­Ò¯K—Ùûl6Q‡½ù¹²±õq¼ö²¿·ö¾Ë–ëÙróóT¿"òï~Æú>½gáÙžçáoŠuÿx“ã6©kÿ “ୟŶ‘ñ“â%ÏÄKëHü?tiì¼G¤ÞgÙZëvÚÜK$ ¨‰ì_ĺ#N0£N’§§)ÊêUtã:ÿð†žˆÃTnØhëb'Z„ሥSšŠ•凄åXªðÅ×Åש ‘•\TqT# ÒŒ)7Â`q«A/g‰§Z8:£'u°õiAQ«rÅCÙÚþϾ,ðuÕ…ÇÂ/‰zÃówàü<ñ“Ü|$ðÞ©öËK«Ä>Ò|;«xgÃÞñ,Px‹Z‹Ë¹Ð¼C¢ºn4M–S&¡Ô뷈ħÍý—_‡Æ¬;›•zr¥‡Â`kRŽ.jw¥ŠÀ`08zŠXy:í0VU%LäP£FºÂÐŽcBšQœUX`ÝF&¶64'…eYÓÂã1š´*GUHbkC‰ÆÔT+Pôï|:Õ¼ãŠ~"ÿ„¢ÛVðÿÄwCñRhsøxÚkZ/ˆôïøsÁšœòxŽßZ6º¦—{§øWIž;5Ðìd¶®ÚgŽhã·ÊIGE 6#S é©CØÐÆbqÚØzªsªëJ8¬EGB²• 6¥V¦•eUå*Õ°u¹Ÿ6/£ªçÊÝia«W©F¼y#N4[†"q­MBqœÔ*St")z½@‚€ ( œuÉ?áeü{Ð<) ¼)ðÒø´£çÅé×ZoÃaßcxNëľ#º·cˆçÖ¼!t>e\ ~‡ÑÔP@P@P@P@?þÌ?'ÁÝ2ß§Ø<Ó È¿òÎU6„:q±ƒ.ÜPÐP@P@P@P›üVø…ÃOÝk‘X6¹â+û«Ox°̰^xÃÇÛ5¯†ü7híŸ$\]ƒ-ÕÖÖK+ Këù€·±™”¿Â/‡²ü8ð‚iÚ¦¢š÷ŒµíJûÅ¿üR±O‰üu¯4sëšœQ?Ím¥Bc·ÓtË6$YiZN™b‡ešÑ·È6ù¡@P@P@P@G$ÑC³Í–8¼É¼ÇTß+çdI¸Ò6dœ ù÷öm¸‚×áþ³§Í4pÍǯڋMµ‚Id™mÿhÏ‹wv±Â7~þQ¤,S6ÜËU€ú€ ( €#k^Õ!°Ð,?´VÁ¦|0ñ\ÕÝÄÞ·—:BFñÂ<ÉÎÖóMU©‹ÂaTcãq,%)ó»ªøÜ]<$=¤9-0Zr•HÎsåçµ&ã>ÜcjSÃR©ËŠ«>XÆQµ.E IÉÔRsRN)(*-4îæ­gfŠà¿ §ˆÿhCà÷Áxïuh´Ýø\Vðî¡ö‹yo ø‹Çð ‡[&ü: ;¿ÜÙ™–vˤ;Î4c[„¥VU1ÕHª±NR„ã¨%RU+_šߺ¦á)Æ6•Ó~nuqx®R¡%ƒthÖçÕÊš«²¬”\)%xF2ö²Sœ¥G•9÷:ïü áyôK_x×Â^¹ñ,ðZørß]ñ&¤O¯ÜÜÜÙÙ[[h‘j‘6«<·š…„Çj%g’úÞ5¦@ÙKÜ«R„½ÚÔåR›ÒtãN–"¼å8?z*0˜ºÓm%X\EGhQ¨ã¤‰¦ù°Î*j¬u§Éx%%5îòÞ­$¥{^¤5÷ã~5¿h?€qÙêú‹üoø@š‡¡Ñ.uëæø•àųÐíüJ‘ÉáÉõ{“­ôØuX剬žá£[¥‘L@Ã$ÿw̧îrâ%„jZ[]Ï ïkb °¸—*/÷‘Xz÷Šö59mÂP©:2‹jP•IÓi©Â:Sœ¢ýèÂ+Q§)4”gVœRœS设!xoKÔõXõ¯ø IЬ4Ÿêê7^7°‡Só|cªjÚN‘ý«¤]ÚAo¥i:奶~ºÑÕ®¤¿¶ŠÞÓÕ¯npt)×x…*0øŒEÆQ´iýS f!Uœœ]ûâ‰ñÀºÇ€4¸¯çÔ¼q¥x»Ãú‡ƒôè4•-ªM}âkMBM:Ò+5V7-ÊB“!\TVÿf…*•ÿqN¿/³•Or59êº䔬¥Í]:1åošªtÕæ¬gIªó«NƒöÕ(s*‘‡¿*|”•isÆ7på¢ÕYs%jMTvƒLóËÿÚàE¥ÏÃHl~'øÄ6¼g¨xÂz׆ükàí[C“Ä^‰u¬]As¨Ã⎫,z^—²Ì]Î5è–­ F6ÐÃÖÄb–q¯<\}(ÉI:ôhâ)ád¨E'*³•IVpQ#†ÜÔ°òˆ9SXêÂX|®¶‰jIº5q<²„'öiÊ4%õº‘©(J8HʺŒ J³øðöÿÆ:ëx2÷âf5 [À¶~(Ðî|c¥éí¤«}¨øbæÔ¬¬ÌZ…ƒ‰¦¶DÛ{nwbdÝëÒ­Z‚öÔpòä«RŸ¿ Sæpä©(Þ0—·ªßêz¬Z.“áø[F¹Ö|Qãfú[yÊi– ºeŽ8™ä»×¬#&8žYàˆ¹T­V….E*LF.nr”#ËJT¨Q¦œiÍ{JøÌN K—“ ±˜¨*ÓÂ}Z³”U<;ÄJ\©â0¸jqQmÕ«^rH&—,N£…:²Â,/´…lMüSàßòøïã—Á/x¦ÓáÔ'ø—àýW[øIà gâ¬zoü ? äƒB‡Yø…£Z?„&¿ñ¿Ä¿ÿhß¶‹§\éž’ øVö eÓ.ä×훦•k™f8*|Ñ¡•Òœ«9Ç—í¥•0ô£R’´iQ«_1©,L³è<=E WÖ ‘‹‡Õ2õŽRW«˜ÇB²ŒÒxˆ×«R¢U=”¨N•3¢¡QËŠ¥…ç‹R¨}Ý⯉_|  i^6ñÿ‚¼ªxªèØx_MñWŠ´/_ø’ùfµ¶6zž¯o.±t./¬¢0Ú$ϾòÆéP6Ú­ˆŽïqRäå£z«ö’p§jq¼ß<âá /zIÆ7i¡M:Xz˜º‰ÓÂQmN´—-(56§QÚj”ÚrVŒ\¶MŽ¿øð÷Kñ†•ð÷Sñçƒ4ïk¶¦ûDð=ÿŠ4;OkJ·Žo4¯ \_&£¨Z„ÓïØËom"bÆàç¾×EûgÛ¾Éý‰ýŸàøãûGìÿc›ûKÌÿ„Gì^G™k·ûCÏó[Èòf¼-?¬â14/Éõ|¿Žæµù½†/.Âû+][›ëþÓžï—Ùrò?iÍ >L/{ýR¦ Ÿ%¾/®béáoÍö}Ÿ´ç·+ç·-ã~e{Ãß~x·Tñ&‡áOx+ÄÚ׃n Ÿ‹ôx§BÖµO ݬ×VÍkâM?M¿š}à\XÞÄc½Žg:ãtN(¼ö‚’y~¿í)¯«û°ç¾þ»}ûÚCÞzjLá:Xˆá*BTñRJQ£$ãUÅòZJ›´Ú~Òš½ø4o›¢|bøGâ_kþ0ðçÅ?‡ÿ„|)öøJ×4;"a#aiͪTiâj5OVj•:²÷iΣtâ©ÂnєܫQŠ‚nMÕ¦’¼ãqBX«„QZÃÅέ?kJ1öœÒ©Oã„cìjÝÉ$½•K¿rVâoÿiÿ—? !±øŸàoÙüVñž¡à? ë^ñ¯ƒµmOiz%Ö±uΣˆ:¬±éz^Ë1w8Ô|O¢Z´*uØtPÃÖÄb–q¯<\}(ÉI:ôhâ)ád¨E'*³•IVpQ#†ÜÔ°ò‰TÖ0Ǫ°–+­†ÃâZ’n\O,¡ ýšr }n¤jJŽ2®£(#Ò¬þ#|=¿ñŽ£ðêÃÇž ½øƒ£ÙCVð-ŸŠ4;Ÿéz{Gi*ßj>†ùµ++3¡`âi­‘6ÞÛØ™7cE:ô«V ½µ<¹*Ô§ï”ùœ9*J7Œ%ÏC–M>h¸Ú颪§‡t#]:¹¨©®GV6“½%+s«S›¼.­ =¢íÂi_<â_‹Z¿ë¾ñ”ÿðxÿWñ.©áŸiÔÞÖü¯xC¸ð¦»¤i_ik-Vwñ”’:]\ÚÍlt†­ä3–·¼%?®`ñØêNø\"Ë*±\ô±?_úó~Ϊ|Ÿ¹†œß+ŸX§9ròÂ2“Q~–Qˆ£„ÌpµëÏÙÒ¦åÍ+IÚð”V‘M½ZZ&xïÇ¿‡ßoügðÛÇ~ —âtö¾ðWŽ|­é¤øÞ1Y|Yyà­F Ãí§Ïáyü:ñxRîÖøÙÝZjk,šh….­^è[sÖ\Õ8‚”©Ë‡Î0øJQ‡î–ýR®c*”±NqxˆÃu'‡S…ðóúÍÉa§OÊËáRŽQ‘Òöë ‹ÉêB´éÞ·5IË N„*ÒžÃë Ó«.½9^Ž;,>'%:8äðOÁ_øW_ýŸ×ûc£ü3ý>#|?º¹¼ñ‡­Üè~$×/þE¶:?‡“T ¦x{_nôÿiÖ1ǧ„òmVKxß|Ù*ø^3…*Ÿ[Æf9fW—a±ö¾×5<Éb§R®&¥JÒzÿÙøšõñu#WZ^Þvš­ }XiQ§‡Ë ¹©ªÊ•+å¼±­ìö‡-ù*òé ”£<K¥S Åy†h¥gÍO ‰y‹úÄ%kÅÕu¨9Â/Ú¶âçìß/šé?³ÏÅ)<%á}]ðr\4 ¿` k–w:熮Q¯¾ |UÖ¼EñNÂg]eÒå4òÚDgŽôKåiïw(hǯˆÆàêgµ1ÞÑJŒx£8Í©TpÕ:¼3G €Å(¸ó)ÿjRŒckNpUªB4¿xeYaã—âðXhFž]Åø:aJqŽeŒ¥,¶„"’…:upдb¹iЄU:¾ÉÚ'¯x«áïÄË ö•—Ã^ÓuÝCÇŸü âÿ i÷øU¾Ô|-§øGྋ¯x§ÃwŒïG‡#ñæ‘sá_Þhqø±­mVÐ4û›¤{SÚ>CÂÔ_¶‹Ë1y•ZòªZÂûlß7Ça+ag‰j„%)â0•+Ôƒj8JØ©P„ñÐ…ÑZtgÅb)ªs•L‚Ž *δ0øŒT!£S tÖ'‡žµ:P\•¡(a¥V•V¥+ð/º‹¬<®ø7ƾ$•ÿiÍ7â5ä^$×þÇñ ãÁš·ìéyðŠ}k_À/á¿®«£ëwp=톖e•¬í YϬÜ2ç«.ÄÇ Kƒ«F4c*9ö¥J.s¡Af9¦Y›á±³U%í¥JkWŒ†‹«Gíý†¾ QÆby1u|6iȪJ¬ðiÆ¢£µ«eyÎ*½l<](¨ÆK éKãâÝæ¼tŸKNÖ®´Í<¹Õ¤þÛ¹³´±·Õ9òÉ{9k­:­•d‹+—µÇœpø|éÓ§„•:5°µªÓY¥)c\gG†Ãb+QÄf¡RK2Š­<ÉB´«ÑÍ1¸Ll#N/÷¾½:‰âçVTV à0õ0 ¬já#C Jž]„Åb)`eñ©|nøýðâŽ|+w¡|#“Âß<9ð£ÃÚô÷Ú^¹ãÅ?…I%jÙŒpñr©‹„OSø;ð·Ç~¿ý—¦×´/°Gðëö]×þxÉ¿´ô{¯ì^ÍðMí´}¶Z„§PÞ¾ñ û]ˆ¹µ_ìÿšqçÁç}>cŒÃWÌøËJ§5×•Ï .Y/k5\îUœT¡ÉfÚ¢ƒ—´´œ'Ëψ’žÙAÞkˆó}¶ÿd¯ ÍR«weï(Ôçñ2|3Óáöƒ¨|!ø«ákH´ü'àÿ Üê¶+®øŸCµT¾:õø)^o.;™Oi9`³\šlOæy|1“¿µ«ŠÅb²IQXÒJŒ†]N–”THÍ´ðô£¼kBs [™WÅdõiàmû… kOˆäœ“­ïP÷f«b'xQ¦©%VU%Wç+O€¿¼Wà/|8›À0ü6¼øeû0|HøÞ+Ô¼Aá[½â?ˆ|Yoà]>Èøa|3«ëZ´¾ß_ê7>&ÒtMN?í›<†ùaîÅâ©â+f9Äp‹ÙbêðõXäö^ÊtòŒÁf5p•ª{:˜XÑÃáãS&Ë\'*U0Øüd±XZ0…¢Röu>¥½J•3l×ò1ŠÅa; ša©ãiÓÕª¼Òuó<>eЧ†xL*u1xŠx êÑ©S%óà’ÂáÖ JY`ò¼f’œ«C-JÔ•`¢è¨ã'ÅÒ„Ö*‚USÂЩjuqp~Mà_…tXxÿ]ðo|I+þÓšoÄkȼI¯ü âǃ5oÙÒóáúÖ¿€_Ã~ ]WGÖîà{Û ,Ë+YÚ³ŸY¸eÎÙv&8jX,Z1£Qϰ5*Qs 1Í2Ìß š©/m*SXz¸|d0ô]Z8ÿoì0µðjŽ3ñu|6iȪJ¬ðiÆ¢£µ«eyÎ*½l<](¨ÆK éK–%‰Œ+)Õ“§†„Uøpx¿SÈò¬ÿib°™¼›Ìk{DëS«…Åa>¼ÓU1Äf5eCšFq•U_Ø:RÅ¿o:_péŒzÆ“¥êñ[ÝÙŪiÖZŒv—ñ$Ö±ß[Er–÷Ç$‹ ÜK(Idp®¬09â°òÁâqYN–­JNPmÂNœÜ Ú‹pn7‹q‹j×Ièc…¯VŠ„eb)S«Ë—š1©4¥É)Ù'gË)Fÿ š³z5¹ã5ø®ÙxŠo|4ðükc§ØjÚóëž# x+Âv¨÷I¦x†ËD×/Û[¾K+¹­47E¾•¢f¾—M¶ºµ¹¹ùΠ⌯†©Ò–:S•Z÷öthÅJ¬”l¥+JP„c«¹N7ÕG™«R¡:ͨY(îÞß©Ék~Ômó}—à¹ò~ÑñçÉÏ>WÚ~ÏÚ6ýß7ȇ~7yi£âŸ‹9jo—)ÄÙ=©I;tºW³ò»·vt}Fóñ/“íOÚþy|ÿ¾¾"Rÿˆ³—Чÿƒ)êÿŸ‹îaý©ûQÿÏ/€_÷×ÄJ?â,åßô)ÄàÊAõ ÿÏÅ÷0þÔý¨ÿç—À/ûëâ%ñrïúâ?ðe ú„ÿçâû˜j~ÔóËàýõñø‹9wý qø2}Bóñ}Ìó†>;|$OEá €Ö±|Cø“⟊zôn|~ø›ÅÆÄêÍŠ4 kºÂ-J/ËœGüEœ¹̧ÿƒ)Ô&¿åâû™éÿÚŸµüòøÿ}|D£þ"Î]ÿBœGþ ¤PŸüü_síOÚþy|ÿ¾¾"Qÿg.ÿ¡N#ÿR¨Oþ~/¹‡ö§íGÿ<¾ß_(ÿˆ³—Чÿƒ)Ô'ÿ?ÜÃûSö£ÿž_¿ï¯ˆ”ÄYË¿èSˆÿÁ”ƒêÿŸ‹îcÓÆ?´f€Eî»à†6Òa>eý§€ücâ Åél¿|h/‹¼>úGˆuŒ­½÷ˆü;ظފ“õàüSÉ+Õ…,V‚Œš^ѨT§üÓä’¨’þå9½º]©–¤W»(ÊÝ5Oü¿zRü^øcƒ´Oê^:ðLJ|#âYnt½gÅzÅ…mÜÚi÷Ú¦£er¾!šÍìuM:ÇJÕ¤¾±¸X®l¿²/ÅÔQ)Ä_¥FµAN5`àáŠJJÞÎuhЄï{rJ¾#F2ÙÕ¯Fš|õ`¥ÍUe’…9JmÏ%Ô.칚VÞŠö»Ð5_Œ_´ hÞ<×>)ü8Ѽ â)a‡ÃÞ3Õ|qá;šì×\Moâ+½R=?S–Xm.¤E¶¸”²ÛJʈÚPœ1p’‹Ž+Êš«V39BTé¿~q”jÒ”\bÓJm]N7ΗïéU¯C÷Ô0íÆ­H{ð¤ãQÑ’©8Þ0q«I©4ÕDàýäÑGHøÓðï\ø¯â_‚úoˆtÙüyá_ xoÆ7úZjڲͤø–]I [+(5Y5 .l­ì´û»Ñ%Œ1Cmâ Q,‹©&Û£Fu°ØÌM5x`1“ÁW޼ôªÂ• ŽSŠMBœ§Yáã)¸Éâpøš\‰ÒmºÉP§•U”âéç«VÂÊ/Ý:3PºnÊJ­ªÊ‹¦çLjw^ÊHÛñOņ~Õ´-Æ¿< àísÅ­¿†t_ø»ÃþÕ¼E;\Ád°èZv­¨[Üjò›Ë›hZG)2\E7H ãIªØ…„¢ý®)û;Q‡½W÷²œ)~î7ŸïgNp§îûò„㸴•OÜPxš¿¹ÃGžõgîR^Ê1KÎVŠöqœe=}ÈÊ.VM_ðÿÇ_j^?ñÃ}sZð¿…&ä“ÒŽ„"»&êOÿJœ™ë`•¨úÉþ‹ô=¿<:€ ( € ( € øãÁ^ Õ|Uâ Ía¤Å©h ¿mOŒ¾-Ö·1E¡Øjø‚ðêqAwq—r·¼ci(ŽÑ'•fÔŒåQI$_Õ¼8Ã(Êñ•Ý¥Æa0õ-wøŒN[IB6MÇŸKMÍ¥hJJS‚—“Œp–]›aµkâr¹Âø£…̰øª®ïÝ^ÎÝD›M¸¥)Y6ø{á¿Ä¿†º—„¼f¿ õˆ £ê¿µ¦qàŸk¿muÛ ?Œâñç„|Udþ.ñn‹¡K¤^ø{FúŒGV¸Ö¬Ñle"ú;r´}®]S,ö4Üñü/ÃÙS¯QµK _+Áʆ+‰äŒ«¼z˜Šs©S JçÊèòÑš•*±Û:5qجM \ð´éç˜lÎ*œ5ÅEäðÁTÅCÝŒÖ;Šuý„jÕÃR­O«R¤ª¬+}ì÷ð³âÂ_hZWˆ|8·z4Ÿ³wÁ]x§AÕôkŸè,øc¨xýµO µž¥¨Úk×OkãÓ/mô›˜^ .ay-¬¾ZÍëb1®óœ3­Z½³ãh㱦§™)å¹^[V­HQ»£Ž©W/©ŽÄFT©aœq Q©Ï`y؉ªñÊëÒÂÇ |WT©ƒƒ…°4³<}à Oš1§Ft¨ÓŒ°ê÷”jÂ6¥ìª³ÿh¿‡ßu¯k—¿ üãýCÆôÏj:¶‘©ü ×~øŸû/RñÚW†>;ø ãe„—ðxO“Ä“½çÃáw«jzþ·oT£J4ž6„±õa†§¤ãJzôêP”íNœ¤¤¦¥8øœ^ý¤¾0øÛÂ~%ð7„õ¿xCBøÕñ+Űë>!ð¯ |/¶Ó5­;ÇÞÑüsàO‡÷z‰ñWÅÞ&×tZkžµâi–êÚ¥ÜÖúf©bb~-(ºYo²T':Õ²,Ç,©F«…8ЫŒ¤ñUðø/«UYulfêøYUU±øœ./N“XÙPêÅWLF*× ,FOZ•U':µc€ÄeбoJ¤¾¹…¡N¬…¯X?÷vC-íµÅ¼wë¨ê—ÒÍ%Nx¾!ÂÒLÃ,Ì(a0øU5F,ÆS•,B•(â(ÒÄÐÄa#N8jn”V–¾òaeKÅNK Ñ¡‹ÁfÙ–.µhOO^£¡Š¦èÊ4aŠ£Ëím^Š”£˜båJ¶¥9áñ›~&øñS ü}ðëßçø™ÄŸÙ›ÁŸ ô9¥ñ·ÃÉÛáÿˆ|¥ø¶Þ=Åz¶¼<—Ú"Üx’ÊóI»ð¿‡ÌûN™'Óô«&éö…dó T+Uö´p¼M‘gÚi¬N ‡‰­WÚËŽ©˜ažGWF¥xMãq9”ªT©…¬ñ¼ºTpyž_™óÔžQÌhTÀU…:j“ÅfXüj©ì°ÎXJ43*9”0y¥ $ªË †ÊèQÃË1<3>¸ñS^ü|ø)§ZÃ#OáoüNñ¿qîŠÃOÔÓÁþÒ¬nåS„mKSk¹­Ós á»`§ìû“Ï¡ÔÎó¼l*ÁRÁäÿS© þòusŒãŒÁIB×öp£Ãyš”åðÊqŠKžG™J”ðù`«^ž)æzÊœ“§–ä¹–.x'M{ ùÆ] JiÔx„é*‘§UÓú ¬ë ( € ( € (åÿ‚ñóñ³þËïÄOå£WóŸ‰òTUÿ°|?þ’Ï_üêÊ?µf³¬xsöiøï®øUÔ´-sGøSã}GHÖtkë­/UÒµ MökKí;Q²–+‹ÈfDxæ†Dte ¬¾3*„*g*‘S¥W5ÊéÎIÆtêfhT§8»©Bp”¡8´ã(·šm®1”ñ QRQÁãä“IÚPÀâ' +í(N1”^ñ’RVi3æ];ö6ñä>Òü_àÛ7ö»µø„4-3_ððñïÅX<{àí׳·¾Ž×Ä> Ô|=:æ‰,ŒðµµÌò*¬Šò$â3¿gšñf-Ì3,4¸?!Åà°8ŒUÒXQ­[Ju)Êœq4j©áëT‚´qaí(ÍûJJ3ŒZðršTó,W_‰ÄPXº8Zó–¬áìªJ4ëFj)óT£N¯,ªa¥>\MÏ Rje#Ò|?ûcø^Çö{øSñkǺˆçñ§Äˆ¤Ð´¿…ÿ|;¨xŸÆž)ñæ‹q}¦ø—Fðo†ÖA4ðCw¤ê!ïn`Ž Íqö‰¢I¼ì˅渗“äõ#[ =ÂëU§X|·‡Ãâ¡__݇- Xšq©:pæªã:”¨¸¦£Ñxˆa1ßÚu©R­“cqY^*³j4ëcpؼF ”h¨ósTÇÔÃóaéCšÞÑ)ºp…IB{?ÚƒÃ?~|lÓô-â—ÂO‰ž øcâ\ø⟅5‡?´­.ãBÕ×BñŽ™iö©Ò}.MFÎTŠ÷O¾–KyíãóÖݧ¶3ù¹ßc2Œ&f 4Ëêâ!†x¬»M8”áQá+´¡:5¥BQ­8(V¥'ì§9R¯^ŽG‰£[ˆ2¬¿†â1ªR¥ˆ„yqxZuðÔ«×¥)©Ð…jë QTP—µŒ×³tÜ'>7Dý°ü5à‡ß|)?„¾8|xø¡uðsá׊üa¢|ðF£ñ3ÄÚ ¦¹á­:K_xÞúãR´ŠÚmVì\ºy·“ÝÈO4KÄRÍôyÇ TÆñ/Ï <K“àsœ~lUjx<jÓ¯9CB1‹|ТԣRT£J jpp_?‘U©ȱºî®+…Ztå7S^”§[ÊÛ“¥J¯-)Ô©(¹T©ÁO–£§í~Ö_`ø+7ÇOí]¼-¡/†ÛÃãAÔ#ñùñôW¥7Ã?øC®#Žò?l¯ØE„›"ÉfäiÇíµóÕøk5¡œà²:téâñ9”aWWVp¸¼%Hʤ1Ô1 ¨K éBuŸ-H8J„éG‡=\ zXÈc'Vk,YWüŒ–1ªÙ’P£R¬1žÍÕQâ)sÆ‹¬å)Æ4}«”T¹/…Ÿ¶w¾'üJÒ¾KðËã§Ãˆ¶®xŽü]ø{îâðö‰¡]nD›]¹i´ûû™¯mmÕnꢧ …·AÜöc¸G‚ËqÙ¼3\¯0Àe±¤ëÕÁâÝuN¥J±¤¨Ë÷Qå«Ô¥^|ü°T*ÂQœ§ÍåS¨K ´+Ry…wCåM¨Ô”0øŒEIF_ (áù'gΪV¢£ EÔ•>nOÛóá:ëŒxãÅçÃ4ñ xq¿hK?…׳|[£ª§‡¥¾8þÑYßG‡ÄÌÚ;Þ¦˜ÑµÜmå );ï…àŒ× %9bðLÓN50ùV'¨æu•ZN¾¸>Z˜ª•èÂs„•:‘u½‹U# 1õ¿³êf§F­yå.§×›¨ðßW‡´Æ:‹I[IT©ˆäR~ΔçEV‹¦ês–¶7ü#ÿ´¯í࿈º'Ä|&ømá ê6¾+Õ<mo࿾—iâÛÏø“XñƒK©ÝiÞ.h´‹_(ŽôêSi2Áek Ìÿj(píZ¹Ž‹§UsTË«N*xøGýŽuqiÒÁÓŒäãW›æå…½Fœý£¥>HÏì*ù¸ù7Á?¾|Ñ>2jþ$xOÀð7lj3ÚÛkZ¬ «ê1Çý“¿û#@·2êzÃŽ6XÚ\6T¹¯ên ÿ’_$ÿ°xÿéR/¼Ñ| s¯„ôIuøÓQ‡BÔumÎÍ þئ¡âÏùÑÅ {ËÝ?D´³ÞI&š³¹úcè£ñö-dˆ¾ü&øÑãù˜qp|}ðËDˆœm™õÏSx>ÞúÌ ÒéUb7£–E1Ð-iûJøÔ„»Ô¾| ÑŸ"EðòÜü\øƒ$GZßV×ô½Âþ¾Q¸•“Cñ”( rHÝð¯À_øs]µñ†±ý¹ñÇÖa¾Çãωº³ø·Ä:Yƒ7ü#6óÃàxå#2Aá}+E…ÿŠ#FÁ±í4P@£Ó4è5 ½Z>ÊVþÖÊÊûRŽÒõ Ë=:KÉtûK»ÅŒMqkk.¡¨<1Hì‘5õÁ@¦g,Óqƒ§Ë Tu\V‘ue t¥Q¥£©*tiSs~ó…*po–Hz¸·«„\"Þñ‹““Œ_H¹7'§3n×.Ò € ( € ( €>_ø'ÿ??ì¾üDþZ59ø—ÿ%E_ûÃÿé,õðÀ^¬£ûVhÚLj¿fŸŽú‡ô­K]×5…>7Ó´F±ºÔõ]SP»Ð/a´°Ó´ë(¤¸½¼šfHã†Ýݘ*©$ øÌªp¥œdUjIS¥G5ÊêNrj1…:y†u'9;(ÂŒ§96£ÅÉ´“g«ƒ”a$ø;à׆¾,øwá߯Oëþý¤ ý¢®>|iñþ‹ãŸ>ðŒ~ “Á³jz’XxcHƒAø‘ý…q¯mák™µ«ë{½+V½–úHìaññyæ–{—eØœV]G “4ȱòl,é`rüFg‹«ˆœ¨MV«à Nµ14a…£ZÚÓj0Uq2íúœ³J9Å 5jÓ¯ˆ«’ÔÂTÌf¨ÃS%ÅF¼0ÕÓçú¦|Ò£GZ¬¡J® ‰tc‡¥kÝè_™âwñ}ÇÀm/@Õ¡Ð|ScªZ[Aka¡Úh×R5¾¡$¶o¤Ä'ûŒƒ“e¹ÿcò¼ï"ɸfŒ°tê?d¿¶±4êýZœhæN­:˜Š4è✫ÖÅ{Zn•:^×G9PŒÆ–#Kˆð9Œ)×­˜á³`°Ø “†OYn%U~ε)QÁV…YÓÄÆµyã),µÒŽ'ZSúßö”øiñ3Ç?þ>xÃø›<Ÿ~üñ€üsáË94o Úë5¿ø›Tðˆ¼t†ÓÀ^)ÕBEi¥É{ «åÍœ·).®ßÃxÜ&.Áckc0±Ÿ ñ>aŽ­†hªø¬i•äÙC­€¦”ž*XIÓ­Š”ißš• ºmÎ*¹ÉTÃä9B†gcrZ³tWÅT¯W1¦ñøXÉVŽª&&J6ª±SÃÁÉÇ*]à†Z÷Ä_‰? ´HôOø*6¤Þñ÷…|iâI?iï‰:/†>x~뺔šÕ¦¡{á]hx÷U¶Õa´ŽÇIÓmìn/âž[ˆï¬`‚kˆ~…fX\ºŽ/3n§‡xLm4ð•3IÏ‚ÄÐ¥KêKB®b(T­G^ue ´T«B·µTçË¥Uà±x «õ¬\t¨V…L,Ÿ<]^|b^Ïêô\=µ:ÊUYÒ¦éRu%N/öö¿=såo‡?þ|YÓþ2Áñ3á—¼s·ãÇÄh"¹ñ7†tWP´Œ#ÃT¹µkÍ9ÆçÃÚÏ ìŽ©¸7þI|“Ëý*G‰ˆþ5OS¶ø[û#ü/øâ ­gà•÷>éZ¥Ð¼ñ€4ß^ëÿüApQ"{«Ïx¼j¯¦_ùQÄ«y¢^i3ªÁFF¶V·¦ØÇcê*( € ( € ( € ( € (æƒÁ«|xÓåùnì>>xÄÝÂ~ô#YЈ¯¥1 ( € ( € ( € ( € (Å×ÞÃû/ö£ÿž¿¿ïŸˆ”Ä&Ë¿èmˆÿÁTƒëÓÿŸkïaý—ûQÿÏ_€_÷ÏÄJ?âeßô6ÄàªAõéÿϵ÷°þËý¨ÿç¯À/ûçâ%ñ ²ïúb?ðU úôÿçÚûØeþÔó×àýóñø„Ùwý ±ø*}zóí}ì?²ÿj?ùëð þùø‰GüBl»þ†ØüH>½?ùö¾öÙµüõøÿ|üD£þ!6]ÿClGþ ¤^Ÿüû_{ì¿Úþzüÿ¾~"Qÿ›.ÿ¡¶#ÿR¯Oþ}¯½‡ö_íGÿ=~ß?(ÿˆM—ÐÛÿ‚©×§ÿ>×ÞÇ'…ÿiM\?TñwÂOéÓü—šß„|=âoøšÚÜñ/ö(¿‡I³ÔÊäCw¨ÚjÖð¹.Ÿtªb~Œ/…Y=Щ‰ÇbqT Ót­ QŸÃ)E9ò½Ÿ#Œ»IñÕ-eßV{oƒü%¡øÃZG„ü9m%®‘£[4ë<òÝÞ\Í,ÒÝßêZõÃ4ú–¯¨\]^Þ_\;Ïuuyqq3¼³;7éÔéÓ£N©AR§J*0„RŒc«F1JÉ$•’Z$q7÷-XP@P@P@P@ÿÙerror_chain_aggr.png000066400000000000000000000356351160020716200356140ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.errorhandling‰PNG  IHDR°‡^Sh pHYsÄÄ•+ IDATxÚìlS×~Ço¶¬³žÚ׬T› æ<ºbV¤ºJºØ}¯âZ pÔ°Ø$’VÔvbd;œTAV‘“—µQ—À£•ñSxNÈ^I$V;R¨M(²Q[’jÉâÒŠW¢Èzk4k¼N)£ó~öMŒãâ$þsoüýßë{}Ï=V>ùýÎ9÷œÒh4Ê`˜RT@ˆ!„"@ˆ!ÀC"‘ÈñãÇQDsssYY„@ñÞw¾ÿk㯋¼.]‹Å&“ B xQ«ÕF³q·i÷:ñº¢­„»³wÝNw]]RfŠ“Ñôá©÷·í/Ú¸0x¡ZUÍÃ|B ßèuú—•/³‡ÃŽ?Ë!W$Éféæ+¾+/©^*ÂÛM‡~ˆü —Ë!D@Œ&cÓ{Î÷ŠSˆ§Çl4ó¶x"ùF¥Rj94ž)¶®•»³wž@÷X7„˜C$iÔš‹ƒëšëŠêÆÉ† ¹B,Cˆ€ûPÚX£©)6!zû½G,Gø\B€ •J׋×O&+ØŠ"¹åÛ¡ÛßN«R© D@* ÚO¿§x„èvºMFÏ !Pêêê¬oYïDîìâàEZ#‰ D@¦Ô×ÕSkêlÊe×JÚx°j»Šùø›0Ã&’èУØ.ÉÎÇ»î÷ˆ€¾€Â#‹rEÀØQ·#ÏW®µîëPÖœØ8ßˬ`ZµÙâÕñ«O”=!•J!DÀòh26YÛ­+bº^f†Q½yriµ±– ?S©¬ä"*zG&³óÌ‹Çé¡›Ö·!À X– ë÷C·×KÖ/ëĊ‡MA]a‰N"•J׋×O&+Ô&h7V.\Ÿ~_"vã&yݘ²0@ǧK[µ]ÕÑQ~É$*\·C·¿þ–’}}´ ž~Ï…˜èeŽeÄc­Îû™ll’Wfl~F¯ñy°ÅµÞ‰§WË+;R4º:ÜN·ÉhzCˆð”ºº:ë[Ö;‘;•=ö°ãæ2bãAé|ÏI,Tlp ˜˜1l’̘aâRŒô|9õ%„È "‘ˆœx¾ïüÒ-‰¬ÅÙ:`4¼=¼-®¶ØBQc_ ×.5N»âÀQ…½#±ÆÞÄZË\Y%à ÈårAw§@ˆð½VÿªþÕLºV*ºûìÆópUl@LÅÞ^EMÂ\$hO ÍÄòëgî·6Rr½O{½A¢bÎ}n¤ÓÃÃæØ›´B¼‘¼Ë<Þ~ïÚ7Ö@…Cˆð™LVÊ”f¶BiL‚†Ž·OWQâ,n<9±ñDå|C!ÃìsF-ñÇÚ“7™ƒå••sûc–Œï×z¡#·Á>¿sŸÏ¸ø¿je 5•çŒCœ Ï\¿ªv«×@…Cˆðš&c“Ûé¶:¬Iûb#µ‹ŽŒI°qAna€x›c´6­R-щû'Ü_?àþZi—+éÑëôk£¶!DxN§³>eméiáí4ÚäëOüŸ@ˆ€œ#‰Ôjõ…Á »t»xX¼+¾+›¥›% „Èf£ÙÜbæ§½ýÞmÚ©j¾#—Ëšý)³®•¼2ž¹6~MíR¯™ª†z­þ£þø&Ä‹ƒ5jàÖ…6õuõÇÇš:›xÕµâvºGÜ#k©ž!D€X,VÈO`GÝžéêøÕ'ÊžJ¥" ß4›¬íVþÑãôt­QÁòlX¾º½^²¾à…¹¹3æt Bˆ€Â`2šÜN÷Î/Éèà¨Z­^KÝ)"C¯Ó¿¨xq¿mÁ»V(_þÀõÁÚ«aÁ ‹_½ðnË»ëþf]‹q÷Ç»¥L©L&ƒ…ä7¶ßx<žU~Ƚ{÷JKWñ»ÿ—ŒÅeY“Õ ! $dqVù!ÕÕÕn·{íµBˆ€åA¦Ïç;uêTss3jB ¨ioo§Ÿ]]]&“ A"„@Q‡‡Á`^„Ãa‰"ç@!€ðp‰"‰"ƒ);$Bˆuxh³ÙèµÃáhii™E!PŒáaYY™ËåR«Õ$D’ L&Óh4!DŠ.<”J¥n·;y>W¹\>55END!PDá!ņdCú™ò–X,öûý”;#H„( "‘YïAïR`èp8V?a„:nÉcÔj5* B D€B D€B€oÌÎÎŽ~¯­­oEbYV&“-~¾B@À„Ãa½þµ@àS¹|ÓÖ­ÇÖ•ýŒa&ùVªööƒÁ›Ré³.×’'¡€*}}½]]o÷ôü“×»—·…lkÛÅÛ²ÿG}ý.‹ÅªÓ DL(êêúç±±æxV‚\þ ª@¥ò]©t‹\.‡*zý«ÇØp•ˆDárÕ××7Œý{žgi„È‘H$¼Ê²:TÅê‘JÅ swzzZ&“Aˆ@ À²ÿ€zÈ,»‘ªB@ƒÁçŸÿkÔC¶xüñG(èÎóE!D€B DøLè³êò3¾ûÛ;üÑÝl®.6sºúˆyý¦÷—’|Ü[ür¾üÜ„€À 6*í)ûF•%£ªÞw¼ë²ãÛÓ¿-7l(„‰¾:\rÌžzkßõÞ<Ô(áé×!Pp>·À-QŽú 8½-;âM_g˜ ó[ë½ÎÆ<Ý]܆­oF»7%Ýïuƒù³myŠO!D„“)w‘0T‹²WvwÔÏ ïÕ8¯òÕyîî’nívúrb8Ä0" )€zÿŒbCGºX‰e{{·46&ÛpacÜÎ7 :ó|[ä|Æ8+–†Çƒµ'“Úr"“®µñ{¥J fSwÔÙ-´/B  Ì|s~nؘ>RZט܀˜ÚëÂ0¾3å%áÍ‚´§<é}Ñj†Ô–AAÒŸ˜AóåâRÙ•ØÖm:ý[¥œË²" •8“Ì1K.nŒUÞMΩçˆ÷¢\÷MOaZ£×¹1vpÂS3i.æÄ%…8sÚ+UrçOüôE¥JÜ×`Úúf†E³³ÿ‰„!D@2iãÞé½vÄ`¿èÞ4míðÏ iÜÙj¸n¿ö}ˆÙ”pWtbhúœIé —4òO“õ’K•jÃhÆ­¢úÓCCC_|ñ…Ûí‹Å"k_Ý ¡ï)·Ví‘.j±XèE}}½×ëÍÏĈ"3ÚèùÀî´-jñ*>Gø·º4Iöl}e%=æmmm¦½½½³³B`Í"ÙV¡b®Û»>;À.êhž‘S±-öÆ“[Æ~n:Ô˜|ØÌ¥s×)ÛÝ(Éq)İßOÇZ ¹Ò‹cÿ/côøsÒ•Õáp”——S´˜‡ÄB PFü¥µõŒÏ~¦¼drñÀlú¿ÕÊpÓ+­Œ;üdR§J|°Kë6Ó‹-Jc3ˆa7’‰}£]§YvnOÒc'éc09¼ÑÙÍÞ÷x¼ß9µ£YÒx(ºŠ@—<¨R©›››!DÖ,s}#¾ë†rcJ[œª÷„hØî7[íÇì±A- b®Þ%¡és ¿D|â2Š÷ÊÆ>êK4ªv´ªFç‹°®Ññú¹ò3v¥1åÉÃVê°›xï3³š'öl6[uu5„ÀÚ&þ Ý|H8Ïâ¡|›º£ïH8z)!r}Çô*Ö}¼ !2ìߕ®ÇmøúM¯ôRõhr„ëJó3w·€}|‘6§ß„@ÁÅÝÑèîŒÔ™é[){<4’ôÖ’'¦f»Kÿ#¯*eæØ»wïÐЄL]]R©t8" Ø‘J¥”5ƒÁœ®Ã!„J¥Êõ¤"@lݺµ¿¿?§}Í"ÙA"‘\¾ìG=d‹üéñÇ<®Ç²¬ÙlÎéE!D²ýº¶·¿…zÈãã·l6yòž²²2‘H …èo„ß#D†ùóPhF"Y—ÿ«G"ÿ3;{O,þùÚ¨LºªÉÅÍ…r¹< Bˆ—ë_ôúC~ÿù¿tYÙÏŽ¿Ôß?&“ýíÖ­/—ÿB* ·&[Z†m¶ Sö?ÿüóÓÓÓH™FÖ<4TY]ít¹êó¬57o“ËË5G_ß&öðÏYvSUU9Ë>K–PlH6d˜§tº†ÅïJ¥Ò¡¡¡Åûggg³2?„@6q8~ïóù”J³DòDUÕúüàµ×ª††&nÝú¯pø¿ÿþÅ~ÏKÿŒù þŠ~$£Ï/¾øãôô­Ö£ rãl¡" qq„ØÖÖf2™²2„@–Q©TrùÔxœü_ýÑG­ö/]º”|õ{÷þïÆÿ¤—/3•••;wî,-åãï¾V+“ËåÉj#* —ËEû¹ÍP(”êõúx8œö€ìC*N¡ `0ZZZ<OÊþžžžæææêêj·ÛŸ9¨W ™N«Õ*•ÊÎÎNn"Õ-×щDèFÈûSSSÙº„À‹I/_¾Ìņ)]´ä‘³gÏ’£É’”ÔŸ:u*³ie*ç‰'Èïtk*r*¤Ä™lHfT«ÕY|vB@¨PÂHî œÉ”WÖÖÖR0E©åñãÇI|Ü‘ô–×ë¥ôº½½~vuu™L&A‰TH«ÕʼÁ`Ì>44DB'-Ò»ôV¯! $Âá0ðóÏ?çâA2 ˲‹…¢¿äv4r%){MP‚ÌõKpNá>G@A"¹ÛétRTÈ5 r·ÀEÁ\Û"„@±@"à$H?),"TUUQøÉ)6$åq*éééID‚\xÈ!¬ ‘îW£Ñ¤ì·ÙlÙ½„!÷QÈI‚;’àÖ­[)̰½Œ×…’Ø™Á¦€‚D®­0¹ü´I;!DÖ ú%ºD¸ÁwîÝ»—¤¶Ü'ÕH|”ZRšœâ‹äðPpA"çw¥R™ØÔjµY¿„@Á m%$Hy1Z­ÖU®ËÞßßï÷ûSbÉ”ðPˆA"ý… Åsc‰Äb1©B@Ø• ‚L|¶’ ;Ùê ɺ\®ÅO'ÂC›ÍF¯GKK ×÷"  ‘ Ï ‘þlä¢Ì"¹%18†“ å¿éìܹ“~·¹q0Ù%m~°B®¤ ‹„H¤R£Ñ+H¤2ëtºÁÁÁ\„‡"9,“È… 2 €F£ñìÙ³‹c·<@$ùºÝîdS‘¦¦¦È‰Â ;;;)_ÎQi!D²ÃôôtB‚$D.~øà˜ü@á!Y8112‹ßï§ÜY@A"•™j5G!°r’saÒ ¹¯ªª*óÁ1ù!‰õô.…Z‡cñSÏÅ „À2˜åFR$˜<8†œ’­ W²ŽN§[ò˜¬èƒX›¤c³ÙV98@ˆƒ`0˜ E…\.œÅÁ1B€×âpó&PþË ŽéììÌÝ’FB€/D"‘D—Hbp 7sLAÇ€¼Â Žá$‡¹\˜ƒc„@>HžJZ$%ÇäâA!À/R¦’æ¦Õjµ| D²Fb*iúIy1Úl6R!Ç€Õ1p¸DiO|«?ÚÍf¹ ±Ë1«üÜÀáÃLwÖKxNòTÒ‰Á1.—‹WŠ¡ ‘íŽF»¹—¡ÓÕåçöÜô6JrW†ØåV«T¸¿_g1xP$±¬7s ǤÌ`í“2•4…Üdúx#Ĥ¬ZÕ› io—´w‹Á`'ׯœåÂ~F9whüÈPâÌùSRfnóþYÉYzr2?·?Ãb‹-*K쉢¤/ ¡P(‘ 'ŽÁƒ"€wBŒ+ˆé½y&¶Q^ýÿìhÛæ¾ÆeØvÍ(§¾K¶šÓ±Èd`C K)\<²ÃäR›l¬¡µŒSZlHCÆ–‡vY×ăÛ4Ç"eãdNÀYÒ@éI9dV2‚ g¥ùc¥þᬳË]Á÷ÒrÝËØñºßW’íHЦiâXχléÕ«¯^YOŸïû¾’¨œèpN’a§Ó—ÐE±ÖŸð]ØÊ qÚ$_»'[ó‹•l+«Ý$TŸÎ4“‰!³ÜH7J%µhxU„xs˜øj4@xüøñ?üpïÞ=¢†Z­öå—_nhhhmm­¯¯§„cN`÷ ø®(hz bhÌÉUË( Ñ£`Tc 926ÎÖÙ*Õ›Ï+–¤[;mGɾ:£qò)Ï>lyŠ…x˜ñŠ…7/^50=ýU__/M¿d±4ìÛ÷<~…"¿üòk*õsSÓŸz}Ïž–ýAQw…µÀÝ»fg'ÂáŸÏŸ=û ÎxMbüN„¢Ì¢MD›Bqª¿l•ô+Ýh&_ `ÎSŒñ¤•™³¹òðvœŽŽvî×Xì3R¨FR©ßÝîE»ý­¹¹o1¨1J’ΪQÌË1?ýXs½…|ÿaÌ7Bãj ¯ÆÇ¿Ôëy½ÇðËS-Zí³ÃÃo_¼øÛ}nx˜EƒìrAä —­sû;åâ“ÝNn}€%>9RUá•e Rn÷ùÛ·Ïágz{™<]]`¶ÐnD’Ãrþå¸c›%‡·~®3ŒÌ š«'¼2‡Ã4ý"2e úÄææýâTJ´ÆnDŠéñÙ¤ÄB‡ÞÓŸÜ"ë fbSTäNœb2{Í~Þ¡ðÊ€üú-–Wð›"Fã Ñhí°Û‘ÊLt1h²}xOã~¾<{õúü†Lç ?w'8¦±f„iwQ¬Ó ñûÖçálsxeL&÷î}¿9v­ òêâÈg×ïîS,­ük¹[)c‘„  'x°Õ ˆ`»}£±.Yï N<ý^€“ö'u<h¡w¬¨`úS¨5\§Óã–êï²²mü~«³YqK˜ŸŸO¥RGÅYßfâ“_œû KLaZX"’WlvTSL¹€ B·Û­×ëÀ9’NÙiKRçL8¶D£«µ¿Rz'BÙ:ë ›b¡Y¸%«]Ÿm™- @kY Ãá°Édºzõ*Î÷îq•Q?×Ôé­+®×|z;3jÁ³±,)¤„§ŒÌÍÍÕè³óD£”óQÒn5a•ùtÌ´hpÖd³­r¼Ó4-g7±ù.u²JÖk:Óìg/Õm˜ f·Í¥¸²ž¾ 5/Y5KÊÊó‡-èáòMÎvÐ[Ê3=Çmì »°æaŒ­´ª¯fËnH®ó,YÏ«mmË=‚XMR(B¼am¾_-~Ýž•§ »Õ"‹Ý¬ ¶ƒæU.B-÷¯_½œs ¿ñ‚iDr=³£v“R²¥g É7ç€Ê””Ktí&Ãæ³ló¡Ò]t½™ì+r?N…%r&Bùž/ö¡8?¿pÀ™_èïbÙüÛV| ±J¤0<“Étùò~s@äáÃG :´Cõ ¢ ”/–ƒ»IPA}²zâßh]'Ö:B6IÓâæÓ&ùºþ:PÖj%5¤3òd°S1é{B˪<Ž,NEmù7_ÄÇ?~û†9yò¯øÍÌÿé¡;SS Ú¡j14æäˆ˜e…%÷º»øä﫲RÂx‚.":“=ŒXÒæóŠèVþY”ì«3¦¢ n-SƒøBQçXÈATT¹X›“ƒƒoŸ=[ƒn#jøñÇK@'½ªSfâ®L嘩ͼf^Â"›¬<Î?ß„³*ï20ï†æÖjµ7nüÐ××óùçc˜F5¿·>™ü5™üQÀ‡ÿuÿþ/?ÿü¿Òµõõ{Þÿ?R©ß‡†þQKGýÛo„B1îÏD õz=¨Ê‘++Á=Z…ÿ)ÊjD­ss•óbjëÜ©‘‘­Hœ§¦®„ÃáP(´;'ö¸ø0IDATŠoËËËßÿ}¡µo¼ñÆ›o¾ùÌ358bï^í¥Kç-äÕ/ˆëy¬\i„®8¿t9/g¶JŸß)­9.¼QM¸'¿òÊù89ÿrܱKQ Y@µ?»!·Û­<·4}õêU訇Èôøl’qaa,×ÌË:θœVCcv ØÊ?ß½R9âr5Ç'»œ+* +¯\§8L]ÖlšÚYMšHrÆîînE—Âììl*•bÄþ`v0e¦e7²ÎMüc<é ¥ÉvÛÙ²s*Âåëôgk–Í(¬¼òÌ,š\œòú Éh»‹bß·k³íZãÔ©SDOž<™[òÑG­­­•L$6›íÝwß%kôu‰ ê1£5yïSç'áxò.-÷kc¡ª7Uyå›äßì('Nœ zwìØ1â ÉW¢†—âñøüüüåË—É*âEe¬ÍW'‚jD¶™Ã‡ÏÍÍuttMœžž&¶‘¦é^²(ãâââÈÈ‘NÑ6"¡DP³™ ƒv»=™L~ýõ×Ä6æVq<*@>¯¬¬\»v 5Øí‚¨ÈdPb±Xˆ&Z­Ö‰‰ © *ʈ…$ 5ÇqH¨"¨Yš››oܸA|b8.>'‰$Ô§P"¨YˆË#>‘h\™“4‘P"¨eˆû+”2—Lº‘P"¨5žÐÖ!¡DŠ%Ôápxvv¶¯¯øG$Ô‚Txóx.¡&∄@Ú‘&ÔD¯]»†„@jía$Ô‚@‰„šhâ¡C‡ˆbS‰&‚ €„z=¡~ï½÷ð F"H¨ÃóóóÝÝÝÄ?’%Ä6"¡†  ê„zhh(‘He$ õÉ“'†AB A@½èõziB½¸¸øúë¯#¡† €„šÇëõ"¡† PC¨ˆ³[YY!*¶µÕ¾öÚkMMM?þøã•+W>ýôSâ%_}õÕ–––={öTÕáWÛ'¶]|€u¦§¿êëë¥é—,–†}ûžßz—ñ e2‘úöv}"ñ?þø?ÉäÊž=ÿ^MÒ@Žú¦ÚÎûÝ»fg'ÂáŸÏŸ=û ª££]§û5ûL•24ôŽj=•úÝí^´Ûßš›û–øw"P/ãã_êõ¼Þch Õ¢Õ>;<üöŋ߹Ý熇Y"P­5H¹Ýçoß>‡¦½½Ìž®®£^D Âá0M¿¨æLH}bsóþ••"P)ä×o±¼‚v"Fã Ñh)3P)ÉdrïÞçРD€ žÐ7ëRÁµ®Ói±Š¢_·f(ß…€£nËŽ‘epÂÃ<˜´8©ã±@ ýÔã ÷UtóÖú5£òy†KVÍ=_ìC A  EªÝÃcޤÓG¶Èí¶ _PC‰ÓõwYÙUg÷õÖÂ-AÔ =\ rh;“ô{0ž‰ E41§("›°BœÒeH}¥4/StQÉ;°òtJ/ ©™¬ê‘mŸüÂà\¥òïw rLÛzOœ¤ùtÌ´(ì±)›r ¾Œðòî+_³ØŠXÚ"Mdô¤'<•7€b)gеdeGûÛ }CÔ\{5zñ×»ìù.**sñ+WQ;ªa%ÒP¼€b0„µSm’deJ¶ß]ce³ÏäjåœvJ¢S‘ÅnV8ÛÁVºDðe„Wx_kæf šDI-ÚDy!2M³ùн{‚T kíbó,Îù ’gv±£ìÈõ¦~Œ\ëY؃ÉnþÒÍÁ--„Ž0ŒrUn­µß,8©âê'G–dÖ)+6i2˜óM‚4ø—8*€VÀ-±¤Î´P§P!½OQÙ ¹UÊw!óŒÅ‚§J‡Wx_¡1A •–<×nY¬‰òy}Q¦]§‹ÓC(ŽÑlc­Ä§BéÍ¥o÷£œì£¦¢_n–àmŽs@ãܸîÞ8Å/°Lñ{»üÒ¥õYïcìñ5±|IE—òvám1ÎPoR-›ž.÷莔¯Ð¾Ä&í4ÉSÿºÖÎ&ŠÚ–ÅP¸‰§ãú[nA(Ƀ;±·+rlÉðÅ!XQùÈ;ª‰TË|šj /¾|3zBØä5yÅÉ5ù‚ýÖ™‘I†Ó4ºž$‡¬´£MaUŠÝUR´@üºŸÔ¼°æaŒ ×)q@uŽÀ„#óYlån.Ç[žl\¥LÁ+yt› OlR4îJçƒe?ñ›m´2†RM$KÒMåµ €ârx½›$€®ÓÆØèš±:¯L¶Šã-B®—€¦²ýú|jfê´QNç@£$Ïôú C±tñ Y˱£v“dÄ ×;&“MF"á¶Í >¦Ù|xÆvŲ3†þzÉ Šà4]ffC ›(c-÷à ˆ@Õe¦²³çÄÕ¶ p}Š#ÎÙ[êÞã~ÃŒ¼†&__2ß*WP̸ëŠ`„µœ¤ŸÎæj³±ÂO·œqÍpD543ò-m‡=,<‰á ÂËŒéó“xdþNlÕ1äo"¥ÁÿÂà¤Êœ–A x²œS1*7âÜ=iâ ÝH×矘ͯ2{²@ñŠš]§=÷ílN5&b&éÌçm¿±hðOžÑ“¾`*1¡½tm"P+åÌVÙ˜m)·*rG„´m5é–Í¥¥v·q¹tIù[•“¥ßWÉš«Š5Rf€C"å£Õj>üí ˆP&“éòå9´yøðQCƒ‚T Ã0'OþíDB¡;SS ¨Nwôè{ããÿÿüo Óˆ÷Ö«ß~û#Šét&j¨×ë!ˆ‰³njêJ8…BÉdRðøñãgžQ㵿w¯öÒ¥óKÁü‚ÔH³€jßn·ÏÍÍ¿Œ_U3??ÏqÜøøxoo/Z‚€ªq»ÝäïÈÈÈ©S§`!ˆ¨Ú†Ãaò!‘HÀ$B€=Ì“Aö0L"ØC &‚ìaX±&‚€ªíáàà ùìõzûúúR©L"5ÚCá.©Ã‡A$"ØÜÜÜÑÑ“A@uöÐd2ÍÍÍ‘¿¹…‹åÖ­[Da!ˆ¨ÈoHÔüU¬ÒëõÁ`äÎ0‰DTA2™$ªWh-1†^¯—ˆ& ‚@ísâĉ’e>Œ†‚  ˆA"@‚D€ °[‡Ã+++‰DbgÃÚ©]ët:‹õ2=ýU__/M¿d±4ìÛ÷üF¢Ó‘½ßÜ©½ß½ûhvv"þipðüÙ³Ÿ@Pí:ݯ±Øg‚í0CCïìx ©Ôïn÷¢ÝþÖÜÜ·Õó "Oññ/õúG^ï14E­öÙáá·/^üÎí>7<ÌBP©TÊí>ûö94ÅFz{™<]]Ð4 A ö ‡Ã4ýb5dÊÕé››÷¯¬¬@Päj·X^A;Âh|!"e@$“ɽ{ŸC;ì ˆA"»Ð7ëRÞ56ß…€£nCy0ipr¹¯mÁô‚¨8ç€&z:í1–Y>>ù…Á¹³*¶Ö¯•O\²jîùb:h"`q'…b'{ŒeJR<ºJQû7éSû5t­ëo¨¿ËÊ®:»¯·Zj@!ˆìjŒž`k]ŠÆ)ê© ÒÚ‘CÛñ˜Ä2ž‰ E41±û‡ *GÞÍ·nèrËIž»$,¯ç—˜OÇL‹'qŽM.Ų”<~ –!•xÒžšn8"»™øu;?ØÒd¢%K 3œ´ ;ªa‹}D»ÙUþƒí`OagüËÿßÞÝ5q¦q_¯j3~¦Âi‹]ôN‚ÐF[£´6H ‹…¶¨U‚I•Ô9Å:¸zrT$Ð9h¡o;âγÛ^b{SÓ™ZCOj°µæŽêÄicëØø5Ü›Di„€©„d7üÃ8ùØ×ñïóìûîn—´g¢F§#š›çú¥©öØ2Š©‹ˆàMe±ë]^©Yu§ ëª•ÛÒÐyêÙ>‹r4vK)ñ¤-Õ3lGýzò±Ëö‡¦ªÙÙ}{û®T†’5MÒÛÇuGHàÆ/vxöˆ¶ t0ÓÜVë+W.!Àîši15½âÐÒZ#I®Sº]¡ýÔqñy?o—NÉN|hᇬý¸an„¸ÿ4t‚Û¥+W®Õ×ן?¾¡¡Áç×C p1ûn $Ùw×¼³Élk–e[GÈú~úüY%¦]V˜ç—iiB®¬üv׬;e ½Å¡}[õRO¤!8.++‹¢\.W©TDø¥¤-;)’‰²­‰”Çf‡.Î¥Êì]³©Ÿ~Ùôá Ë ¼¿9R©TFGG8p -- ÷‘‰›Œ#ÊËdûjãîL Ó†ü9èsWÄ‹ã©2Ò5š0qšÉ4Ò,+Šœœ"Üg)çX„øóºhZh›‘mÝ2ÃùÀ¢cÞÙy¢¹ÿöùv"FäRG÷L%©—ç"[iéÆn©‡ÿ2 èÕêääd"ÜG-—¢Í=[¶W^+´W…RåšÆ½}ç£sµ·Ó†ST»,d½Ì¾q ®¹ì(ŬQºÊMûÌ5åñ3öÒÓÓëëëˆp¿‘¸kSn™SãLÇ´t ¸þ‚}ΤÝ—§.™¨À~í†5LÙ^*Õƒmñ½eff’"Ñb±ðù|"ô[ vw§ôÛ8÷>$@ÚR- ÑvÚ¾¿-íÓ&á5q®EEËLÙ$ŠÅbFã«#‰Dè«c¬ôËq´·¿8))©µµ¬ˆÂž |åæùà6 Ãûê/@Z¤ ¼|ùwÆ(d(ªï’oo¡iZ  †¨¨("€¿ …õõMÜïÀÇ=ïòå럟–öBUÕÇ™™Oboô¢Ñ´ ô*É!r¹àŸŠ¿DGGðx£$ö†smiÑö=Èà«[×#†Ç;~ü³œœ ••¯‹Å3pßúk×nétçøü ’† ïî¢išd"IF"€6Î*Õ>ƒÁ Óé,‹osóæÍ‘#}ùoâDžBñªHÔo½ì(ˆþ,ÊÎçÃHLLljjòùÕX@*D“É„–†–Z­Öh4UUUÙÙÙ¬dddä±cÇz½h6›ûö×D¸Žó@JKK333YR$Z,Ò ;wФB¬®®vÞ†„8Ùf¨C0¼ÊCƒÁਸ਼ØS$òùüææfN—ŸŸïxE(:·Ìuuu999§OŸFË .XU$fee………µ¶¶644¾˜D$‰lÇ[$¸år¹D"ê~0ËCV‰$ì IHbQ¥Rõ\#¶¨¨Èâ$1½0 "Àp,YX$’‘TWWÆeË–‘z‰ä qò–H$òÎì<`8–‡,,I.—””¤ì cv¼•——ç1 †WyH:SòX©T’þÔjµ²ªH$2Ã0¦W7M^D €'ËCûÙ2¶Ãs$I’&””c¬* R$ö Ĭ¬,¯å5`X”‡B¡°©©Éùd8‘HtòäI’‰¬*IL“t®¨¨èé£%‰×¾àÿå!© Iö½•éFµZ-éYU$æååÕÕÕ9ÎøNKKóÂj"ÀpA’…¤^ï’L©TöL_°AÏÊ[«mˆÃ…;-§ï ï’c )i½|- "°Žc Ž÷¿lä“¢€@@  ˆD"€@@  ˆD"xŠÁ`p\—ŸÐét<O$a· üŸ^¯oV7é?Ò¿úÚ|é;òJÔŒ‡ùc$x£Go”YoÜÒMä)ü¸¨ˆYQsOX´Øk7üD ÀÐ2™L¦õ°Zó6jzPRØäÂù“…Ëg &ŒàS–«× ß^2tž¨Üv41ñ ³pAÂÒe$oч@Î0¥;þ¨ûð}fÖÔôÐ) å«y£pó³ü1£Å3ƒÈOvy&Ö´w¶¶ì]V^*|42o{Ѱj«ˆÜf0Š·åÿÝ–·P¨*^>ø_È„“E© ¦œŒ¼‡&î,‹ÅD`uƒœ³!ÓÔÑ^?+9éYÿþä(šüèÎ\(Þ(+ x³ÚË÷ÀC €[êÞ©­üóŽÂ§g&'-Ò/rtÓ$å+S’VIò·mG [X,ùÚtÞ÷ÿѾ,æí/%™¨ ™RÜz$1îÕ¾w|L¯×g¬x¾0>,™ë坿z dI¤¦½3vÞœ’Ý•ÉËSˆà3š÷þQZ°Y»á©—Ñ )&OÃM1+vlµÕŒ~”‰D¶3™LòŸoXõ˜×¦PÜA¢¹aÕ㉛ù“ýfñ6€Õ¬Vkâ§Z^Š¡Ƴml$›2æ'ÊV«ûÇy~DV+زyýãÓX˜†¤h-a„òµéÚO>E ÀÒ¼§È‰gó Å3ƒêOtÖ½S+Y+E ÀP5Ë9ò—”©³Ù?Ô’ÅÆ¾Vœ¼<…Ïç#Àó*vï `ÿPÆd=1½ 7GY£B €‡Y,–JEù¹bΜ ’ùdhØŽ¿FNÏ® ØH­V3áÓØ³êÐ/DhØ_TüG"xRý[ÊÂùÓ¸5f‰è·±{jˆàIf³ÙØqF,áØÅé€ñ‚ñêõzî®ÓF °Žm ˼ßqqäé³®¯}Ó|è â™{n¦;ôVìQWo„?unc(íÁu|:¢¼-wÓº]¡÷Ø09Š..U+ß®E €g¿:+\íÖ¦ϾÁLcùáG«ÕÊãñˆ0X$M¬×®±ê:¿=%Àd2qtñ €]HšLñÄoº°e}›pÍ$ÙÞ6ŠŠÔV¹ëé\ñ^ر5³feKÌ8W´oé~‘Èk6›ˆà$MH¦xè—uÊNL?W½ÎÞS_8r×Ó^GIîa^ÒÔçƒÈgܯK2£;À¾ ñ!·±ýXÈúc½^sªõ(föTÚù­ŸŸ^©mm#[Þ™' Úµ)²¬¼­V$ pñA÷=2a<Ã6#1r„»[ßkR%"pœë§]çÛ©ˆ§wme`›ñE¸ø E ýç#Ø…¦éfËO>øâ€ñ÷ñV¯ÞŒäìMJˆì"Ì—¯úà‹»~G °”@ ÈÚRPÐT«|î1–µâŸ_ŠŸŠŠâú>G °WæËæÕ¾MºQÑôɬ¤ù‡«•}úìû~°Ãˆ¬¦Úw`ÅÒ„ãÙϰö¦õòƒ'{”œž\F pƒP(,©Ü³ìÕ--ë°pxEG¿ŒŒ[šœœì{ÀvÌ¢%æ 2öW©ÒØu0‘¤!5s~ÑÎR¿ÙÕDÈl'³*+t—§D(ü( ˆ\ÊDÓ7gsÔZE²ïWk“4l£&«ö(ýl'#8ƒ4§»_Ÿ§P6¬™GŒ÷É,W¯¯øë'BÑBÿKC"Çdo~E³`YÆ‹y fxÿ$Ý™ òC'ʆËWp@ ø‘H¤=þ™|mzkçÊÔ9ÞYŽc½q«¸õ”þR7ùjîÞ!à‡ø|~ÃßšëÞ© y%wýÂl±pèNï#QXõqGåGë7üA»m»ïX"WIÖJ“—§TìÞ¶C™öØô¼¸0Á„1üý–«×+tÆêÓV¬<þùA?. ˆ~R*½ö§ümÛ«ÞÜ]²“™õpÂÌ_3áÁƒ)II¨iïlí¸¨nûïz¹üt] wï‘‚@vx<^ö¦Íä§®®®ùp³üÕFáÔ@qȤ¤ßOsÿ$hCg—-¿îÒwt2OÇ&<—©8"ñòˆÃ²‰¶#ôz½N§Ë9x@ÿ¹Z,ðÇ’£~3aâè_õl|íV·þÛËöÖøšáì·Q³B™¥I…¹~MC"ÜEd—ŸŸOF³Ùl« ‹ÅÒ³ÍD¯P$rôÝ~på."ܛЎ<Î¥€@@  <çÿþÑU¹Ü¹© tIMEØ6 »ßÂYIEND®B`‚error_chain_aggregate_without_terminate_disable.jpg000066400000000000000000002024351160020716200441260ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.errorhandlingÿØÿàJFIF``ÿþLEAD Technologies Inc. V1.01ÿÛ„ÿÄ¢  }!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÀvÿÚ ?ýü € ( € æIòÆ|’åO–\“„ù]Ÿ,£+ZI¾˜g9”á”ò¹JœÓq”aUÆI7ã%4¥EÙèÓ[¦mx3Äþ;øiy}ðóö½ð?,të„´Ô/<à߆Þ(´°»’14v·—·s­ÃBCˆäeb§p殦k¡N®фܣ N5!J .j.I&â§$µŠ”one|*q*GF®4ªÆ1›„Üã5 9F2åi58MFV³p’Nñvìÿ°>>ÿÑÁEÿ†—Â?ü›XÿnÕÿ xàLŸõ–¿ýÃÿ`|}ÿ£‚‹ÿ /„ù6íÚ¿ôü ‡úË_þaÿH?°>>ÿÑÁEÿ†—Â?ü›Göí_ú‡þÃýe¯ÿ@°ÿÀ¤ekkñ‹Ã:]Ö·â?ÚkEðþ‹`"kÝ_[økàm+K³Y¦ŽÚu}©Å¸{‰¡‰L’.ç•e˜ãžWJ4a†Œª×© 4¡':•jIB*qZÎ¥IµB)ÊRj1M´Šb§ÍɃŒ½œ*T—+›å§J«V¤¬½ØR§ T©'h”äÔbÚÔÇÌ ~ÐPã¨ÇÂ_ã±þ›Kûv²ÿ˜x+yÈ…ÄÕšMa©´õMJV·F™jß[ý¢| ÂöïSðƽÓÃ7 ¼n`O•åÑõé|[¬xWÔL@2X^éÞ‚Yƒ†Ôí"•E®ôsÈ9(֢靿‹æ·¬lš^¿#«Ä”å%FÑ‹·¿s%æãd켜Ÿ‘ïÞñ†…ã½ÓÄ~¸–k‰.mf‚êÞ[KKÔôû‰,µMXÓ®fÓu‹ ø'µ¹´™Uâ–RÁ>ìeÆ2ƒRŒ’i­­ÒÇÒÂqœc8IJIÅ­š{4΢¨  € ( € ( € ( € ( ˜~$LÞ øýðÇÃ'~àÏxÛâ[Y71KâÛÝSÃþ ð¦¦èp éú¡ñ4xó5„—ä{xÙ¼l…Œ"íí&“ÿ MÛïHð8Š´©à¡J/—ÛTJ_áŠr·Þ¢zU|¡ñ'æ¿í{«ø/Dý£>Þxïà‰ÿhþŸÆHWÀ^øi¥|VÕRõõ†æß]>ÖdŽÝmm&ïwo„Þ¢¨ÄÆ»²4þ³ÄñŒ½”å—å*[å±øÆç)­i©EJ’’ÕÊ¢†Óg¿J‰ä™Õó ysŽmˆsu+Ë«Cû9/câK·³zrÑ•M飾ýž?x¼ûüDøâ ?BÔµ øÓökðŸÂ­<@$´±¹Ñl¼S¤O%Ïö•ÜW¤‹E &†Úä³b<7F*8Êv:¿öÅ„aáÖ.rdåí"•-JtêR„çwhIS’÷’kÎÌiÕ‚Â}c Å:ß»Të¡ká½Úׯ·~7ñ/Š4Ÿ‰6þ»Ô&²:äV_…æÓSSŽÖÜ^]^ËuoË:[\8a¨B;F¤*Ö̸‚·8P¥R”)Ò¡šÑà ø/ªü{ø¿âoÍà='KÕ|zðŸÃK‰žøEâŒ?¼IðÒëÄ÷¿ ¼a¢øn²êšEÖŸâYaÖtý_IÖ.4‘p†åݾ¦Í·Ë5ß.dð‘É3LÏ*öË‘ÏOGmN8ÈW©„ÅáåFI¼<¥‡ÄakS¨¡R•z jS§‰‚§Ñ…ÊèWÍ8vœjÎyN}ŽX5É F¼%Cž„ïÏÔ«B¥LMÐ¥ì!*S”«^©~ÍÞ4øçñÂÐü@ø¯£ü6ð׆|cáï x‡áÞàÿøI§ñU†«¥ÍFÜë7-cÍÃKe=­Žš’›X§xnnfš"íéæøY_€Œ«K0Âc14êÝÓt)QŒ—°¢¥¥[F󣊭 =J”\<}•X¨xN¥ŸVú¬œéÂ&"¤¬£WMªuªac% ªB­L4ªTj”*QsTå süyñÇ_øq ~Ø~6“â'ìÍãoÚJÞãàoÂåÒôÿüо1Má9¢ñWÄf¹½¿´×&t(¯‘¡Ž9¢ÉœÙ:·Šåɯý™Ä £„œsœ<½¼çì¡,£ÍMÕZÅ͸ÍCi*R“þ>’­<“Œ"­QQJq”ž´Ýh¥üFd|ñÏÃ-KÇþ.ýªþü Ô¾|ø[ðcǾø<Þð×n¾"x£JÕtïŦéÞðõÆ<þ¶Ó5ßZ–eš[]l%+ýž:kÕÄå¹.gëQøUà?Ž ®~Ñ>ðþ­w¹žE:ƒè+×tkYÍåÞ—¦ÛA-Øíàû<»š>¬>MCë”2¬L±UqxºÐÂÆÃßG^j4e^-ʬ°‘¨ã…Äb¨ÎP¤äóσ¥(Ëž¶YOF´òšèUÃÒ­VÇЮªfÕ:Rr§\TãÔcŠ”*ìµ±RŒ@øåû_|Ið߯íáÃ{öføp¾ð¾‰âY5¿Úo_ñ¿†¬þ [ëÖVwÑMà-[EŽËD† '¹û ßêssp—oç]´~n[„Uhc±ØÊ5qp8׃–R”3éATœª,Bä‡Öyœ0ü« …³iâûÍáÿÃâK  ø³ÃZ Ò5{9.¥éé ÔW6¯İ;µ,f™æU©:Y^[,\%*RÃÕöñ̲ܨףU9AÒŽ2´*ÁYªô¢ãQÓMOÀŒbòYfQ©³Žg‚ÁÓœö°Øš9E‰‚NR‹­ ´bêKÙ¬á5RV”|#ö¡ø®x“Àÿµ÷ûë]*á¶™ð>m êÒ ÈõK¦ñ–©§jš Õ¦šúX'X®,âX>Ïmkµ„†V!—,žœjb¸O&ÕeƸ<*ø=–¶G^œ¬Ó—´sÆÕS|Ü®1¦£µ'?b(ájÆÛk™ö2§5´ª°ùö–JÔý–œ¬ù¥íß7+ŒcsáümoÛöˆ]Mþ7€âð¯ÂÄÖѼZ|W‡‡$øhš0¸?Ùéªùòk ®‰ñÏltþL¹ßèÿ«9‚Å:žÞ9î`©ª\¾Ícþ¡Ã®¢|þòÁÿd¼#…¿}ý¤ñ7ÿfög6p°ëÀÿTSMåµÿ‹Ëük%Œ¿'ü¾þÔPX_±ýž¥íÚ,~ƒW”yÇš|=•´Úâ/‡­ M+Æÿ¼ñ æÍ~X¡ñn‡«ë Öu¿Ås©øjÙÉÐðŒ–‘}^GRRÃN›zRŸ»äšNß}ßÌû^«)àêRnêF£å$íÿs?™ôý{'ÐP@P@P@P@|µâ_ù: oû ÿ« ¼,÷ø4?Æÿô“渗øoúù/ý$õùƒãÏ~>|5ý¡5oŠ¿ ~+~Ï÷“Wðg„|}á-ZËãþ7]:{oßøJö9´ëX<ÒÏðÛó]À«æ€#—vbéËjÓÂÖÎ>°¤èf˜\÷vö‘x\N#'ï5ÝÎ’‹÷î•DãË'êS­—U˰¸,jÄ©á1Õqt=•›žaTdê6ÚQ•FÒŒuäjMsD»ðØ~Üßð™èããü2xøwþžðv©5œúŸ„üáo ê3éòM-„×Ú&‰c¦ÝËe-żÉhÓÛHÑ´°Bå – *;sœe,Ã7Í1ô#(QÆâñéÆi)¨U«9ÅMFRŠ’RJIJI;Ùµ©óX*ÃahЛNtÕ›í»z]'ײ8­á®»¦þо>ø³=Þ’ÞñOÂÿ‡þ Ó¬¢žñµ¸u_ ëþ4Õu‹Ëg°[Xôù-üGb°¼W’ÈÏáâU^<%XáòìÓ4ÝLng‡ÆÓjܪ•,¾8IFm´ÕGQ^)FQäÕÍKÝ=,mhâa‘ÆšqyfF¯5•å‰ÅѯMÓ³wŒaM©¹rµ&”T•ÚòÏ~Ì÷—¿|{©xbëF´øKûAx#]ð¿Çÿ\ß_é×gÄo¥É¦è_< oi¤^YŸÜZ\ÏeªÅu.Ÿë ½ë=ÅÐ`b“_ÙXìž´ý• uiãòš´éÆu°Y¶Jê\Ó„%‚­*tkªv•Hbi»IЗ²§ ß’y6cÊå›d“§‡JPƒ¡Ë©)añ•.«{L/;¥…n5¡,%YáÕcÔŸÌúOìKñŠ;'ÁŸ†?a;?i“XØÜ|]ÑgM"÷ã¶©¢é&9ö_ xŸÃ÷þ·ñ.¬–Égw4‚ò U¾žîî'…"—ÞÃæô&žcŠXªŠcYàðµÜ0•ç ‘Nœ«'G…§RÕܰ±Œ¨×Q£AF‡½«˜a0ôª¬LÃ9BQ¥OŠ©*tEeÍSRlOÕ9š¤êJŪPx‡NUfã ~Ð^3ñBÍà»ÙOâ·€ÞÖM#Á´ÿËÍXü7Ôm¬ °¾ÿ„Rð~Œò_Yêâ%¸¹þÕkw·Žw6ä$^&t›Å|Qðßí=âOŠ£àKŸ…_| á Ç:nªÚô~=Ó¼AàKA MáU´³m*m&c­Ânšþáe!¥X£C 4üØ:Ô)åÙ¾ª7_0žc•.[Fµl&S¯ O3OÙ:sœ=š”•WOUiÏ‹«J¾[Ô©óG“C„ª¤—°©„¯RXŸiNj^Ñb!Æ<’¦©F9>iκú¿ÓuÄrž]á¯ù: Ÿû ‰ÿ« ¾Ÿ!þ ñ¯ý$ûþ'þ¾GÿI>¥¯túP € ( € ( € ( € ( –¼Kÿ'AmÿdÿõaW…žÿ‡øßþ’|×ÿ ÿ_%ÿ¤ž£_0|xP@O<Mss4VÖÖÑI=ÅÄò$0[Á %šid!b‰#Vfv (RITÎp¥ Ô©8Ó§N.R”šŒc«ÊR“²Œb“m¶’JìªtçVp¥J©R¤”a§)JRvŒcw)I´’I¶Ý‘WJÕt½sLÓõ­Q°Ö4mZÊ×RÒµm*òßPÓ5=:ö¹²¿Óïí$’ Ë)íäŽX§…Þ9Edb¬ ÞµØjµ0øŠS¡^„¥ ”êFP©Npv”' %(Ê-5(É&š³Išw³¿,¥å(IÆQ}¥'-ã$Ó³L¿Y ( €#–D‚)%íŽy°NÔK1‚N€ ô¨«V)T­V\´èÆS›³vŒ”’mÙ&ì“o¢eB©8S‚æœä£¢¼›²WvJíõiׂ¼iᯈ~ÐümàíKûcÃ$±MKEÔþǧý²ÊFtI¾ÅªZÛ]Ûe£q²x"~9^Eub0õ°•ðöu9)TJñ~åjP­MÞ-¯zHJ׺½¤”“H© Q­ˆÃÔ\µ°•ëáªÇGÉ[ Zt+Bêñ—%Zs‡4[„­Í J-7«§kš.¯6«m¤k^©q êM£kiÚ…¥ìÚ.°––—ï¥j±[Lí§jKcarmnrˆo`¦É‘›7 ªtªò5Fº›¥;>JŠ•Z”*:røf©×¥VŒÜ[ä«J¥9Zp’Jp•)ªU"éÔp§UBIÆ^Ϊn•NWgÉQ&éÎܳI¸¶‘©P  €<»Ã_òt?öAÿV}>Cüÿã_úIö5ü Oý|þ’}K^éô¡@P@P@P@P@-x—þN‚ÛþÈ#ÿê¯ =þ ñ¿ý$ù®%þþ¾KÿI=F¾`øóçÏÚ£Ç^,øiðâŽ< t–~,ðý–q¢Í%½…ÌfâãÄz5Œ–òE©Û\[lžÚêh Ë l]®ŠËT!R¶g‘a)ò?¯æ¹nQ«Ì©Îž#JŒáRTÿ{N2qœ©Z¬bÛ¦ÔÒg£•á°øªØºXªŽ…eù¥okå*3Ã帺ô«Æ øŽ…Jpª©ÉJ9'BR‹øãã×ÇO‹_³~‹àO|Hý¤¼3£ø»âö¹â¿ß|e¾ø1&£¤ü)ð†‰i¡mð‡‚>xJÏQêÇWÔÖ+mKÄ’J¯j.MÑŽcGèÑ£„Æã~£……Jtr\jW­)GëY¦"¦&¬0¼ÔÚú¶iP©õ¸ÒqöQ‹ž¤ª8R= ¿ G†ÄgTò‡*xŠ”ha2¸âÚ§‡R¥:¸¬F#>ZµÞ5(ÂŒiÆš­ZT9éª0ÅN^ðïöšñGÅÍãÀ½ö–Ñ>1_·Á?x÷Ã_´ÿ‚W¿uÍ ]"æÞÏÅ ñ€uÛ+-R·»Ò¯íÆŸ©X|ð¬×Ír^aj±åÄ™}5ÂÙÎeW*–žOìþ³Eb•ZY®½UJÔ¹ÓuðX˜ºÂUœ©ºœ%|?ûEZ}xrî áœC á Ï,/ÕçUJX,c§Oê8ЧVÃBP«‹© õ%Vx˜}]Æ8YÆKØÿg-{⟼%û x3Wøÿ V‡ñ/ÁÞ$Ôïmáðî‡ö éŸ 4=sÁ> ó­ažâçûbSûZ9ínu æíX •ôüiÖâ®,ÂÖ‡´¯•åøÊÕkó8ýk0‡àpòÇ{(Ú4y°¸¹Ðú´\èFÞÑ'Q©Gæ*B’˳lu{.#Ãa©C™ÏÙP©K6X¸sKãúÎ/õ¾iGž´ú½)*P÷úO~*x=?lY<3®¢ÍðŸHøyðöÎM+Ãï™wâà¯ÂóÝérÔÔì-¨¡n›'|Ö_FXš”%ˆÇqwöTW5NxG‹–…OeïFØÜG=ZIb9j>YÞù}Zx,$ñy} ³xjŽÍqõjÅJr§ŠÃÏ<,T`Ûæt#ƒÃÉQ_¹¨èÚtåí*sçxÞOÚóÂ^!øðÞÇãÿ‡5OücñWÅ uß^ü&ð½·‡¼ á­?ÁZ­ž›áïÛÎ.µÛŸ]­üúuΡ©‡¿¸žÕ5U{D–:ë¡ #‰ÁÓ„ã„Ê2ZØŠµç+ⱘŠY®B¿³°øyV†"|E(óQ£F¦*½%5âyœ%)Tž¼¤£:qš£OÙÎQ«:½4r¼=|ÞŠ^Õ嘜fÊ…)Abc:XŒf¦ œë%I:ø¼-ЫVu#ˆjÒ¥N+KÄþþÛ×Ú?ÄŸ‡µÿ†iKˆ>4ð÷‚¼Cðõg|%½ð„~)»]>ßÄ> ñhÐí!Ö£Òõ‹«$žÛ\ÃÜéé1…ñÑ¢öð¹D15'—G-¬”¨bgG0–&’­¸<5Zô¾µ„ŒK©Ê_«¾|6*¦t$Ï4ÀN9~73X”UÀRöï CÄáªÒö´¥‰„*IK«áðñ«õ>gN•kÏë3ST¦´ýkö¨øÙ¬üDø‘ðïâ·ƒ~|4ð'|gà_ |)Ô¾Øx>'Gð÷QÔ4]rÿÆÞ7¹¼þÖðkjºí¥õ”2è‘KökKky¾Ç$É#_üµU„Ãpå va‡xégX F-Ó…GIap5½µŒ’\øÈP„±n|?ÖcN2¨èT©FŽîn4ŽGU(b0Œ kfJN¤Ö*¥ &µá[Tjà¨N~ÉI{UUW£R<˜Zç²~Å›öRøY|·oX–L†ØÆâï+¸pÛOq^ÏÇþ\iÎßìYjŒíÿRÌ"Rå}Ÿ£<<\§,Ó=•Z~ʤ³ŒåΟ2—$žkŒr‡2Ò\®ë™hít|kð×Ä_>h¶—Ä{¯ˆ–_/tÿŽw~ ð÷ƒu?h¾Òõ_ŠÞ' ´}ƺ®­£jÝÛi_gñ§\èÐË " [˜§K›£· 4~µ‘pFS‡¥㳌f# GR¤ã 4)ñ}C4”¡OãkÒÄætï }Z¬éàiÅá£Î¾5£‚Æq+­V0Yf_Ã̱0¥?iVX:Y}Ln Ju#+TÁÒÃÔÁ³Œž&X¥_ìQìòÞ~Ö³î·ðçÆ>8xgão€üi㟠ü<ñ·ƒàø_ x çÀ—ž>Ôm´m]ðgˆ4+µx’ÛNñÝ­´Ñê°#M`dqÜÊ%³ß¯†IK UËKõ<ÂuykÆ¿‰ÿ¯‘ÿÒO©kÝ>”( € ( € ( € ( € (å¯ÿÉÐ[ÙýXUág¿Á¡þ7ÿ¤Ÿ5Ä¿ÀÃ×Éé'¨×Ìy_Æ¿†ð¸~ø§áÇößü#¿ð’ŦÅý³ý›ý¯ö/ìígNÕ÷g}¾Ëí>gö•´Å·ÎßómÚÚa§õlÃ)Ç[›û/0Ác¹/okõN~Yò_›’Vå}8\GÕž+ÜçúÆ„ÞÜ¿]Áb0~Ógeíý§&œü¼œÐææ\ÏÆŸ‚wŸ׺ÿ„> k >)|?›R—Á´=3L×–Â rÖwFñ…µ¥ûŠ<9}ook$–É[>Ît™|†I• •0¸ª˜ª-%ˆ¤ðØŠSNT«áÝXUå”T£j´¥,5m~¯Rn¤a)%mpºXlòìf8ü ¥F²ƒœèÔ¥‰ÃÓ© Š5aySv«:uáiF¾¥J·2œ9¿†ß¾ é âûß_´¾6ë~*ðÕï‚¢DÑ´¿†žÐü1}3½‡Ã¿ ÜͤÜx¾K‰®„ž"»ó®~Íö{HRã˜Þiš<7)Æå8| pÌ`㈭9¼Eng^‚ú¼çK AÒ«k‡„š«^’­)¦Ôc¢Ìn[ŠÁá©aiåU£‰¥MGšU+©ÆWÄâ=ÚÕ©EB*•(Ó¦åRv”Ý9Rò˜¿c¿ˆVÿ þøFßöŽÔ­>%| ñ·Ÿ ¾+Ùü1ðìgþ—ÃÑxPø/UðdúÔÖž$²šwuz²ÈLFu™#xçô1Y´±9´s…CÙâ±X dÔðØEC ‘çÿÛT(ûYNNŸ´Ëê¼-JÓNs«:˜*•*bÚk›ãK JtLÞaV¥jUë%)ÓÉqÙ2Œ-N”c‹ŽcU¥M&©ÂŒqéÊ“s©ˆ«J¥z؉WÄÕ¨¾ŠñoÃøJ>$|!øƒý¹öøU2øÖ_ììÏ´ÿoÂaáÅðþß·ÿhEý—öM¾~~ÍwçgËý×ß®-_«WÌkòóý/––öö|Øü;ÚÞÏšßRö\–ñ9ùýÎIñ©Û*Ye¶Æ`q~ÓþÀðøêÏ“þž}s›ŸŸÜö|¼²ç¼x?~Í^ñž¯ñÚçÅö¥>“ñºÃáí±´ÑaþÄ×<ðîÊh´{CñÚî|Íf-TÙêV³VÚkÕÒåŠSž‡ÃQœ¨â0y½|ÞŽ"p•:µheô#MEkË’©%4êÓÄNŸ,9yåß Êt±Yv&)Î,²¶WV…eí(âèb18êõ£Z ‘û:”ñÒ¡*i¶¹HÔRiCðgì÷ñâÓź©ñSö¿ñ×ÄxWQ‹YÒ<áÿøgá4Ú–§`Â=*ø¯Á×ÇQñ‡£µyÍÞp-íõo5Öè¡{kJž? γË(Ë1œ*Su.þ©^•Jx‰Ã%*p¨§(TÁÍTRpj n\ÑωÂKW —`V•nXJuj¼^%P„””)b*Æ2£Z\±LM4ªÊ›¨¡ìç8Ô… söRñ¬>6ñmÿÃÚ#Åÿ ~üIÖnüGñ'áf—áOkM©ëºÊ<)¾ð_Ž5“Søru˜RLtÈež+·¸º‚â6xË‚Œé,¶9^2‚Çá°¯ œ¥B\ªÂ…W͈ÁRÄK™a©S–UpéÁÖ«Z]’ÍéóáñÐÀS†wEá£k‰†ÿ¯’ÿÒOQ¯˜><( € ( ñÏÇøBüwâÂ/ý¥ÿßÀŸ|kþÓþÛûÛ?áÕŸKÿ„gì_Ù3ýŸí<ßí>_/;~ÈøÝYT«ìòÌ÷1å¿ö$òø{;ÛÛ}~žaRüö~ÏÙ}FÖå©ÏíoxrZ~¦-úÖ#‡({ogþ°fŒ7%ý‡ÕÖ^ý­¹—µæúÿÁz|¾Ëã—?¹éÿüUÿ ×<ã_°eÿÂ]áOø›û3í_nþÎþÝÒm5O°ý·ìöÿkò>ÕåyÞD;önòÓvÑêf˜ìÌÏ0˽¯·ú†&¶Úròsû’§ÏÉÍ.^n[òóJ×·3Üððµþ³‡¥_—“Ú+òÞöխ쯷duÕÀtP@yw†¿äè.ì‚'þ¬*ú|‡ø5ÿÆ¿ô“ì8køŸúùý$ú–½ÓéB€ ( € ( € ( € ( €>^ñÄgJý¤üp Zx»à÷|=e;qÖ|'âÏ k«¦«v»¹Ò5ÝVí#9/ƒvËçÄÏ Þ”ÒÒ5ôi«ýé/™ó¼GM¼%¥¥:šù)E«¿šKæzm|±ñ@湟F›À_¾|0]*? ]éž+„?†SÅWöËVÚ{¦½—Uò òð5êeÙ^AŠ¥ZX fn–*œ0Ô]lÃ0†&½cŒz²tiÔ¦¨Â•hR§«áhF–’T~±¸Áºœïóœ1¼´0¸<^žSË0uaG_³ µ]LMjp•êVÌëaœ(FK^JTá‰úzçVÔµíV oX¼ŸPÕµø&f§©êw÷-¾â÷P¿žÒêòîáð7Ï5IJHíŽYÉïQÅtia¨ø­‡ÃÓ 3\ªéÁ(‚â8ÆŠÒ1ŠIE-I-™áiÎoà NNRþÝÌ”›r|«‡â›“»“²W“m·«m¶Ïø‡oão‰zßìõð‚o‚š·Çïi²—Ã?iß í¾|Z®>¦/.*Á`㣆–§Õ!‹ËÕ: èVÅeÕeZ•:‰{zXiá0õ©Éa©Ô«Õì°˜|ÏÛ¬7¶Âã8wˆ*b¨Êœ°´1’¥€Ì%¡ok§¯êÚ¦¹}wq=ýßÙ"y8U·¢Œ1ÇÅã*âË L%G ‡¥ XjÒsi{Î0r匪Ju9#¹¸Â)|ËÄbqµ?´1Õž'‹§IÖ¬ãsÉE¿v•5T£Í9ÏÙÒ„)©NmFòmúµq ( €<ÇÁhuÚ_Å×v¿=·…~ xKHÕ&^b‹SñgŒüOªXØoéö¸´ï ½Ì± ÍZ”Žna3}NE=Yl¥;/ûv*ÿ¾GÙpÜpµæÕ”ªYÛ±W½S>¢¯lú0 € ( € ( € ( € ( â7€l¾ è0iÏ}>‰­èÚ¥§ˆü#âk8bžÿÂþ(Ó’x¬ukhe!.­ÞÖêöÂöÉÙ#¾ÓµMBÂV^9Õ¥ ÔçJ¢æ„•šþ¶ktú3*Ôi×¥:5cÍNjÍ~MviêŸF®x\þ3øá:oŽ~ x»Z¸„ùPø¯á8Ò<_á=ooÜš&ó[³ñ7‡.ž!æËg¨iSZÛ»x5}D š_š­‘â!'ìgç3å’õV¶›]={#äkðæ&W© ”ï§3äš^jÜ®Û]5åEø[Ú‡ý?øoGÿ.+/ìloòÃÿ_äsÿ«ùòÓÿÀ×ùü-íCþˆŸÇ¿ü7£ÿ—cc–øÿ ÿWóå§ÿ¯òø[Ú‡ý?øoGÿ.(þÆÆÿ,?ð5þAþ¯æ?ËOÿ_ä5¾._:²?Á,Œ¥YáÚ²²°Ã+)Ö0T‚A¦Y.q•9Ó§(I8Ê2’qqjÍ4ÕškFžhTrÊRŠ„ešj¥škTÓZ¦žÍl|ßà?ƒß³çÈ7_¼ û|[ðÿî_S’=VkWvzTš¼¾müžðþ£âÛÂÒ2™ ´{ ´óÚ@c¶žXdô)ÐÏ(à瀅~\4Ô#$çRP‚’P•yEו7ÍyÓu*Ê4åR3•*n=¹† >Í#Ž« ꜭxANt¢£ Õöp‡¶šqU%:Üóuõ‰¹Wýáâo€³7Œ|yªüKñ/ì_ñoTñ~»quy¬^KàßC¥j7×¶ocy¨]øZׯQhrê3¤²\Ivtß9ïß³›ÓöŠç£—f˜l$ð4*{4¡VšŒjZTáV2Œ•‹÷”TŸ±•Ó–J2 éÊk¢Pâià Nx¨Ê8(Ñ&Ý.nL<Ôè¤ù9ëS‡,i{:Ò© a£$¢ð±¤¾3ýž¼3ão üo‚ßôÿê?.þø_Áw7ˆä×/~ Ù=Â]ivÜxÁäžÖ3¥Ý¨»¶¡·OŸeÎØiŽË³<Åæß]p®óÊ´kcã^®b#JmÂ1äqX¬Eý—"›¨åSšQ‹ «9ÂÕÀÖ¡*têe˜¼F? ïì±x©Ñ©^­¥¥Ï<=ìê)R‡%¡©IKâ€> |Tðo…<ãÿÙ7ã?ˆ¼3àk;-;Â0Oà½nÏVÐ,,,íì!²ÓüO¦x²Û[ŠÕílìÒâ#¨2ÝHäLð£-UÀæÕ³ Ù¤ê/¯â':•jFJÖSu%/iN 4§*µ% rƒ…9ÉΜc$š¬¿-ÎòªÂà*F†¢JTœãRŒ”£5±šHÙÅUª(Jtù½IÆNð xKᆧðoÃ_²ÆáÞµp·zÖ‰eàÍn;Ýfî=BN+½_ħŧ\Ô¶µXæ¹Ô¥xെÕmaHWZØ|ç‰ÀâêÔƒ­–WÃâpܾÎ¥_ éJ•UFOš…)U”¡/o(sWö­É¸yNpñœS”%_B®¬å8¶ðõèUÃT£ÓTàéV¬”i¨¨N­J°å«9Mû°ø»¨( > |{@½ ºÇ¥q<ŸÛv…ß÷—ùÑáÜ|#FÔb’KÚtJË!áojôDþ=ÿá½ü¸£ûü°ÿÀ×ùý_Ì–Ÿþ¿È?áojôDþ=ÿá½ü¸£ûü°ÿÀ×ùú¿˜ÿ-?ü ÂÞÔ?è‰ü{ÿÃz?ùqGö67ùaÿ¯òõ1þZøÿ"xøý'Ï/ía ËŧüðÜHG·†ÿ]¾¸DÀÝÎsŸ›Ê—‹8îgɓЌz'Z£kÕ¨Å?ü°_òñéäƒþÿ_ôpÉÿ†“Âü›Sÿg1ÿ¡NÿUÔ!ÿ?܃þÿ_ôpÉÿ†“Âü›GüEœÇþ…8üT>¡ùøþäð‡üzÿ£†Oü4žÿäÚ?â,æ?ô)ÃÿàÊ¡õÏÇ÷ ÿ„?ã×ý2á¤ð‡ÿ&Ñÿg1ÿ¡NÿU¨Cþ~?¹ü!ÿ¿èá“ÿ '„?ù6ø‹9ý pÿø2¨}BóñýÈ?áøõÿG Ÿøi¡ùøþäð‡üzÿ£†Oü4žÿäÚ?â,æ?ô)ÃÿàÊ¡õÏÇ÷ ÿ„?ã×ý2á¤ð‡ÿ&Ñÿg1ÿ¡NÿU¨Cþ~?¹ü!ÿ¿èá“ÿ '„?ù6ø‹9ý pÿø2¨}BóñýÈ?áøõÿG ŸøinÆ£âÎ=Isdô%ºUª'òn2Kÿbú„Wü¼kä‰RëöŸÐOœÚ·À߉EÀÒφ¼sðsP–5àñø¯â5¬·Wq+¢ZE+Ë€-‘2ަŜæ–;'«‡…µ•Ю寮³… -þÓkÏb%€’^íDüš·äÙÒøs㎑>¯aá_ˆ^Ö~øÃT¸[=Mñ|ÚdúŠo¶Þ ñ¾ys£k—®Ù4™®,u“m+éQÄ7×èY?äùì²ÜdjÎ ò¥+Ó­ µ•9Ú\©´¹âœÑIœ•(Ô¥ñÇ•t}>ô{…{fa@P@P@PÏ>"×uŠzö­à¿ k7ú€|9s>“ãÏhwÙk^ × “Ê¿ð‚5¨dÒÃdë¾ ³"æÖy²´¹íõ[{û­ ó®6ãUÃû;-q©›Uå'iG ´œ£´ªÉkN›Ñ/ÞTN<±©×†Ã{_~zSNÿð;¿’òô@Ñ#“_PŸPƒ@ÖešÁl®%ÒQÏö¥©¸ŠÝL†µæ2’ÂÿjåÍþì¹fãX˜«ÕÁ¸8ûâ(Z§¶O©EQªÕV¢œ¸gŽ¥ìjâp´«f8J•W[F¦"2ÃÓÖxŠp‚öµ)Æ Ôå7ZQ÷aJU¦þì‚x.`†æÚh§¶ž(ç·ž X&‚TE42ÆJÉÆÊÊêH ‚ |eJu(Ô*°•*´¤á8N.2„¢ÜeE¤ã(´Ó‹I¦šjçU:”êÓ…ZSJU"¥ Á©FQ’N2Œ•Ô£$ÓM6ši­ø‹ûAü<ø]ñáoÃ/Í©¯ˆ¾-_ÝØhRØÛÙÍ¥èßgžÇO³½ñMÔú„iV–»©éº5Œ±Árn5 è­Â®K¯©”ä˜ìæžkS£Ë”aÖ"¯;’u?wŠ®¨PQŒ¹ñ Çbý›å_WÁbgÏx(ÈÅÎ8, Ì+;PxŠxt–³¼ÜUJÖvK…ö”ž*«’TcZœši¶½Â¼‚‚€ ( Ôäçüÿdâ?þ¬/…uíSÿ’{ÿc/þ£c ßñcþ ~q=æ¼SC–ñ¿¼/ðãÂZÿ޼iª.‰á_ iÓjÚæªö·×ÂÆÂßh’ag¦[\]Ý6YUb·‚i˜*#t`ð˜Œv7—a)û\fc‰Ãá0ôù£iˆÅV†…>y¸ÂõjBÓ”aóNQŠm\)Î|ü‘æöTêÕ–ÚS¡JuªË_ä§Nr²ÕÚÑNM'Ó£¬ˆ’!Ê:«¡ÁV”à€GpEa(¸IÅ«8¶šóZ=Œ(Õ§^•*ô¥ÍJ´#8JÍ^JQvi5tÓ³I®©1Ô€ ( € ÁñO†tøk]ð—ˆ-MÞ‰â-*ûFÕ-ÖI ‘ìïíÞÞcoq ,–—H¯¾+ˆ™$†TIcetVáq5°Xš¼4ý|-HÔ§-í(5(èôjëTôj馘¥(¸µtÕ™‘ð;Śψü#}£x®è_xßῈõ/‡>4¿ÇÕµm ÞÂ÷Jñ+[Ī–’x‹Áú¿†|DÖèˆ7ˆL1îŽ$wþ²És*yÆWÌ©.Xâ©)8Þü“^íH_KòTŒ£#©Jr‡ò¿Ã§à{%zdP@P@|ßãö:·íð_C“÷–>øñ‹â#Dy[Ç{ðãÀ>¼þzx×â»,î0wå7ñG:;JŒ%ʱxÊTçð„*Öü*S¦ÎÌ zßòÅÛð_“g°×óÙêŸÿ>-h¾4ý¥>'i"øûE|iømðëᇈ~é’üøaqã­OñÇÄ:Æóâ­Þ§¨Í©YAa¯Ùxr_ éé<±ï¾yWl–ìß¡dyMxpŽ#‡Íòü4ân‡­Å,;þÎɱ~©:0pŸ´SΩV¯98Ê›† +ʵ5¦.³Áf<;N1†"žTžiŠÃrÊs–/J® K½L,²zø‹EÆMhb){KKB>ðKâ7„>,þÞ1ð‡í «kâð‡¬üø¿yâëy|!â¿Ågii§øwTÔl5KFkßxTðÜÉna¼ê=²-Ë“ßeØ¥ÅÙ.eîŽ7Ä8¬;õ*‘ÅP–qG¾µBœéJ P§™áêÔœÙåG 8Êk Í;!o-«Ë!†­W”C*T«SœkO"¯‡¯W)œ§8û<»ÚáÜá9No ,M4£VšâÍ3öæø3àmuu]Sö~ý­¾ø{C–ûÅo<7yð×⇉ü–Iˆ|3kc§=ߎŸi¢Ås0ºÕþ{¸…È’Úæg‚ÖNWà¬Ó±Ž1áŒdë;VÁUŽ3 J½ÝjxúÔëF˜T†*JUÁ¨ÅB• ”':µ©m–àqQžf F«¥õEˆ÷½•8¨S¥‚Ãb0Μª¼M q,n%¥ ^*U+±ÒŒO½>ø£Añ·ÃÏøÇÂö¿`ð׊¼á¿hfK/°hÚÆg¨i¶_d‰U-|‹9á‹ÊB'—µFÐ+æsì+*γŒ»0­íñ™~3CYÉËÚÕ£Zp©UÎMÊ\ò‹›”›“½å­Î|®½ñOÁqñwÃ~>×~0x‹Á³ŸüF³×>6‡¤ø—áç„õ[ë!7†uiü[{su<ñÛ ÆŸ¤¸ %¬ÓÅsÃW$˲\ç‹38P¥›eY.ŽÊ(¹*øLE‚ÄW©N¤á^†éÔ‡4áW.FéÕŒ*Ròð¸Ü^ )˰ؚq–u_3©’bê×¥þîð™~#Šª°òn1Æf!NxHJR–3¯YJXŒ‹ó/k?e¿üoðf…ñóâÄ‹x¾üO‡ÏÆMy|]uðãQø§ñŠïÀ·Þ$ñ#Í V> ¸Ó.nïµ(µ Ûo²%–2Ig§"ÉÓ—RËøÇ•Ò­“a2šøž&¥€ÄÔ˰þÇÛa¨dØŒ{£‡‚š•©S§†© U—´®Ö1J5êÚãÜ2yR̹§ŒÃa8w?Í'‚«YÅÖÄá1u s©8B3† <Ê£›çt)SÌ]4Ÿ´•OHñÁŸˆ³ßÄÿÙŽóLý©ÿhOˆ/Žþ4iñç…>'øöoiúÜëáj¶·Zìº>Š“YêjÑ${ë{Ÿ´éÒM!“G€ÉÏ–ç9~y<÷>Ë0tð¹&mŒÁUÃáÒ¯AÑ…(%ˆ¨ïLÒ©EÒÄrR• ´êJœWÖ§É9•,Dr𹄱Žå˜äÔ«8(aðõa‹Ìðê½<6k)J-Æ*œ«õŠ7t”ãQºuçôÙ?k?Ú/Vø©ñOY·ýž¾ ür‡áßÂ+O_Ûü:ÔaÒ<g¨Å4e®XahÈô#‡§âlVšµ,^ò¬eJXwË[VY_‰Äa)»µõzêÑ¡MR”³ øÚ•eR8©Æ_&éŸ~¼Þu*ªÖÌp’ÅÊ´ðØéЩWS<*Ò¡8aT¨{Zk0ÂÆ”ãNs«R2¯S—1qúÄcLö'Dø™ûQüxñÇdøïñ3á£á=ã6‡ðëAø©Úhv>¶ø_ñ¾Ò4߈:,Ö®*¬çZxœ˜JÓ¥æUñXšsÄK8ÇЧ^¯SO ˜æ3¯†ËpÔà§RÔ)R© ´9JNPÅB„ü[]_‹Ú×ìÓûnü(ø¯â?^o‚ÒxÅ>Ò¼sñkÿ> =Ÿ‰4‹­FoøÛâ'†4˜l¼UáMMÏQþÇD?có"µ.m™ŸÐ¡ ªy·…™Þ_O/©_4â–b'ÁVÁa"ã˜åxxÕ¡‡®ý¢Æeõ1u§†ÇJ1r¯Jd¡N(õa#[ ›æùzUã‚Çðö#F¥z´êV“£S5ƒ«ASrú•ê%Í MJ‹èïØƒÇu‰þ&ø+Æ:í"¾ð¬¾¿ø_â¿Ú‹ÀÍá_ŠÖz;§ˆ¼5¬ëpnµñ¨Óu-: ¸5BæðE®{…H­íTyÜaƒË£€ÊóU²HfÕ+bpøº#Úa'B”0óÁâþ­/{ ZQl6"0½ ïKšÄWÄÅ+ø_ðŸÆËáeñ™­üFðwˆµö¤—ÃÚwÃÛSŒm].<çÌ |,Äʯâ(N\ßTÆTŒòÓ:UùÔ•Wó<¬lyj§·4WÞ›_•¤kô³Œ( € ( € (æ½WŸÚŽ ó³à»3ÎÏ3â$~fßîîòbÝŽ¾RgîŒ~Mâ˶]”­—ÖjiéKOºçv㟒_™ì¿§ô¯Â䛋JN-¦“Vºó\É«­ÕÓ]ÓZžß#Ìþü(ðÏÁ¯ 7„|16©Ö½â/ëZæ½5•׈X1Z@‰ µ¼JbéæY|Êx?kP£—`ð¸ -\þʆJ4©BÒu'y5*Õe)ÉνZµ4æ²ÍR„qYž1$«æØÜF;ÒI{ZòVŒTRµ:aK G›š§°¡OÛT«Wž¬ù{ÿÙßáÆ«ã?Š^/ÕíoõKOŒÞ Ñ<ñÁ7²iïà¯Cáõ»·ÓµùôøôԾŠ¦Ý›·&¤Áonc‰'&W ×O)¡”._c„Ì´°µ¹ª¬F»…58afª(Q£R­xªŠ4ý¤±PU}¦éèÝOí eŽŒ ¦EFj+ʺX˜Îu½Ÿ=j4á){«×­Jt¦§uóõŸüÛá¤N‰¨übý§üCð¾ò#ø®ükÕ®~ÿ`Àåô¿ >i¦ÛjxgMÛh¶ÖÍ«6éöây§ýç›ôO޳Nª¹VO_5‡$ÿ´ªåÔªce‰‚VÅÊRn‹Ä9¯hß°ö\÷J’‡¸rÏÔðÕk`(ÖuS†¬é%N¼¤ëÑŒîêÆ¡:”ªKÚ{g “—µU_´_iê^±¼ð•ÿƒtÙnæ{šáhà2\²®i–àêÇ9§sáÌ/¶ÂäøzÝ:xšP”¢±Øšøšµ±¸Œ?2”mZŸ³« Ч_—ç[7Âb0ÒĶ]–fXg[0pT+â1žÆxl¶Šœ§`c,iâ±ui{O2¨¹kG Z0ç~ |Ô3^†›”rÌ¾Ž KVw©QÔ”¡N<¿FÕjN8©U¡‡©R¬žøKáOÛ|G±¶ûv³añKÆ~$ñ¿Šl<@ÖÖo}â«;VÒ­màÓí×û ­,#E·¹ûT˜šQ$Ò+¿“bñµ1˜,«V0Ÿ ,%hÎTå‹ÄãªK™þö5qUeMSQ„iÙsÅÎ^½>j9–#4¥9SÅâ MÅ¥rÀ`ðø*¦­x¿g…§9óJWªäãË¡™¬ÿ`…ú•­ïÄoÚ_ø[¦Þ[ÜXþÏž"ø»«êÿ­ìôéçEЛÂWŸm»Ð4ÍB;Ë{­Zti,aKŸ´[™ —ê(ñÖkG—°Yl³š\®–pðTÖiF¬ZQ¯N¼)F²¢žMÐv£)Y{^Z±Â¶öñ¡)åô±*Q«K7‡§5W\J´5¦±RseIÁ)T›£ì’‚‡Áß´ƒ ›ö§ñöœ~þÖZEïŒ|/«­Ç‡?gF~|v†çZÒt½Ä?5ˆmíÓÁž×죃Iñ]²Ä§½¥…ÛÉ<ÓIuqô|7Zrá<-:Y¦M)añrj9õdâfêTœ°¬\©ÉÓÌ0Ug()Ô•L5HPT%JžØª”°ØÜ-IJ­> …Œq™m5õïªÒ¡N2 ððåµLÖ' …¦ÛjQ¥QIQ­F?¸¼3ûéšÿÀÙãÂ5ñOÄ?†ŸþxHØYxßàǛž-Ð[ÄVIÿ _„á×⵿·Ô4ye[8&[³HÚJ½¼ÑCs:\øy§:­,fÏ Ž¥€8á±0òpœ©NxŠ0r‹§ímV2œ!É×QŒrÏ«b0è)c1y†•G¸Œ®®3ˆ«ËC I*ñÂbeÅJ©Cfý£†µ>¯Â°ÏÂx_ã/„íõõ—ǯ Xh/üYâøüC®jÚ½ŒzЗÇqêךIš/^Ýë“Þ]\?›d÷¶Ì–1¢XF¡‡å¬ñ+UÄVTãF­7?cB-ÉQ¢´Téó·9$¹§&¹å(Ó¥{xFá@P@xÖ—ÿ'G/ý%ÿÕ‰_¹øMÿ"ìÛþÂ)é£ÍÇ|týæ})_¬œ@P@P@5êŸòtqÙoýX•ù7‹?ò.Êì"§þš;ðOEùžË_†P@P@P@ qÿ'?£ÿÙñþ¬/ ×µù'ªÿØÆ—þ£V3ÿ—«üóG¼×ŠhP@P@PiòtrÿÙ_ýX•ûŸ„ßò.Í¿ì"—þš<ÜwÇOÑþgÒ•úÉÀP@P@ó^©ÿ'Gý&ÿÕ‰_“x³ÿ"ì§þÂ*飿ñÔô_™ìµøaép¿|lŸ þüDø.œúÄü âïI¤Gt,_TO xP×_NKÖ‚qf÷+`a˜f™w˜ßnÓÙ—a?ÀFj“Æâ(áÔÚºƒ­R4ÔœSWQæ½®¯k])rFRéݽÏÿ…¡ûFÿÑø'ÿ‰ã¯þ† òÖÿ ìçÿ /þ~žÇöcßÿƒjÿó8ÂÐý£èŒüÿÄŠñ×ÿCëÐvsÿ†Œÿ?Cû1ï‡ÿÁµùœ?áh~Ñ¿ôF~ ÿâExëÿ¡‚õ‡ƒ¿è;9ÿÃF ÿŸ¡ý‡˜÷ÃÿàÚ¿üÎð´?hßú#?ÿñ"¼uÿÐÁGúÃÁßôœÿá£ÿÏÐþÃÌ{áÿðm_þgøZ´oýŸ‚ø‘^:ÿè`£ýaàïúÎðÑ‚ÿçèaæ=ðÿø6¯ÿ3‡ü-Ú7þˆÏÁ?üH¯ô0Qþ°ðwýg?øhÁóô?°óøüWÿ™Ãþ‡íÿDgàŸþ$WŽ¿ú(ÿXx;þƒ³Ÿü4`¿ùúØy|?þ «ÿÌáÿ Cöÿ¢3ðOÿ+Ç_ý ¬<ÿAÙÏþ0_üýì<ǾÿÕÿæs‚“Yý£_â}ŸÄøUŸ×ìžÔ¼ýÿ ûÇGö‡ˆt­{ûOûGþ¬lòÿ³<³}”îóüÏ5vl~ÕÅœ²é`>µœû؈b=§öV ìR>N_í¾¼÷ææÒÖåÖê°³~káôV·µ«Ý?ùñäw¿ð´?hßú#?ÿñ"¼uÿÐÁ\_ëÐvsÿ†Œÿ?JþÃÌ{áÿðm_þgøZ´oýŸ‚ø‘^:ÿè`£ýaàïúÎðÑ‚ÿçèaæ=ðÿø6¯ÿ3‡ü-Ú7þˆÏÁ?üH¯ô0Qþ°ðwýg?øhÁóô?°óøüWÿ™Ãþ‡íÿDgàŸþ$WŽ¿ú(ÿXx;þƒ³Ÿü4`¿ùúØy|?þ «ÿÌáÿ Cöÿ¢3ðOÿ+Ç_ý ¬<ÿAÙÏþ0_üýì<ǾÿÕÿæpÿ…¡ûFÿÑø'ÿ‰ã¯þ† ?Öÿ ìçÿ /þ~‡öcßÿƒjÿó8ÂÐý£èŒüÿÄŠñ×ÿCëÐvsÿ†Œÿ?Cû1ï‡ÿÁµùœ?áh~Ñ¿ôF~ ÿâExëÿ¡‚õ‡ƒ¿è;9ÿÃF ÿŸ¡ý‡˜÷ÃÿàÚ¿üÎ{OÂïGñ/áŸÃ¿ˆñiÏ£ÅñÀ¾ñ´ZD—K{&•Š´ ?]M9ïEÛÛ-ø„Ì!ˆHb.#MÛG­˜á_˜c°§µxEl;š\ª~Ƥ©órÝòórÞ×v½®÷)(®—i~gÊß´—í%û:ëÿ³¯ÇÍ BøùðWZÖõ¯‚¿ôFÒ~)øQÕumWQð6»g§išfg®Éq¨]]Í ÛÁÉ,’¢"³0é2 ƒ=¡žäµ«d¸ú4hãðsœçƒÄB„1å)ÎR¦£Æ)¹I´’M¶’2«V“¥Q*‘mÆI%%{ÙÛKžé_Îé@P@P@P@P…þÍŸ´—ìëáÿÙ×à…®ü|ø+¢kz'Á_…šN³£jßü ¦êºF«¦øB³Ô4ÍON¼×c¸°Ô-náš ­çŽ9"’'GUe GçÙ{[=ΫQÉqõhÕÇâçNpÁâ% ÂXŠ’Œá(Óq”eœd›M4Ó±ù*´£Jšu#Å4ä“M%ÒúXúkÁ~üGÔ.´‡¾xóU±³mFóLð_Ž|/âBÏOYá¶kë«-T¹šÞÌ\Ü[ÄftTkÕ?äèâÿ²ßú±+òoä]”ÿØEOý4wà>:ž‹ó=–¿ =#åÏŠòq¿ì‰þÑ_ú~ÌËÄ?òGc¿ìs”êzzÙüŒ_ýƒÕÿÓ¸s´¯Ê¯ ( øÍñ«OøIi éö~×üñ Æ×wz_Ãÿ‡^‰Wñ.¥gMu=ÝôãìþðÕŠÍm&£¬ÝnŠÊ LÆ9v?GÜ9ˆâF&ØšfY–S|Ç0ÅK“‚ùrFRëV½i^– ÞbkÚœ\cÏRø¼U b±.j©©Òƒ©^½yFu“N¤Õ*u*ÏÞŠ:rÕÎT©Ôó~Ò^=ƒÆÞð?Ç¿€Z×ÀË^¾‘ðû_OxcâW…µÏ[ZÝ^ÜxwXÖ|7²xcZ¸·†3¦ÛÜ$ÇP+v¨c6¿¾úwe²Ü~?„¸ºÏ&£,V? ,'-ÄÒÂ)Ó‡ÖpÔñ›ÅÓ¤å'ŒpäXH*S“Ÿ¶Š•<Ûƒ–YžZð8Lf"HbzU¡ UV£‡¥UBΟÖ'%J‹wu*¶¡ Bz”~º¯ÎÏt(†ø•ãýáW€¼UñÄPj7:„t‹gQ·Ò ·¹Õ.-íö©†Æ »»Xd¹wtUÜ@™ošE‘éä¹V'=Î2¼“:tñY¶/ƒ£*ÎQ¥˜Š°£ U”!Rq§M9¸BrQO–vMKݧ^¯ÙÃP¯ˆ’ëɇ£R¼Ôzs8S’Šm'&“qWjêk>#“ÅÖºL^-àéü,ú»øÙµÍ=ZF x<,|5°Þ9“M’[ßí%“È_'È*]Á¨ú®8 Mj˜þLƆ*x%F£UpîYUÅ,MÕ8{°§KØÊ>Ò§µö‘j4äŽJx©ÖŽ[WAË ¥V­YÊQ„°ÖŽxhÊž®«Ä*µÓtåj/ ï¹{X[¬¯<ì (‰øãÿü+ð?‰~ x®[˜ô i¯¨^%”çP»s$vÖZn›lÒF·õüö¶vÑ<‘+Ïw´ˆ¤ºúVYŒÎ³<Q—Óö¸ÜƼ(Q‹mGšoYÍ¥'t ¥V¬”dáJŸ+å°.HÆ­JµcB†•ZõªÎêhP§*ÕêÏ•J\”©Bu%ËI¨µÊVOæO~Ô­x'â­cáß xé¼uá߈|G®Ën¾ÒücáÍ ÏÿiùÂÛ}ìŽð_I £ÂCM5¯Ýâ8#«…ÌaÃüo…ÏșlN#/Ž ……J:u*cçÇUœ¨ãe‡ŒhF”RÄaa[ ÇÙÆ<W… yŒ²ªôòz“¡þÑ6£^•L”0õ±8$lJ’u!?´kóCß ( =Ó¿äçþÿÙý ÿõa~ÌúOÿÉ=Äö1É?õ=>cˆ?‹ÿ#óßX׬x'iòtrÿÙ_ýX•ûŸ„ßò.Í¿ì"—þš<ÜwÇOÑþgÒ•úÉÀP@P@ó^©ÿ'Gý&ÿÕ‰_“x³ÿ"ì§þÂ*飿ñÔô_™ìµøaé.|Pÿ“ø3ÿdOöŠÿÔëö`®^!ÿ’;ÿcœ£ÿP³ÓÖÈÿäbÿì¯þÃ¥~T}xP@|ãÝcHðGíyð£Ä¾.º´Òt/ü#ñÃo ëš•à´Ó¡ñÉño†õøô)%¸)mo¨jÚd~]˜i·3Y›h•·èY™ðe™t%_„Ìr¬Ö­ pç«S.ÃÐÌ0ÕªB1½Yà [N­xÆ.©ÏÛTqHò3™ÇW†qµ¥Ë‚Ââ³:5¦ÒP¡[ƒÃO V¬ßðá(`ñtSv¦å?~Qq…ý£â?Åo|<Õ¾hzìw·Š¼yâÛ?ø+Ãz4:m÷ˆ§¼ºImu/Ac}jÖÚ“¦ÝO&¥©#âÞÞäLJ{˜á›æò<‡2Ζi<Ž•à«b±ØšÒ©O J(ºÐ¥V¤!;ÕÄÔ ¡„¡ÊåZ´T’P¥R¥>Ìv*†_…úÖ#TêS¥B”lëb+T«F‚¥†„œy爄ª>h•)sTœT¢¥ño‡~ü!ý¥<[ñûÆnõ_x»Àÿ|Jøwá›íÄ7ÖÞ ñ&µ j/¨É¦Ü]êÒOqm-ä2Ü47rLŽÓþõd1«VùæY¾máãªSyÖacòl~.40ôå‹À}s-ЧV0¥C’†.¥ÊšŒ ¹ªBPœÛ;#—ápYeøhÎ  Ã0©‡s”©Ç…©œF©¶ý¤eRYn ¥nyÏžT!OÝÃ¥A{®½à¯ ü:ñÞ©àÏi«¤xWBý†>%E£iË}¨jkmouâï·ÈûT»ºº¸W¹»ž@ÒÜHG™…!Bò2Í3ç!Î3,Ö³ÄføË‡ãV£§N“~ÇŽ¡éÒ…:qq§NÒ ¾[Êòm»áì.ðÚ–ÎEâd¹¥+ÖÅÖÈ1x‰ÞNM{JõªTåMBܰŒ`£æ>øàÿ…žýŽþ7xRûÅPüSñ‹¾øÆ^+¿ñg‰µ¼Wáèic¨xbûN½Õ䱳Эm?³ílímmâXmt›hÍÛæW×fU˜fÜOâ7ã)a¥Ã´0œOS ƒŽ C—Æ®"–;ÚÆŠ­SR½ׯR¤Úž"½JÑP´#œÁàè˃rÌs òŒF¢¨×°¡ˆÎp¸w€ŒT£„ŽSãN*³§zŸ¼®«{W†|G¡hß nçÕµk5to‰ÿdÔþÝ:[8õèk¤4‹1REôޱZí ö‰O•ù>Zø<׊ů a…¡:òÅex:•5ÏÏZ–yö´Õ®”é)FUbìéÂJsåƒR>ë(q£Æ9絜i¨ÖÈñRr”Ta†Y._W©&íN”^å9¸¨Æ”ç+As.xâ|C¿ýž¾Kð{Tøçà[Ùsáߌì¾[|nÓ¾ éZÆ¿söf£âMJk‰!ºñtÚ=µ–™Ö— ö¨I4€¥éúVû7+Æø‹Ä/?¥ÃY´x³‚þÑžO<æ® Í*°…qRŽë•*Ö§R½HJ5£IQ^ü`ãñy|ë®à|*.¾—T«Z”kGõÊô=’Ž¥Y+¸a)ªxÕB3­R¬+&éàêÅýEûÛxëÂþ ø¿ðë[ðZ|0ðg†›Áš„¾]üoð·Æ_áÕÞµeªcMK½+S¸Ö<;áÝJ;M;S³°Õà<é¯çµ–o´ÍåüG‰5r¼Ç*áÌê†jøƒ5ÅUÇáñ´2„ÿ|#6—q§ØüDñ½¾c­ˆÚ¾¥p ëš&…}¨ý›K³´Í¨Ô4÷ºÚ{!ùºÜpή[R–'‰xšŽ6–&º«Ï(˽­Lð”©E·K™RG^½kN žÆ…>\L«¿GGŽÌ–ZÜ©d¸*8LN#–.Ù¦.·=ha§WeË”(ζŸ½ŠÇI}jk… ÿTמ¸P@yîÿ'?ðÇþÈ/íÿ« ö`¯Òx7þIî#ÿ±ŽIÿ¨ÙéóAü\ø1žúƽcÁ”¯ÖN € ( € ( šõOù:8¿ì7þ¬Jü›ÅŸùe?öSÿMøާ¢üÏe¯ÃHù'㞥/†>4|ñu߇øEÓ¯õgCøÑ¢èúM•Ö¥«kÏìÝûDé:F“¦X@÷WÚž«ªj aµÓtÛ[X¥ž{«™b†¢y%uDføž¬áJ–V­I(Â<ë%œç);F„3)ÎM¥Å9I´’m¤}öÞX¿åü¢—WC’õn•’]Þǵ×Åž°P@_¾ø#â—†5|Að֙⯠jHVçLÕ!fËåK w¶P¼w:V§ M/‘e5½Ì åá–7ù«¿+Í3 —‡Ì²¬]L; %*uiJÍY¦á$ï”§dªQ©R« ¤'âæqJU¨TŠ•ðtêBI8ÊÎÍ>±’Œá%iS©U¦ãR’ó/„ÿ²ÇÀÚµî½ðÇá¾™áírþÞ;Iu‹K_ñ&©ol‚u{}2ÿÅZ¾¥> Ë;‹„°{ar#„\ E¼^_ÐgÜ{ÅÜM…§Î³ª˜¼)9ûRÃá©ÎMÁ§Z8Z4~GN2¤«{EF\Ò¤¡)ÍËÍÃä¹f¼10‘jW䔥9¸7J ¤¤¡7 JñJ\’œ/Ë9'_âoì›û<üañD>4ø‹ðËJ×üQ 6Öï«Å©ø‡Cžþ+!Ú f?ëë 1E>£Ó,$ù(±…ñçðÎx“9©„ÁÊnjŒ©añá&Û“¥MÊ<¤å5K‘NmÎjRÔÛ1˰y­*tqÔXÒ…JP”jU£Vê6åV¡:u¢”œ§M)¯eRu*RäIÊ^¢~x_xP·ðÖŸa7Ã(õ<o¤‰´}3ÃVú®•ý‡{ka£iS[ØVÒ¿ÑÒ ­¥Ž±° „!˜N³Uêâ•ÐÀ/„zkCct‹>ž¶“n‘e2cУæ˜j9M ·J–E‹©ŽÀ¨Âšt1UgB¥Jª|œó枃ä«)Ó\–PQ”Ô¶*qŬw"–%a£ƒr’ç„°°©ˆª¨N”¯JpsÅb9Ôá/i ®G*j0\ç†ÿg¯„Ó­4ŸxI¬4ûë_ ­ oøª÷Éð?ˆ5Yµ½_Cjäò²Ï©ÜM0ºg7Qòáž8” ïÌx·ˆsZ˜ª¸üz¯^G ÎR©¥R3U%*r“„çtÿ ~|5ø)á¿øD¾øKNðކn¦½ž G¼¼¼¿¼žGwºÕuVæëQÕîXE—·S´0E¼E †8Ó“>âL󉱋žæ1øˆB0ƒ”iÓ§NŒcjT( \Ê U:quj^¥G:’”›ÁåØ,´ú¥EÕkžW”¥.[ò§9¹K–<Òq…ùbå7œäßAáÿøgº‹5mMû¡ã}u|Kâ‹¶j_ÚzÚiZvˆ·¾UåÔ±ÙcLÒtø|›D‚ô}þ_˜îïŊ̱¸Ü.[‚ÄÖö˜l¢•JHrS±¥WWR<ÐŒe>jõêÔæ©)ÉsrŨF1]Æ’ÅWÆrÿ´âaBYÝûÐÃSöT-ùcÉOݼbœ·›”µ:šà5 (Åtï¾Ö4û _EÑ>4k:>©gk©i:Æû7þѶªé·Ð%Õ†§¥jºwÂÙ­u-6êÖX§‚îÚiaš)RH‘ÕÚOÃþ(£9Ò«‡ÀÑ«JN§<ë$„á8»J„³(J-5(É)E¦šMJÎòË+W“]¡ˆ·ßì‹?õÿøM¿h¯ëº?…¾%éú'‡> üfÒum_Æ >(ü9Ó Õ·ÿ†\øWÿAŸø“ß´¿ÿ=ÊùŸ®Çþ…Y7þr_þw›û|Oýâ?ð¢¿ÿ,øeÏ…ôøÙÿ‰=ûKÿóÜ£ë±ÿ¡VMÿ†—ÿáíñ?ôˆÿŠÿü°?á—>ÿÐGãgþ$÷í/ÿÏr®Çþ…Y7þr_þw‡·ÄÿÐ^#ÿ +ÿòÀÿ†\øWÿAŸø“ß´¿ÿ=Ê>»údßøaÉùÞßÿAxü(¯ÿËþsá_ý~6âO~Òÿü÷(úìèU“á‡%ÿçx{|Oýâ?ð¢¿ÿ,øeÏ…ôøÙÿ‰=ûKÿóÜ£ë±ÿ¡VMÿ†—ÿáíñ?ôˆÿŠÿü°?á—>ÿÐGãgþ$÷í/ÿÏr®Çþ…Y7þr_þw‡·ÄÿÐ^#ÿ +ÿòÀÿ†\øWÿAŸø“ß´¿ÿ=Ê>»údßøaÉùÞßÿAxü(¯ÿËjð·†t?xcÞ ðňÒü7á- Hðχ´Ñquv4íAÓíô­&Ä]_O=ÍÈ‚ÂÒÞ/6âi¥/t’;’ÇŸˆ­‹ÄWÅb'í+âjN­IY.j•$ç9rÅ(®i6í’½’KC¥£Ê¢’K²Z/¸Ý¬FãZ_ü¿ö@—ÿV%~çá7ü‹³oû¥ÿ¦7ñÓô™ô¥~²pP@P@|תÉÑÅÿd ¿õbWäÞ,ÿÈ»)ÿ°ŠŸúhïÀ|u=æ{-~zA@P@P@~<üVý–üoãOÚÛOøÕµuañR}7âÅ…~{ˆ!Ñ­ô_ÙïÆß³ß†¼á½YÝs ñ†‹âÝÝ—‘VÑüUb'Œ5Ô3~¥–ñÃ3Ê,¶2Ãa1•lý£©™P̪׫×êµ(ÐŒ,¯5F|®Ó„—èÉÖU/ië(®–ƒ‚KþÞMú]v?` ”M 3åˆKrˆ§Cч@â9¢nc•s†SÈ ŽÕùs\­«§ÊÚºÕiÙõ]ŽßÀ’P@P@xÖ—ÿ'G/ý%ÿÕ‰_¹øMÿ"ìÛþÂ)é£ÍÇ|týæ})_¬œ@P@P@5êŸòtqÙoýX•ù7‹?ò.Êì"§þš;ðOEùžË_†P@P=KRÓ´m:ÿWÕïì´­'J²ºÔµ=ORº‚ÇNÓtëæöþþöåÒ;+{h¥–YåtHÒ6w`ªH¨Bu' T¡)Ôœ”a¦å)7hÆ1WnM´’Jíèƒo+%ÿ Sû0ÑÇüÿÃÁð÷ÿš*ö?ÕÎ!ÿ¡cÿ„XŸþTgí©ÏØàQÿ0ÿ†©ý˜?èãþÿáàø{ÿÍêçÿЇ1ÿÂ,Oÿ*mKþ~Ãÿù‡ü5OìÁÿGðÿÃßþh¨ÿW8‡þ„9þbùP{j_óöøÌ?áªfú8ÿ€¿øx>ÿóEGú¹Ä?ô!Ìð‹ÿʃÛRÿŸ°ÿÀ£þgŠk¿´§ìé7íð¯[‡ãïÁYt];à¯ÇÝ*ÿWâ§_K°Õ5Ÿ~ÍwzF›y~ºé‚ÖþúÓBÖæ¶·’E’xôkç‰Ym&1úÔr ö9cEä¸øÕž?.œ`ðx…9Bž5Œåû;¸ÁÔ¦¥$­8&Ó”o›«KÚÁûHÙFjü˼-×ÉýǵÿÃTþÌôqÿðð|=ÿ押ŸõsˆèC˜ÿá'ÿ•{j_óöøÌ?áªfú8ÿ€¿øx>ÿóEGú¹Ä?ô!Ìð‹ÿʃÛRÿŸ°ÿÀ£þaÿ Sû0ÑÇüÿÃÁð÷ÿš*?ÕÎ!ÿ¡cÿ„XŸþTÚ—üý‡þóøjŸÙƒþŽ?à/þ‡¿üÑQþ®qýsü"Äÿò öÔ¿çì?ð(ÿ™íºv£§êú}†­¤_YêšV©gk¨éšžué÷°%Í•õ…í³¼7vsÛK±MºH’+£`O‘:s£9Ò« R©JN3„“Œ¡(»J2‹³Œ¢ÓM4šjÌÑ5emº*( € (Æ´¿ù:9ì/þ¬JýÏÂoùfßöKÿMn;ã§èÿ3éJýdà ( € ( € ù¯Tÿ“£‹þÈêįɼYÿ‘vSÿa?ôÑ߀øêz/ÌöZü0ô‚€ ( €<ö©ÿ“`ý£ÿì‚ü`ÿÕ{â*ö¸sþJ‡þÆ8/ýI¤g[øUÁ/ý%–«ðcô € ( € (¯ì­ÿ&Áû8Ùø?ÿª÷õûÏÿÉCŸØÇÿ©5Oͨÿ —ø#ÿ¤£ÞkÅ4 ( € ñ­/þNŽ_û Kÿ«¿sð›þEÙ·ý„RÿÓG›Žøéú?ÌúR¿Y8€ ( € ( €>kÕ?äèâÿ²ßú±+òoä]”ÿØEOý4wà>:ž‹ó=–¿ =  € (åÿ:¿Ž®~*ü-ð…>#ø›áÆ•®ü>øÁâýj÷ÂzGÃíKUÔuxঋ¡ÚË/Ä/xšÚÛOŽÛǺô’-¥­¼²HmËM²¶'K(ȱ™¯öv1¯ ~ b¥‹T¡O‡ÌëT’XLVn§6’‹•IEEÏÜm§Ì¿ n+ØN¤éARKÓäR¼gJ){𚵦ï¥î–»ß‚ñOÂxÓÃ#ðo‰ÿi?z§†¼Y êþñ–t/ÙÒÈj:»§ÜiZµ¼Ó~[ÝÚ ‹ «ˆ¼ë[ˆ&Ì݈ꬿ;‡ñƒÄPÅa¸g&¥ˆÂÔ…ZS¾s.J”ä§ rÏ8”eË(§iFQv³M]Óáì+N/ˆi«5z;lö n¯Ï|óŸüaøIà-M4_|RøsàÍfKH¯âÒ|Wã øwS{ äš/RÃWÔíçkI%¶¸D˜!Fh$PÄ£ëåü?Ÿf´eˆÊ²L~e‡§7JUp˜ømyyàøCÆöz|ékuáèÞ%¶±¹’?6+{Éô[Û”¶¢ùÖ9X¯ cšË0Éó|¢T¡šåXÌ®UÔ8âðհ΢…”œhAÉE´¤ã{]^×DÑÅá12œ0øšUçIFS:›„fä ä¢ÛŠ“„Ô[²“„­~Wn¾¼Ó¤( €<þÛâÇÂËÏ7€lþ%xëÇIsudþ ¶ñ—‡gñb^XÛËw{hÞ‹QmAnmí`žib6û£ŽÀT$zߨïösÎ?±qÿÙ1‚¨ñ¿SÄ}QBU#J3xŸgìT%VQ¦¥ÏgRQ‚|Í# ˜¬5 ËWJyr%Ju# ÔQ•4¡&¤ý¤eBËÞR‹ÓG W’nx…¾xãÁ>ðçƒ|/ûIükÒ¼5áHðχt±¡~Η£Mд >ßJÒ,æ¥ð âîì[ØZ[Åç]\O4ž^édwffýâ&#ˆ¯ŠÄpÎMS‰©:µg|æ<Õ*IÎrå†qÇšM»F1н’JÈða`”c‰ÄEE$•èè–‹þ\t:_j?|9ñÏà ׾-øÏâ7‡ i:MÖ™wð÷áÇ…ç %uØç†òKÈÜ‹fE‰¢&O{*Íig¹>i‹–QƒË+åØÌºŒ%„–:Ó§‹¡™Î¢©f7Ÿ,°tœ6¯4Ü“Vòs,<L4iU©QVVÕOg£¦é%nJpþw{ߦÇ×'žP@xÖ—ÿ'G/ý%ÿÕ‰_¹øMÿ"ìÛþÂ)é£ÍÇ|týæ})_¬œ@P@P@5êŸòtqÙoýX•ù7‹?ò.Êì"§þš;ðOEùžË_†P@òçÅù8߃?öDÿh¯ýN¿f åâù#±ßö9Ê?õ ==lþF/þÁêÿéÜ9ÚWåG×…~cül×>赯Š_Çß³ŸŒh{yþü9M7NðÂ-âÔÞš?|B7·ÖzÔÑ®‹Ú4q$ÑdÌm™[ˆÅ~ÑÂXl×áô£•qv„jCˆñn¥|^i[*…xeåÉRJ)º²‹÷܉.cç³ÉR†y’ʶXêK$¬½„)*Òæy­w¾ÊZrÓJPu7‹«­&Ë¿³Mß‚~%üi?~|»øð—üSà/Þ_è>ð)ñÇ‹_]Ò5+]>øRîæÊQáØ¬ož}bIÏ.£ö)6¡ñŠÌ¸{„±yñL8Ÿ7Í1˜Ã.¥OˆÌ FŽ"q]ÅB#Z©4°ÐN“P•x9:•yqÃG™gU<§)–“ÖÇÑÇÔ–Ž¤ž*–,µ¸7VsjTñ3£;F—,%QBr ës÷·Ä]a5ˆ^×?d+†ÖjZoÃO|iHøóâI–U[}šý´O ë:ÌùÖzv¥k,¶¦UŠàLÛ^NŠ^äø(áòÌç ŵ³Šôé{lvW“}c'ÀU¯¾I©Cëèà¥+â'…©^)—³©Ì£µ|Ú®#ZžWŠËèáðµåEO]BXÏaUª³Ã¨Ô„pÔ±RÃá+b_*šŽ6¢–q‹ìíüeñ;Çÿµ×Á_ø þ7Ã~ÏsøžÂ?/Š#ñ<_uÏxûÅêðX;XÃã•ÕŸGŽÅw5˜·†énØÊ‘âYVOp'dùßמo”çØL-G„xg…–?…Ïa•Jª•I`¥Ë‹–5ÙVq–á’½S—ŽÆfTø#—S£Ab*âe:X—7:5WÕ£›Q”¨· :8%x9AÊÇÆ¤ªJXWîxöý§u¯…þ!øæþøGmðãÂöú´òèÐYxÚûǾ!µð›Jñ–¯clšÚiú.—ƒì5élÖYµ)ÞóKŽy"û-І<+ð§`󌟆ñ†ký¯œK.½USO‚Žg–B¦5ªJŒªÖ«ý¡[ R¢„)S† ´¨ºŸY£*’ô#9ÄUÎèå´0õå•UÎpÔ¢ÕIÏŠÀâq‡¡M):øhÑÁÖ”§ ÿjB·² èNœaôf³ñ PñoÅ+á„nÒÛCÕ¾ë~<ñ‡ŒôÇa¯hˆg‹Ã¿….ØÉee­ÝÞwSIïm/ãx|bß÷ÁÇÆÐÈ©`ò,ß:ÍiÉVÀf˜\¯ ƒ••c€À`²×–ÔÃTγlú8Êt%^nxÚÕg5Sšb±ê*¦ ­ˆ§VµhróÊtrÌ žÝPéljÉhÎ]•YÈÚ]•@.FN #8Éë_‹I§)8Ç•6Úe}ËcèèBt¨Ñ¥R£­Rœ!TjÎrŒR”Ú»³“NV»µív>¤ÔóÝ;þNáý_ÚÿVìÁ_¤ðoü“ÜGÿc“ÿQ³Óæ8ƒø¸ðb?<9õzÇ‚P@xÖ—ÿ'G/ý%ÿÕ‰_¹øMÿ"ìÛþÂ)é£ÍÇ|týæ})_¬œ@P@P@5ê¿/íG~]ߥٞ7y_#ó6úìóbÝŽžjgï þMâÊÿ„ì§M&§þšÓòü쓟Mæ{-~za@PËŸ?äã~ ÿÙý¢¿õ:ý˜+—ˆäŽÇØç(ÿÔ,ôõ²?ù¿û«ÿ§pçi_•^ãOýnÃãçŒþ)Ëu¥·‡¼EðÃÁ ²³Ž{³¬ÃªxgÄ>/Õ¯®.­ÚÅm£ÓÞÛÄk Çw,ŒñL(ÕQ¤ú9føgÂx}Sª±”³œFbçËcì*àp˜XÅKŸŸÚª”&åf  âÔÜ›ŠáÄaªUÎ2ìÂ.*Ž+­œ[|î­L{ÅFQI8ºj›åmÊ2çÑAÇÞ9˜>ë¾øë¨|FðÎ…màO‰ºDöŸ|¨Ý_Y ¯i°ü;ãÏ ÛYiw6òx‚æ &ÓõXn&Ó£¹…bº2Mv =‹?ÁãxF§g4ëTÅe5U\Jœè¼šÆà1SZrX)% øgÖ©Fº”"£A¨'^…e™åùƪ¡Œ¡a±PqJ¬-9N¦´ªF.§×p3jw5Rœð²xtðüФþHoسâg…Þoø¿±Žµðù®î¡Ò¾!üMø*5¿~Ñu[Éeùà‡L—@ñ޳ ÚÜyvW´±®¢ÖPý¼D²8OÐ)ø““ãéÒÌ3¬Ç‹ðyÅ*TÕ\S›ª9F2¶œR””êC‚§œm‰†2xxNU(:•~/2¶S,>"¼òì&__ ^¥ZêŽ6”›Ãʬå)aéT¤¹§†¦ß=iiÒRúºNwúRûà§Ä? üMøã†º§€¦Ñ<à ¿„ÿ,ðíž{È<=àˆS…#îÁ!m!ÿ7ñG :¼;J´#uƒÆR©7ü°”*ÑüjT¦¾ã³ùk5üÑi|¬ÿ$Ïa¯ç³Õ ( €<¿âÁÏ|NÔÐ&{{É'ŒI¥@èªÊIë¡«†£[©a«áëΕIÒÅ`ð˜Ú~ÒŒjÆ•E e ñ„áõb§rÔ’m§aÅÊS§Rt§ãÍNs¦ìÚm^‹i¸§g¥Ò>oø÷ðÁøñ£ÆÞ×¾4é¾&ðoÂoˆÞ*ðæ¢ÿ´í¨¥†»áï뾑zú~«ñJæÊý Ô,íå6÷–÷J#Ù4RFÌêäÕ0øÜã)Áâr|žx|^3 F¬VG“ÁÊZð„â§ gã&¹¡(Ê;ÆI¤ÇSŠ…9Ê8ÌBq‹ký¢³Õ&ÖŽv~CÜkðô0 € ('\Ðt/é7º‰t]'Ä:¥ƒQÑuÍ:ÏVÒoàWID7ºuü2ÛÝD%Ž7Ù,l7"œd m‡Äb0uéb°•êaq8y)Ò­Fr§V”ÖÒ§R3„—IE¦»‡IGìÎ2„—IBqpœ$ºÆPn2‹ÒQn-4Ú/Û[[Y[[ÙÙÛÁigiVÖ¶¶ÑGomkmo޼*¤0G*$hªªª*jÕ©Z¥JÕªJ­j²”ç9ÉÊsœ›”§9I¹JR“nRm¶ÛmÜΕ*t)Ó£FœhÑ£Â8EB„ŒaÅ(Æ1ŠJ1I$’I$‰ë3@ ø ðÁ>:øð_Æþ)×¾4ê>'ñ‡>*ñ£í#ûDi‘ßëÞ!ð~«ê÷©§i_­¬´ô›P»¸”[YÛ[ÛÄG Qƪ‹ûþsW‚Î3l'Ééáð˜ÌUQyO>Zt«Î4ð2œ¹c¹§)IÚòm¶ÏÏ)â1R§M¼f"òŒ[ÿh¬µi_jšÿà¯|âeñŽnüI…ªxfßRñÅŠßMއ­ê©«Øé¶¿¼k­[i‚òÿÃ:³Ki 2Éý•´…ió*cêÏ,,0ø<&u)Õœ0™~ÏR”j”ª<„ª{8ת ¦ä£í$ÒMÜR”æâêU©UÅ5iR¥NTí{sÊV¿*½·²ì{ q( € ñ߯ö¿íñcVˆy–>ø_ðŸÁ+8åañ§­üFñˆ´ïö$‹ÃÚÃÛ£Œî]R<ãË¿ |,ÃJâ+οZÆT”óS§N•4þU#U|+ÿz—òÅ}÷oò±ô~–q…P@P@yÆÏë*ðl¾†)üoà=Hø…à‹y¥[hu ÃM1›ÃÓ]7vÞ ðýÞ¹áÙ®å„>!–\/ió³|º–m–crÚ¯–ºR‚•¯É+^JêîQ’×t]9ºSŒ—Ù{~h½áhþ7ð¾ƒâíYeÒA˜¼6­5%ý‰†ÒuãVPÓûwUj2R}‚ûHŸõŠ¢’‡Ôav›K륯ÿ0þggýûOÿÑ1ø ÿ‰ñ ÿ¡‚¹?ÔÞÿ¢1ÿÃ&ÿŸ¥¬èøPÿùœ?³¿iÿú&?ñ þ!ô0Qþ¦ð÷ýyþ0ßüýõ‚¯ýÃÿ ÿ3‡öwí?ÿDÇà/þ$Ä/þ† ?ÔÞÿ¢1ÿÃ&ÿŸ¡þ°Uÿ áCÿæpþÎý§ÿè˜üÿăø…ÿÐÁGú›ÃßôQæ?ødÃóô?Ö ¿ôü(üÎ{7Áj>ü'øy­\XÝëøiàOj×Z\—é—:Ÿ…ü-¥hw÷t·vÖóÉc%ÕŒ¯ Ío†6Bñ£«ôÙ¶.ž;4̱ԣ(ÒÆb±á¤¦¡V´êEIEÉ)%$¤”š½ìÚÔùúqp„ ÷ŒR%cÒëÏ(( € Àñ_‰´xk]ñgˆ.ÓEðæ•{¬jS$m<ÂÖžHím£îï$Ø"†Þ ÒM,‘ųȠôa0µ±¸œ> zøš‘§N;^Sj*ïd•îÛÒ*íÙ!I¨EÉ袮þFWÁ kð•þ±â«e³ñ¿Äoj|gd²,ßÙZ®¹…Ž•á³:·Oáïéðë\+2ÎÞ3&ØåDOë—,§“åx¶“¼p””\­ni¿z¤í­¹ê9JÝ.xU&êNSÛ™íÙt_${zdP@P@ó׈ô gáv½«x×Áú=î½àOÜÍ«xÿÁ,2]k:¹++^ü@ð6 lÚ«^(iußÚížöXέ¥Å>¯5õ§ˆ¿;ãn Ž}í ¹F–mB6q~ìqPŽÐ“Ú5cµ:F¿wQòòΟ^ì}Éÿ ÿä¿ð;¯šóï¼?â ÅZ=ˆ<5«iúCçØjš]ÔW–W1†(Þ\г.ô‘^7C†ÑÑÕ]HϸŒ=|%j˜lMЯEòΜâã(¿4ì×uÑ«5£=TÓIÅÝ=š6+…P@P@‡?<}ñ6?ø(ƒ~1hÚ.£?Â_‚QMà}cYˆ¨³“ÂZ^¡àß üo×á²/æ^Ûø{Vøí£ÛÝÜ*ãm ä.«¤Îöÿ¯äø,¿ýFÅeUjÆ9žlÖ"7ñ*Óz¹}7-¢ëÃ.œ¡ÝûD­ûØ©pT”Ö&3Kܧ£~JÊOåξï#÷¿ ;€ ( € (  w^Ñ<1¤_kÞ#Õ´í DÒàkCUÕnà±°³HS%ÅÕäq‚̪l³2ª‚ÌÖ… Øš´ðøjS¯Z£å…8EÊr}”b›bmE]¾U¯CÏ Šð« þ°qšWwq¿$š\Ñv4§V¥'îK—˧Üô9fÓiýýžÚßaˆõýgÇ?/䢭֟c៉6Ò]"€^hfµŽfÉ[{U!WóÜ_„øÎøÚ¶ìÕ¥ ö}“ŒðútW»]\Ž¸ã¤—½M;vvÿ2?íÿÚ?þˆwÃïü>·_üèëÏÿˆI[þ‡°ÿÂIóA___óëÿ&ÿ€Ûÿ´ýï‡ßø}n¿ùÑÑÿ’·ýaÿ„’ÿæ€úúÿŸ_ù7üþßý£ÿè‡|>ÿÃëuÿÎŽø„•¿è{ü$—ÿ4××üúÿÉ¿àöÿíÿD;á÷þ[¯þttÄ$­ÿCØá$¿ù >¾¿ç×þMÿ?·ÿhÿú!ß¿ðúÝó££þ!%oúÃÿ %ÿÍõõÿ>¿òoøý¿ûGÿÑø}ÿ‡Öëÿñ +ÐöøI/þh¯¯ùõÿ“ÀíÿÚ?þˆwÃïü>·_üèèÿˆI[þ‡°ÿÂIó@}}ϯü›þoþÑÿôC¾áõºÿçGGüBJßô=‡þKÿšëëþ}äßðŸ5˜þ1ÅñãᦎßþÆ.þ ~Òq Ÿ‹²\éÖ›âˆ_³ï‹õ Rò_…˜û\º¥Í™–Þ[K“¨¶¿}<ÓÆöÌ·ž”<6ÅÈÃo'Z®'ˆ…e‡’tÖ Ž.Œ!«ÝYbaÈÓŠ¦©(¥f¹cë‘æOÙYEIZÿÌâûykÞç¿A¬þÑvÐÃoÀ߇ëG J~<^¹Xâ@ˆ Éð•™ÈUsORI¯9øK]¶Þ{ ·wþÈÖ¾‹¡_Kþ]=?½ÿ—ûöÿ¢ðûÿ­×ÿ::_ñ +ÐöøI/þh¯¯ùõÿ“ÀíÿÚ?þˆwÃïü>·_üèèÿˆI[þ‡°ÿÂIó@}}ϯü›þoþÑÿôC¾áõºÿçGGüBJßô=‡þKÿšëëþ}äßðûöÿ¢ðûÿ­×ÿ::?âVÿ¡ì?ð’_üÐ__óëÿ&ÿ€Ûÿ´ýï‡ßø}n¿ùÑÑÿ’·ýaÿ„’ÿæ€úúÿŸ_ù7üþßý£ÿè‡|>ÿÃëuÿÎŽø„•¿è{ü$—ÿ4××üúÿÉ¿àöÿíÿD;á÷þ[¯þttÄ$­ÿCØá$¿ù >¾¿ç×þMÿ‘,?j pùÙü øgðÚ¶¹ãÏŒ· ëäéSøcá¬åÔ®÷³G (fŽér‡¿ á6 œÓÆæõ±_fPw蛜ñw²Môq&Xé[ݦ£êïùXé¼7ð;E²Õìñü?Á¿û ´·þ¬_Ù:€5ÿhŸˆzÿ‚¿~!øV çÄ>Ñâ¼Òañ¥íþŒ×SjV6*u -;SÓ®nmÕ.ŒpßZ±*˜£5Í^U•l§BP§<Ë8Èò×9ÂU#Nžiœ`rêµ#R“”éÒÅNt×:´Œy¯Åég 9…z±”£€Ë³ êzÜÛK«iº/Àè:µå€ek›];[¾ý¥µ{}2ñâÜ©s6•~‘± Öò´÷CÙS©%Vœ"ª$¡5MóòÉS—4¡QrƧ,§[Î PŒéÊJ¤xÔªÖÃÓ©EÆŒêFœ×<]H¤Üe8òÆt›nÑŒ¹’Œš›Œ’p• ¿Úà•‚ø¶{¿êpi~Ö.<=ã?>! xÄ6¾2²ð LJµ¯…N‰½‰u:rê sö;¸µ_+û)…ígI:Ô0xŠIÊžc*PÁ¤¿y‹hV•8á(»UĶðõ¨ÉP…NLT>§>\\¡F]óÃÕ¥‰«ƒŸ,ká°ÏZ>Ò› 2Àj:¸‰©:t#õ bW¶”‹ŒRu%=Sö…øc¢é¾¿Ô'ñÔW^3]^oxNƒÿï~#ÞÙh}ŸYÕ¦øYcàI¼c¦hv“5²Ëª_hvÖKý£§Ÿ?¡¸šÎ8zÕhNQsÃáa¬éÊ5iáðÓpŒ*âjÒs¥†æœÕ5 ó§SÚF­>_iB´ióÆJT£Zü´ªVú½)OÜöÕ•]çÊñ´W<åAT…4×<¢ä“MWöŒø;¥Xx#Q_O¯Añ'LÕµCà xÇâ¥âËm* u´MÀžÕïï.tæÖ,ÚêÕm¾ÑoW³KE¦^½§DpÕ¥ž\¢ž&”(Ušç‡²†.\>*XŽo«ÇU¸rã]U…µlÞž.µJ“^í¨aªÎ•8NU)RŠxÃë—9ÒÁa”«âa 3ho pyVa™ÚOê±Áû*wTäçŠÌ0XY:М]JP§CVpö¦ªâ£C¬MzT§èúwÆOãKÏ…í­ê§|:–°x¾=#Àž:>ðåÔþ²ñ\7^#ñz=î‹à½?PÑï{¬ëq¥Ì‰=µÅÕí•ÌQlÝ”q¸ê.42Ü$±ÕkÖ§SXjªj^Þj…:ÕðêPhRЍ¨J8¿c 4ãPç:ô¡–S¬½¦+2¡Fµt©ÏÚÕ…Zõ0‘ª°ŠUq)ÏBµ5Þô9)ɨ¹:> ý¡~üAÖlô xšö{íZ×R¿ðÌú·„|iá}Ç:vŒÊ5MOῈüSáÝ;Iø•¥ÚÄðÜI{ákÝ^¶¹·ºó>Íq²fß.ŠœeJž G^Œ©â(á+ÅJ–&¦j8˜Q•ái**1©R)8Ô­J™Nœ!Τ§^¦5 ÕL<±4½«–8š|Øw_—‰œ(ª®¥JX\UZq<5ySâ¬lŸÙËPƒF½µñí÷ö_‰"Ÿþ}rãÀ¬¼9âÍJÚÜÜKáo x’óÁñi~*ñàu’Ñ|'¤ÝÞk¯{ ÚziÍ} –éQ„å*táJr­[]*œÞ"¾N‚öØl:¶ÄÓ‡Öhʬ¨S¨¨ÁÊuy!J¬¡ÕˆÃÔÂW©†Ä8P ULyJ­%G ‰¥ñßö®ð¯ üVmXûþøgY^çÁž<Õþi^4A“Uð÷„¼gñDÒSÃZ·4š\I¢ßxLÔgmcO†jV‚|)JX‰á)CÃàã)þî5¿Û(PÆG:ŽÅÖÃSe8áwJµ ð©,6"œ=<L~ Œ”©S•8Wª©µ*´põýzÑŠ¨ðôeÉΪׄ!ì~Ú¢ÕGßx›ö‡ø]à7³°ñ޽®¾ÓüOâ(|9àßxÆËÁº%ô{¢×¼uàÿjö¿<;+Ezðê^&¹Ó-d‹L¾•'x´û§ƒ§4±¸Ü5:Š4pxÈàåZ´£K Õ'j4*âê{<,+Ê¥RtåR3§Nµµ# UéJ~> uñ~YŠ©Iʾa„Xšt(BukUŒ!ZX|-?i‰«N5'ìàá óÔR¥:œT¾#ø¥q¤üZøMàû)¼?7ƒ|yàOŠž1Õ5édy$†/‡òè÷Zf© –1é3Zx¯PšâYa¸Û¯àÿø[Iñ¦¦M 7ÚßÃÏø§Ãºv•ñD„\ÙÌÚ‡†/uko³ßZ\‰M½Ô2˼)U’­û©Ò©…§F­jbèâhÒÄ7U+a*¨biS”׳”êRŒiÕ”)Tq©Rœ%Í9œ¡e(N­Z«í0ò¯C™Ô¡M>l<«(¤ãJ5]IÓ£^¥8Ê ²‡3©~ÖtKû;Pñž¡mø¢Xø€øâ$žÖ¼e6³‡¿áð×Ä|&þñ?ˆbÖ&’Þ}?IÕ¯g¶:v¦÷Å“|ö™a_×j`)aÓ•LÓ“êp’t¥Š„êÂ:ØuUCÚáç*”10æÃÎŒáˆW‡’ªõ¯aV9Ö\±ÊáR¦2I©Ç©a¥Šœq2‡4hUT£Ë\kO*xHS–.­:é5_Ú á>‰âÈü©x‡RƒQoØøBMa<㛟Ùx»Q1%‡„õO‰öž—Áú?‰æžâÒÝt›ívÞóíÖ–Æ=Ô1ʰrXê°£…¼çVxŠTn8âja)ש‰†u!‹t>«Š¥W겫ɉÂbðý« ^8®ÖjµZPÂÆ”ëòµRXXVt}”ñQ§Ï,,g F²–!R_VÄPÅ;a«R«.?Ÿ´¯…µü|ð߈aÔ<áÿ×ÚtÞ+ñ?…üiáŸ˧/†´mgZÕu/x›Ãú~‹eåßkMš^I-íšjö†çO¿†dŒ-XÖÉ¥›T÷?áJ¾ $›«((a!„§N…ž"¾6¾&¥xO F“¯FUpXZ˜xV­FX®œN¥Ë—R½YâòÊXÖÒ½:u>¹™R­|D[ÃÇ O …ÃÔUç8ÒUV:ŸµsÁâiá½À¾|K¾Ô´ êäÞ‘ca«^ø{ÆñÏîª<ñiÚí·†þ"xoCÔïü?qqmsz¥­¤Öm5´°‰üØÙ§ØÔP­;&°Õ¾¯Y)EÎ…wR4«ÓMÔ¡)ÓnT•XÃÚ¨Uö|þʯ'kSnŠMòâi:Ô'Ë%N½(ÉFs¡U¯gYRs§í}”æèûjª‚¯EÏÔ«3P € ( € ( € ( € ùÿÄòtÿÿì€~Òßú±dêÉý°ô-SÄß³?ÅÝ FеOj:†á‚ß@Ñ4{ïjšª®±¦K=­ž‰¦ÚÜÝjr5´so»*°zW64\ŠXŠ.¾‡pÍ|L=”«¯ªaø‡,¯‹œéB”éRÃS«R²ä’T¡7%Ê™½UPÍcB§±ÄÔÊ3ªT%í'õйF6–0©)AF¤ëNœ)¾h¿i(¤îÑç>¶ýtoørûÁ¿³=ç…<[£g‰â;/ØGâïƒnt}Jå–Î;ÁâÙ¾ØCáè”ÎÂ]B{ëHa¤’i£‰]‡¯GÚºíaª*3’«'V4#ìç Æ¤IÊœcÒr¦ã)%5'NÒæå~o,c„§õª~×ØÂ”çZ^Ò—-HÉB*rHT‚œ§ÏÊòLâµOø²_Ùãâ¶„¾ ñš¶±û`ê>&ƒFÔŸQÕ<7'íe ëËâtñff½ÐÛÂöϨ‹åà6Ÿ3ìè\pejT©xPª'M帼±J^ëÂÆ¶iVRÄ^ÞÂ1§RI:œ©Bp›´eýÌléËÆÒŒ£(bøv½ -4ãZ³ðû‚Ti5¥J¯ a8sMâc,=½¬\°øÂòûáwísñO^Ð<{âøÏá.‡à[ïøÅßn|%âo ø£Äž!šßVðÏt½c\´°×´ý~#¥m¤½’OáÖ‚þâ g±1‚ŸÕЩJR©˜O,ÇaªF-ªÑÀÑÆa+àyíÉJ­9âéâ¨*õ)Q« ø§Nj¥Š|˜Åí©d)(Û/y¶h©ÇëÿÙ•°øŽI8Ê¥9,¾¶«¤ªN”ã†ç³ª¥OÇ~ |6ñÖƒñ+àˆ|Càc@µÔn¿lß\ØMd×qø×â¿ÄxŸÁÚˆïìd»°Ñ¼Ew¢Ëu#Y Ç>tz„Ò5¬äveÔe€o.­^5ªå¼!—eÕ+F\Ôg‹§ÑÅTÂaë]Ƽp4§õZr§)F¥ '¶£|?$ŠÇW¥£™bèSä§â¼¿FŒ¡Z® ÃYÖY,Ê­ Æ5h}z¼)âêF­:u(ÔÌ)QÄÓ¡Šœ¨GèÏŽº&³«ø›ömŸIÒ5=R ö€Óunm:Âêö-Gá‡Å-=õ]VKhtí5oõ cu9Ž!5õ¼e÷ÌŠØàÓ‡åÕ¤¹hÓ˳øJ£Òl²¥:0”Ÿ»U¨Ô)Å´ç6£Þƒrö'Rºöµ¡“ªp¿¿7K‰r:õ#¼½ UkO•>JTªT•¡ 5æW ü[âÉÿoéö·þ¿ø¤t­Á~$¾²¾ÓìuºýŸ<#áȯôÝKd_oÓí5ß¶ZË5¬²,3Cs"XÝ•‰Â×Äpv/N’©ŠyÞqˆŽ£Pué9eu!NJzFŽ5P©B5&).{óF3G§†Åáð¼EÃ8Ú²O„ÉòúuªEsûÏx’¬“åMûj±1ÉZ¢J2J*¬$ð"¾Öþ,k²þ…¢|4øá+ïƒ^*>*ø—uãŸx‹ÁºOƒâоø»Àá½ÄZ­¾ñóT×|Aóx6óÄ{YXÏy-Ü6òZ›ßs7©vgÄö¤Ö¾OžF•9Btñ8ºÙå8}[,$ùqžÆX¬\ªRö4±:4©Õ©Zµþ_NxÃä5è©æ¯”Qj-TÃІQŠ…|Fa M>jŒã…X,,Eˆ­O4u>®©QÆO ƒàø¢Óà§ì¤Þx+_¶Õ<ñÂzŸŠôÛŸj0ßøJ>üQ¶»Ô!¿ÒìáðO‰¼Pº€t¾ͦÃ-ä]¹œ^a_>Æ`q*ªÌrü× f'› ícšF«eÿºÅ7 Gêt¡˜eÕªQœ]9`e„Â<-| 8Nη°µZp­‡U0“˨ÕŲ¡ÉÍÛŠ„°Øc9<Åâ°œIVŒ¥i}v–:X¬},eiR‹… ´iÕŽ.­:ÞÆqÌhG Êr‡=_‹ZgÄ}CñFŸ¨xwö¿ñ7†ÿh‹_/Â_|'ŸÃŸ4è_´¿ÿÂǰñG†<§Ëñ§Ä§ƒ-†©s¢·‹¼]}q®x¢òé|; Îö½‹'’§[qµ¹¥ýŸŽËÞaWSykxºô*`ðxK’X*5çBs t1^Ç,¡,®;GŒ¡SlÖõaÆZ3RX¼¶­¹Sªùóý‰‡ÃÒXœd“t':îXJÕp¸yUÂPÊâ«8á_Nø³àøÖëö¹ð‡|;ãÛ}gÄÞ;øñoÂv>“OÓü_á¯èß ^Òü7ãh>2KÏ j¶ðhšÔ¾a¹‚Ý®í>ÂÓH¼ùzx<>[Z³©MðçcqØ¥EFuã†Åa°‹ÁÓ”*G2§‡jX©ÇB”ð²Á»bªR£SjõèâgGM¯øVàÚùm)ÔU!N¹ãø’o Œ•£,q4±Ø\=yWö3ŽV­'ÍFr§ê?4»_|eÒ|u/ŠkOê>øâ wã?Â_üð^kã=SAº¾ðçØà¿Ãø³]š X]¬šuž¹¦X®Ÿ›››iï-RëÒ¡ a£›Nš¥Œ§…ùʫkðØŠµ©Ê†5=¥*˜ER¥±8¼5N†aZ†­z‹O åV›¯K*¥?iaˆ­ŠNØy¼#ÃÍׯË*|•UeMQÃb*Nu°ð«:~ÆŒj¿¶ë˜Ø( € ( € ( € ( €>ñü?Á¿û ´·þ¬_Ù:€>€ € (  Ox“Að–“6»âMRÓGÒmî4ûI/¯dÙ»Õu ]#K´Œ(-5Ýæ©}gi1«I,÷QE³º‚“N¶µ­ÄQÂЇZ•ñ#J•5Úò’r“´)ÁN­IB”'8¾V©â*¨· &ŠªÒo“„¡Sˆ©evÕ*ªTj)ɨÚ*Ri;Zµ­õö¯§Á§ú͵¥ä—º&³¦ØÍ-Õ…¶£iž£aŸˆ-–Þî$’çKžògI­f’;«y¡‰ÁóÓö«Hª•)Z^ìù©rs?g+Töo{:ܾʭ¥ì§>Iò’‹§(EÚó§«•©.YT«I)J-¨TR£7*3q­n•YAR¯Bu4èP@bx‹Äš„´™µßj–š>“oq§ÚI}{&È…Þ«¨Zé]¤aAi®ï5Kë;H!ZIgºŠ(ÕÔšu°˜u­ln"Ž„:Ô¯ˆ©T©®×”“”¡N ujJ¡9ÅòµOUE¸a0øŒUV“|˜|% ˜œEK+¶©P¥R£QNMFÑR“IíÓ‡9ÆÜçÆ9Î{b³­ì½•_oÉì9%í=¥¹9,ùùù½ÞN[ósikßA«Ý[~–Þý,|•ðoáÿìÙâù-17ŠÃâçS^ ˜Ú8ºÞ×ë× ‹ÄRÌ(O^=´éæ4©cªÆ8¸Ð®}mP@P@P@P@P@|ÿâ?ù:ƒö@?ioýX¿²u}@òÿÆiõoü[ø1ðuõ¯øgÁ~0Òþ#x¿Å:—‚¼K­x/]×'ð ^] âï ÜYë&ŸsqâKNçûSÓ¯.@Kv˜ØË{ Î8¬Fo§ZMQʲ‰chÑRœ|E|~.ö•9% T§¥ˆœÕ+Ê‹Äâ0ÕkÆ^Êœ'®'÷V­)F5±¹¶9rÂs§‡Ž2Ì%|êQ„±5p4©Ê¢Š¨¨CN”âêÊpù“UÖË O‡£îŸ¶‚tkÙâÃ@’óÅ«c |@øgc<?ñÝ®µ<-ñoÀž/­x’ÛÄ‘êÞ$ºûôÒ‹­^úúq|–ú˜jV–÷pË“Äñ/ Õ©hËžàéÍRJ„kÎNn•: :*ö5(FL:æT%MJW0Ÿ¹Ë¸’œ5ŠÈ8†µçûÉsÑÉñøˆ.zœÓtH¨Õ åìkPæÃV§S )R~Añ/]ñ¦‘áßÚ·Ãþøƒãͼ/ñ§öXðwƒu¨¼W­júß„´zËàž¨º^¡â+Ëù&kìjsÞ­éºMF]Fñõº7·teó–9ðËÄ»¼ÃŽqØLG³Q¤§…Q¶–’„c‡‡´Ÿ²¡ª4¹Ÿ³„Q¼èÑÁª±§IN~Ìñ‘YT©|UÆnž&uý´±ú¦,GµXˆ¬=Z±ti¸uVß &¸ý <{ðŸþ×ǨþÛ|ðGÄ+=~7|Pm^×Çz߉¼}áiµè<|þ*>.·°Nðô2A®Ã ËqpÓÏ¥Ë$í-JÓ–KÆUbý|Ÿ†Ž_R7¾8̪½Z±i·õŸu(ÿh<_²u+òrº³o:¿¸«c_ííJXún(Ãý™ˆÊ+Ò•*tá 9|«kT§Yå”°r•<= Q”h*”jx€¾&|Pø²ßü+â½ãÏÄm"Ãö`øwñ S‹àŸÄ¿ |#ñ¿ãk~)ðí׋×ì绺ðô¨eK«ÛYr¥(c³.|C§N¾‡iãñZ¥,=LÚ®;•bkAEPrÃR…Iãéa!…ÃÖÌ0´ªFkJ59ëGê˜ßUsŽŸPÀájW䫉§–¼³š{9λsúÎ`*¯û]l¬å?m‰«UdYøÛÆ>ø£ü0Oø£TðÏm xGÔµOê×Úåÿ‚üMû8ëÞ?ñwˆnî>Ùãkm3ÄšœI ÚÜúäËk¦›Û‹»›d¹u•Tž6¿ÖÄS´Ý2ÁÕ÷c XØäøY¬:TaQöÔ¹¾¯:”é¨Ë©‰VÄN´ŸF.…,ˆéÑâòÎÌ)ÂR•J¸øþ&Ëp8º0­9N¤a‹¥FxÈÁÍû<>k<%>L£†¥…ñö)¼o¦~Ôº6»â\é^ý¤e[?Xiž9ñ~…m¢A«Åð"-RÂÉ<=®Ùy¯s¯j—âÛý\Z”Ñê‘$z•­½Ô<¹Dið}ZŽR©SñØ7SžjWO/Q„&¤¥Eó¬=H8ÕÃ9Õö¤êTæíÅ5F9q„àËR*»ÄS\cR&­vêÒÃái׌½Ü^ð؈Ö¿dþ¸ý¡¼E¯|1ø¨Ià›íVÃS[ïxÇÄS]Ïâ oÚ‹ÂQxzup5p®eF(VŽkÖ_aƒú¶ÿì7áÍ?ÿ²ßÁóaq®Ïýµàý[¼þÜñO‰¼N!¼¹±‚ !ÒG‰u{ñ i –±˜ô­/ìv»K$VÉ$ò´žÎ:mÓÊ¡h¥O*ÊšjRýî]…¯.i¤¥4§RQ¦¦ä¨ÑTðôT0ô©RƒÆS<ë‰T\½Ìó=¢¹§9û”3¬Âœ¹å.j²Š½jò½|DïWR­Fæþ³®0 € ( € ( € ( € ( €>ñü?Á¿û ´·þ¬_Ù:€>€ € á<ðÓÁŸtí?Lñ†™wvº6«¹¡jš>½â x›ÃºÍ´S[¦©á¿xGUÓ5Ïß5Íݤ³iº…«Ík{uk1’Úæh¤g^Ž&<Ôñ#Z© Μýzn•zRp”\èÖƒµJ3æ¥7s”éÓ”iɺ50òQ ²¥9BqŒãí(TU(ÔJi¨Õ¥5zucËR Î1’Œæ¥‰¤üø_¡iþÓ4Ï ˆ ðoŒî>"è×k ½Õ¦ñåî«é7þ.ñ»}ªÍ©xÇÄvî©Íïˆ.õ9nZád¤–^-c7 Ø*ôÔiO.Â×Áácƨa±4§GJ%F*´jT”ä¡Ï*Õjâ½½IÔ”Æñ¥£Í)G3–X§9J¥JÏ _ ˆÂóÕ¨åVØià0TèEMF– C%8Ð]G޼ áo‰>Õ|ãM1õo ëÏíÖQj¦‘qæé×öº®ug«h—¶z†—i©ØÙÝAweuo<3[G$r+ 5…J0©,<Ûœ*a+ÑÄÑ©N¥JU)WÃÔZU)Ô¥(T‹Œâ”’’H9Ò¨§Js„´§Vt•e rס_ V2Œg”1T*a±§ ©FP«B­JrMm'k;5ÊIð;áŒÚˆôË­öúÛÅÚ×¼EâY5/ø»QÔ5­sá¼>ƒÁÚ¥ö­¯K}-å’x;ÆGû@ûkØ4—ÿj’êå®7Œ½\5Zq)`ó*¹½B¥˜UtÝJð§Æš‹öTùpü¿V‚¡F)´â2œiû.yJ?Ù•rvç)T›Ë«ýÚáåRnS“Ÿöž7÷ò“Ä/mîÕ^γì£ðo†áñ†¡ãèôݾ,Õ<5¥ø>ÿVûeùóü9¢êzƱ¦iß`k£g“¨ëÚ´Þ|vé;ý¯d’¼qD±áìiû à ËûŒÖT§ŠßïeB\='{óC–j°µ7ù¹¤œ£*IÎ88MÞ8Š•d½›Æ}Së;$åí>£…øù¹=—îùyêsù­Ïìåð†} Á~µÐ5¿Û|;ÒÃÞÕ<ãÿˆžñnáéDhðòøëÁÞ+Ó§„§Zq…o«F6¡:ÑJN¥yBQ–"»¨ëUyV•nZ²¯Äæ2r„Ž3R­\UzMÇ÷¼ëÔö±£ìéÊ<ää¥J0·qû>|!ŸÁøy„N•áÏj)­x^_øƒÅñNƒ¯´ý«Äšg|;­YxžÓÄÚ‡Ûµ!¨ë ¬ íLjº€Ôn.†¡r''ï×Ââ"–xSÃa£†ŠÂÒÃágIЖ2¥F– ØÚšÁS§,c \´S¥IÃ5¤1tçûõŽ­N!Öýü«baQU†"s­Ï7ˆ§8¯g[›ÚÓ…éÂQ¦ÜÍû?|#ŸÀËðí¼+,~OÃã1ukâOYxÄøÚ B=Q|pÿ­5Øü['Žú0óx…µ³©Î­$s]I®Ž¦¹å—É~ååP•,£þΰô§Jµ´éF‡³Œi×§ˆÄ,LåÄË^uÕIÖ©)¿uõͯ¤±?XKíÔcJ½¯Ö^ªÃ†Ž »¼ p˜5„ö †öYöß³WÁ{O xßÁqxJí´/ˆúž‘®xßí>/ñ½î¹âhPèñi~$ºñ]ç‰%×!ñ4O é7M¬[ê0ßMyiöé®$¼’IäÏÙAPÂa©¯«ÑÀca†Xvðò¡Œç¡Q×¥:œá)ÏNUTd¡YºÞÖ3úÆ#ÚÜjN5jÖoÚU¯‚ž]VURªêàªGNXj¾ÕOÚÓT±ØŒ<=§4©a,57 > N—©^øGú§…'ð>·¦§ˆ|-y¡·‡5-+ÄóÝø™uìþÁ=¦¹w¯Ïwu®4ö¹Y翞æiÙÚI¤y˜Ö6ñê´qTâã^\ò8Æ„c5%8ÊŒh*j„©ÍFteASt'J“„¡§ )`}—Õç(º –.¤¥Y¸´ã(Ô•gQÖŒâÜ*F«š© JRŒš|g€~ |:øi{yªx_KÖ¦Ö¯t«M_x¿Æ¾8øâX<;a+Ïgá½?ÄŸüG­êzW†¡º’K…Ò,®íì„ò4þGœÅΕç,N†®ùéf%WÒ¦&«¦é{LEXÚ­iœªF”ªNNŠ«YÒäuª¹ã ©<;„yVœ©aáwì°ôæé:‘ÃÒoÙPöÞëºPƒ¯65œã† ©ö> ð‡>ø[AðW„tïì øgM·Ò4=3íw×ÿaÓíWdÿlÔî®.îv¯eÄò¹îÆœêN§²çwö¨Ð†‰Z–Œ(Qމ_’•8C™ÞRåæ“”›oz’•Jø¬Dß5lf#‹­-¹ñºõ18Š–VŒ}¥zµ'ÉC›–ŒbºZ‚B€ ( € ( € ( € ( € ùÿÄòtÿÿì€~Òßú±dêñÝgöµñÖ¤x·Ç)ðõO†¾øË«|Ö5 ;âE‘ñY|Cÿ…u§ë¾ ð]ç„íô­SI¸Õîôx¦]gžšÞââú(ÒæÞÊ+Ûüð3–. ÎQ*œTÝ,œÕ,Cž6†8©¸ÓTðõ±EIÖ¤«Õ¤ª9¼,”"ªuc°Ë S5£F§·©’á0øüK”eNT©•eù¾'ظûj•q8<&+Vt}”hÔ¥‡¤éâjõ°ø>š÷ö Õü qñGøÁðÒ x—Àþø}âJøãFøƒiã[_‰ž(Ô|á]MÕ5ß ø;û7įã;û:x.mŒ+wÏö‹Â²´7MýbŽ Æ¾f³l&Mr¥FxŒÃ ø:ñÄJ._T”c‹öó–5èCRQÃVJ4§£ìê­Nj9MLg˜¬LãmJ†N£W0¥ˆÃS©Rœ1tðõðu(Ñ£ŠÄR¯S1®œTç±/í â/ÝøGøÙðÚÓÂ:æ—ðÃÅ_ü=kðãÆ“|P±ñw‡< ™ñ†‰§]êþðeÕŸ4Ù5=ÿgϧýŠâZ)­õ)½êØçˆ¯F†5¯N¢|žx_kNr§Bœ°ØÚ’¡‡ÇBµI®L¯‹¦”*R¥DÚÇ?Åà½Sâ_Ž~øv?‡6ÿ µO‰úOŠ>üW´ø´º…Ž•¦Ç¬`\Xêžðkÿmjd¦M>}M{L•ì®ÖëP²Qk%þÙšþÈ¥™¬cTñYtðôã?g†®êÔ©J¤Ö&²¦ðôpíP­V¶.… T¯íÔœ©T¤£.‚ͱyeºWÃæ•§F2Ä/c_ ïIâðôÞ"“n¥ÔpØŒUz8šNЧV2UVŸ¾.üJÖ´3ãü(ÐïüsãßøàßÅñ•õXí­ Ô ðãhÒø··~ ÔìniŸðާ‰l®¥´¹†[Ëfk3¨ë£S/Y•E:“Ç`%JèR…Ö6S•hN8zµfá(P’©†*8˜Özq¥YC,$©æ²õ‚©àó ³¥íqr†¦X*sÇSR­FŠMÔ§‰V"xZôe F¥7í–G„?h=zëâþ™ðkâG‚¼'à¿øáî§ñ+@³ðßÅñÖ³¦h:EþŸguiñ@ºð_‡fðf«"j‘f²›Ä}̺f¯ :ƒg«ÜáNTãK<úÅzJ¿Q¡_<;©ˆÁ8Nr§ˆú¾*T¨U›ÃÊXZ±§[ ‡­[ Œ¡ˆT¡ïÓŒJsäÉëÂ…HPΪN• X…8øOØÎ½m„ŒêÖq£Š£Vt18ˆPÅáÝ)©Æ¡ÀjßµŸŽ´ÿøkâÝŸÀØ5ƒž8ñŸ„|+á‰iã†Ó”)UYŽA–céýGŸUÃR„Wï~©,ZztqzSäÅÇåR­*~Ö„1TçƒúÛ“§V{⢰ô¸Š­'õŠ|5O0u’V–"¦] ´«ýQEÍTÃÇOØJ½YQ’ÁÆ®aNXÓ†¯S®þÓ:ýŸü{ ü0¶×~ |(ñ&»á¯xÖo/Æ¥ü{%‡õïü:_ÝÚx—Ã~¸Žåe–ûÅZýáÑõOìý:äEbulp•)U£”c1UaƒÀgµ•,-yI5J•LTðl^;ŸÙC …¯Ž¦âåN¦"¦(bëÒƒö˜zZVÂâ/—a)ýk0ÀУZ­ò{Jµp”ó©ad½£«ŒXÔ\aVz3ÆTX7^5+Ggö¬ñǼ'ð]×N•)ÕÃ):ôåÕþ5üH—Ä&ð߀>øsÆ×ÿ ´=óâ¼³üSÚiÞ%Õ´h"u²Ì¾^ÊŽi˜áá‰åI¬ñ5p˜OoŠT]{W­†ÄÎN–£¥‡¥Ò‹•jT¥èÚÆOê?`øñÝì?åð|Ik‹‹']Rßñh­®Ü$útníý© ¬rÄöѼ„ÏòôæÐ–Q:ôæ¾¹*Nœh¬'ï~¶ë¸,'ÕoÉα~ÖÕÜýšj¬Of¹¹VSN®m[ †¥JXLN"³ÃΖ&Ô冯 ²¡^–%ÅÎxZ°© ò„ªS³œ¡9Á)?˜¼Cñkã>£ãÿÙhx§áä¿ ¼)ãωZ…üsè.¼Esq¡Åðâ.¯„þ-è‘ø_B¶Ñ5woìF=?O¾ñ~š.´+À÷ñËag&¡ÑB<g˜ÐÌ«SU²Ì“7¯^Ô«à}¦y|jTÃW”iÔ«W7R1”ðtéUö¸iT½xRÏÛCâq˜S«KŒÊ)aªJÏ uó:ά©GÚ*41xu:uÄ:jXjÔ¿|ù{]öžÖïô¿|K¾øii¥üñ÷Š4_ øcÇíã¯?Æð'Šu˜¼3áx£á«øF =Âψ§³‚)í<[ªêÖÚÆw¦Z+_G¥e†£RuòÌ),&78Ã*øJjQ©kS ý¡…Àâ*7OÙã18%/g ÅQxþL kÍÕ§ZU‹‹ÃÿlN…±x~µzXÉ_–N*Ï Äá!QW¡ƒÄÆ£œªO:˜:5±t¡>Ztjñÿþ7x³M‹Pð>¦\|LøŸã?ß´ÍŸ„´ßøÊÿÃÞÑ<ðãâV¡m¨]ëÞ-mÄWº'‡ô?PÑtÍ:ÃLÐõI{Û+h­­ì㸻±äÊåS”på:j2¯K#­˜ãëÕ””½ŸöÖ7A¶¡RxŒMjÒ£FœeËУVukÓT¨Ó­Ù›R†š×i‚Äpþ Fœcïbq|+•æ­*p§J0£ŽÆbj.iJ¼â½JØ«ó~ÓW1hdŸ¤?í¾)Ú|o…x¢ô†ñåþ€¾1²ÔWÇ«¢¿ßÀ¬|FÚëè+yœ3Û¶ý«ÓŽô¢ñk)y}ª¬ÎÉÔuŸ²X•ÊPÍaŒt~´¡S 8Fjtý¬±–Î>Æ–1Ô¡Ë:s¬Ñã#ȲÊ\L]ÕXºYzx\µáU‡æ•|M_«âOgõJ˜|t¤êÑÃF­jšWíãø|cñ/á׋~ÞÚx×áïƒ|â›;/øÂi>6›â‰µ hpxsPºðg‡îí´;YôèŸTÕõ]3OþÏòuY$µ{-6;íC*ž3 Žž âðY†-öX‰*cWK^8œF&*²£€£‡£ORµ:XŠò§:”há*ã©SÁbh}V¦ V¼©bðY¦`¥E)IÑË#†rÂÑiaá[3ÄU«Z«J“’À¿­µŽ—Õx?þÓ›Á¿µ?‚ì|;à|kø'ð’_oðʼnüqá.ÇZÐõë‹{»fóáv™¨i~9Ò#Ñ®uðæ©áxà»I´ruíµ7žËÏ̪{\‡ŽÂשJL–]‰œSŒ£ ð‹lXK–´Xâ°U’©‡­ƒ­†«>nxÒRõ2JÿY¸{.Åѧ]f~ν2ž•%OBœ°ØØ8ª˜j¡‰ÂÔ§‰„1Q©B¼å S•'N^‡¤|gøŸ*ø'ῇ~øOÅ_Ãâ­õ_ŠÚÖà_øoR¹¼Ñt OŽÏÂÍGX×¼U­Þé—rÇ`<'oKe¨½Ö£ŠÌê¿G›¥ý­ÄßS¡‡Éq1¥^œyiµÅ{z´ð(YS©N:ŸÖ+ÏOÙ<#TÕJÕ¨á~g)çY/VÅU”ªfÔæ°ó•ç)á°tp޾7Ûæ¥)K„²¥õ¹JµJê5jC :²öÏ…?4ïŠÞ ²ñm†Ÿ{¢\hkž×ü;©Ii6¥á¯xSZ¾ðߊ|={=„ÒÛ]Ka®i—Ð%Õ´ ÌIÌ,b æ«N’†…¬±8,~†/ Y._i‡ÄANðRš§Z“桉£Ï?«â©V ç)Rmõ¯kN¶+ ‰¤¨c0¥‡ÄSŒœàªF1œgJ£Œ\=z5)b0Õ\)ʦµ)Ε)¹R‡£V%…P@P@P@óÿˆÿäéþ ÿÙý¥¿õbþÉÔç÷¿³ÿŒ®~xçáüzŸ†WYñ7íwñrÂåï5Q¦Cá»Ú Kø®–7s.Šg\±–Üü°}µ’1r`&åsÀAá)ð *Y¾Äaêâ¹åähãñØ©,=íÍ'ON1U=ŠçSM¨¨Ê]¸œD+bøš¼£ ç'«—ÐM$áZ|#†Èª¤Ú%Œ£*ŽPsŸÕœf ê·EGñ¿öb¼øÑ⟈··ú†mt/|.øWá=cI>'Kü2ø¡âˆÖÒø—·¶ðØë>»mGI³¹µþÐY®`“P„¬º™òÂÒ–xìJ¥K_ûW*̰ôj«Ð«OÇ`±X\Lœ'*?Z£u©S­*ÿXQ”éFJ–&”ðÙ~N¤(ÃÄ8\LáeRÎ)d°Ââ0Ú¥*øÙdñqGN>Úž)J3¨é§Âïþ$ð~½¬øHøû|Õ£ðuî ê ¼)ãMzÿÄšƒùŸnÖuû_|.›Kðu»ZYùÞ·‹QŸRiwkißaQyÙVu)áñßR­(×®¡ 4'1§N¯µšÄ×§Q˫ڔ!ápñÁÕÃýiËí£†ÃyÔ¡MÕ˾·J5aBsž"¤ŒÝé*Qú¥9¢ÃÍs×s«:Õù©IaÕ8óN¹—ð÷àŽü=ñ+TøŸ¦x#à7À]fO‡ž$ðÍΗð–÷Ä-ðÇÄŸkºž›«i>2ø“ §¾‰Ã÷v:£[ÁΡ¨ÝÞÆu‹4¶Åþt¡OÍhåiÑXºy} ­žK/©‹œgKÙµ‰©K°Q©C ‡§KN­]ðÔpšÕqÄârÙcÖНŠÇC÷8ÜT1aJTfñ 4ªUŠÆÔ|F+–½¦Óu«Ôäáý–|s«jŸ5Ý;ÿ?f­_Å¿¼yðêñþkúî«mãøÊ[K3Ǿ3·o†þŽÆó×j¯fñ¦µ¨Ê|Wyÿ;e´Û¨a<&ŽYšàðtSÃã#•R¡”דY],6WˆÄWtjOìj'Ž¡_û*¼ð˜|*†UÜ¡ˆ”°´ð]41\™–O‹Ä%^®ŠÄ×Ì# uo¬PXR©*ðJ5Ôs.LN'âðØh«§^­[ßÿfïøcâoÃÁðëöuøSàŸø_⃼Oðïá=þ»“ö~"·ÔþëzZÃ^èþ–ïÀ^7ðÇŒ!Òî¥Òìµ+Mº_›5–ÞÎù­–áXC7—µ«R»Í2œÖ’öõ2ÜÛ ˜ÊëIJ´)Wæ­â*Û:Sœã7Eªµ£OÙF£©O<§†Áã°Så§^Q™å±t)(Ó¥,vW‰ÀSœ(:‰F•)׌½’«xÓ‹ŒdÚWó뇿¼)âßø«á–Ÿð¢GøÑ§è§Œìü[ãZ‡4 ØxF]{ÃzOoÄŸ ¶“a¦0Ònáð<æm œ_ĺÃ.‘Ï<%Í2(âg¯ŽÄâpøµJ?Z¡K1§JŽa a=§³KááŠÂKëª4ê×­Bª©J)•Dž++ÌñhVÄàðtp˜Œµq¡ˆŽ‰Åa”1¾ÅΊšÆWÃb°5m t+Â.~Ö”ûm?àƒiû7Gû7]k÷Úü*¹¾]ø…ííÓR¸Šë@“Eº×–ÍŒCvÓÍ%â[³K6ØË:®[³8›ÇÔu0Ie,$° ýáa\è<»›Ÿ“ëÃê¸hß³u¹$ïMÎñyN"¾O”sLM\F#Žæ²§Œ©­V¾>. Ôt¨âe^¼9êJ)¨¹Ôqæ—•Oð³öˆñ‡Š~Íð~ÓÂ?¼O}©ë·~ÖüY¨ë¿"›áç‹ü k®¦‰¨ø.ÂÓáõÂn+™|?­âXŸûZáWYA¤DºÎµ^‹Í±¸ÊSÃÇ7ʳ<°”dªÃS2–ugUHÒ•zqtgJ—6Œ©Ãߨ±ª£‡æÃª™~S ¯^Rž–U¥Šœc ΆY¥^•*”#í#N¬©ÓZ•©Õ’xŠ0¥ tèÖœ¡ç¿¿cÙ>MàÏ Xü ýŽõÁšýŒ°|rñ‚cÔ>-j^ÒnPÓÏ,¾iöÐüBM–:qñ7ü,I£Z¶¸tÇ’Oì„x|DåWŠÄ?©â0”é{e‚Š_ZÄP¥ìc^„ïEer­V4ñõ¥˜*3\%%Zì;ÆÓ§UæÊ…8Ô£­^¦•uû¬%<]eV¦¤?{õÌ6+á°ÔÔ°Ž­áÕISp¨§k]ýu BçMñ^©áO‚ßµÿ|TøÿâkO|R²{ÿøÁ_üp¾&¶‚ë]¾ð6½qáèËe¤ÝGykáÝjdÔtîb¿]BÓÏË©ýC•áåFž"trìÜSmEÒ«K4Çf8LV«¥9ÉB8ʸjøz‘¢«C9ª–š¯ß˜âc©p”è)b²ŒV\¼Ïý‡ð.; Z ¤Tib§‡xšsŒê8ÔÂ`g:oš­8Uñ‡Ã{„ü'ã[Hýš¿g¿x7ã}‡Žü+¦øÃ¿‡þ ZÍw kž O|Vø•cáK3j5¯ jÚ•£xòï¾µÓoïô‹EÓïšÞ$ÖºaŠú–7*öX—^¤èæxjô«É`pÕðøêP«^ŽMâãC…Ž VŒåVrÎ+eêœp¸HâU '4pï…Ï),2Q˪ө,V&|¿Bµ,Là• ÕüEJÔ*Ñ¥ðv+‹ž"q§V­?4²ð×ÄÚ›Æ_¼M§ë_5¿jøá]!| ãÆ¿±ñB? XÉâë-oEºK]zóIð؃N·ñ„:t¶ÒÚ\øÁa~«…«ŒÄᣋúÇà1« ‹§:q˜l»‰Ã:”bÕ_iGWB¾Vl&+9Àb¨Î‹¡‡­N|m:ó¡Ãb†É³Ì冔kTÀãsgö8Š“å¥ xœM,#¥[ ŸZÂå‘Âã=¥)cðu%êºwì»ñï~2$ZÀφø­û9jßto|3›Y:/Ã]^;ÏÝi·–’Çà?Úø³NÕï¼s®jº…ÔzG†¥²—É´ŠËRo;Q¸åÇЭˆÊx±2ÅâóJ¹F3 V»•8F®[B¾eõ–"Tp”¨Ç 8Ên¼äç]}CNu;2üm<wÂy¢¡ìèdñ2ÄÒƒ‹–!WÄàqO òSj»X8`å„©ÍMS£Og5IáéÝñ'ìÃâkÞø™âƒ¿³WÅ_EðÃBøcã?‡ßo®u_éçÂšŽ­}¡x¿ÀuO‚úæ¥ky$z¥åµö“qàûhîc»µ+hÀê¾®.½)æYö**î&žcÍ5 xŒ/Ùû,E(§ְµ©ºPŒ§S:sÁBº¥þ×R†ÇÂS«G(Ȱj(ÖÈ¡[ ¥ Êž/R=›¨›¦ðõ°õ°ò­J b!ãñ”I5N«ú«àç‚n>|>Ñ|5yáÏ…þ¾€Þ__xwàç…ŸÂ?´›½Jî[Ùl´]:Y<ËÓ ˜E6­%¾œÚŒ±Iztý?í?c·ŠÒ\¸zQ¯S°Ô£KÚT²S’rJ”°Ê®#êtªÕœêÇ õœ[¢ç%,V"MÕ•Â 51U(PzÒœ!Ï5M(Ó¥íërRUë*tà¥UQ£”iÆ´Ô¥ê¨P@P@P{ñ/áÆ›u=Ž£ãÿØ^Ú¿—qg{â­ ÖêÞ@òç·žýd…ðAÚÊ  ¿ð¶~ÿÑKøÿ…—‡?ùe@ü-Ÿ…ôRþÿáeáÏþYPÿ gá_ý¿‡ÿøYxsÿ–TÂÙøWÿE/áÿþ^ÿå•x?ˆ~'|6Úsá ò|Bð;XÛ|ý£-./Åš ZÛÝ^üAý–f³¶šà_ùq\O …óÅ0iÊv@D.TÛÈ6ò=ãþÏ¿ú)ÿð²ðçÿ,¨ÿ…³ð¯þŠ_Ãÿü,¼9ÿË*?álü+ÿ¢—ðÿÿ /òÊ€ø[? ÿè¥ü?ÿÂËßü²  6>ê0Ùiÿ|}ypâ;{K?è773ÈA"8`‚ýžWÀ?*©(øWàö¦óÿÂ<â/ˆ^9Òíîn-‹ kEðÏ…|)«Éo*5ß„&kß_jzvB_I¤éV·FM>kÛ=Cà|CÏ1™.MI`*ºœuocí÷éÒP”ª:ohÍÚ0Rµâ¥)C–j2V”jT|Êê öóÙ_ÈÞ³ø;ðNµ†ÇOøYðæÂÊÙ<»{;?xfÖÖÞ0IÃo˜±Ä™$íU“_€O5Í*IΦeŠœå¼¥ˆªäújÜÛgª¡¢„R],‹?ðª¾ÿÑ7ðþþÿåuOö–cÿAøüWÿ’H*ûªø_ÿDßÀ_øGø{ÿ•Ôif?ôˆÿÁõù ä‡ò¯¹ü*¯…ÿôMüÿ„‡¿ù]Gö–cÿAøüWÿ’H*ûªø_ÿDßÀ_øGø{ÿ•Ôif?ôˆÿÁõù ä‡ò¯¹·Â„Ísã|/øv×pAqmÓx+ÃFæk©-¥º·Šs¦oŽ ¥²³yX+µ¤%1&Ö³LÉEÁf8•Óqöõmx¦¢Úçµâ¥$ŸE'mØrCù#§’&ÿ…Uð¿þ‰¿€¿ðð÷ÿ+©if?ôˆÿÁõù ä‡ò¯¹ü*¯…ÿôMüÿ„‡¿ù]Gö–cÿAøüWÿ’H*ûªø_ÿDßÀ_øGø{ÿ•Ôif?ôˆÿÁõù ä‡ò¯¹ü*¯…ÿôMüÿ„‡¿ù]Gö–cÿAøüWÿ’H*û‘^ïàÿÂKëi¬¯¾ü:¼³ sÚ]ø#Ã7ÓFH%&‚m1’DÈ+)UC4ÌéINžcЧ8í(â*ůF¦šù$6ä»YïÃO|Uñ Ì‹Àrx Eøàý æš{Ü {Sð߈¼7¡ äoìÿ2Å ]éÚLXƒN’MJ E†É­mm?}ðï;ÆçExãêºõð•%V_é¸FPö’ûS½7¬’‹“”ܤü¬](Ò¨¹*’½¼úÛÈúZ¿@9B€ ( € ( € ( € ( € ( €>kÕ?äèâÿ²ßú±+òoä]”ÿØEOý4wà>:ž‹ó=–¿ =#óÂà ¤ñ¦¿ðÆÓö;²ðN‹ñ3âGt8¼yÆ«o=¯hFRÔ[]©N–%àªT1ÄJ£ZrÒz­IF* ¹Üœe7ìñÇ‚¾ iÛþñ‡…¼o ‹©¬¶ü!â 'ĺ@½¶XÚâÏûKE»¹·ûTK4Eâó7 • ¸g‡€Çeõ!K‚¯©R ¤!ˆ£RŒ¥OšPSŒjF.Pç„ओ4%Þ-%J½ άhÖ…WBjE ÆNGUPš‹|“têS¨£+>J¹eù6øëðF=kWðÛücøVž"ðýɲ״ø…áÖ´KÅÕm4i«égW:mÈ×/ìtï*â(Ûíw°[ãΙ·¥“fõèañT2¬el6-Â4*ÓÃV*Òœ'R •HÁ£œ)Ôœr„'%uÖ•Ú¹GÖTé:òU?vãEQúË­%+rÒXߺŽÐT{~OxÕñ·Å…Ÿ äÓ¢øñ/áÿÃùu„¹“I‹ÆÞ2ðç…$Õ#±hñôä×u+Sz–ísl%hCˆÍÄAñæ.qÁåøüÂUa—àqéPPu#‡£R³¦ªsªnjœdà¦éÍAÊÜÜ“å¿+³—îá“÷)ÉÊ1”´‹”\£웊œ’Ö*QnÜÊþeñCö˜øwð³Ç_ü­ëÞ†/‹ú†­ëz§Ž4=×ÃÚ—†uMkIñ#Ew¼jšn¯¬ÙXè¶’ í!’ãSO.yeT·ŸÓÊ8w›O;¡GˆŽ+%Â:΄0Õ*Õ«‹úþ ½Â<³§ˆ•ê¿~é~>¾–Î ê3ðå—Œ/&ÔPI§Ãiá«I5‰n‘•¡Xí˜Ê(ópùfc‹ÃÖÅá2üN' ‡öžÖµjR¤¨ÃÚUö•!{*~ýNf¹!ïJËSZõ)á#JXª‘ÃB»‚¤êÉSUJßW¦©¹´¦êWýÄoÍ[÷q¼ýÓÐkˆ³Æ´¿ù:9ì/þ¬JýÏÂoùfßöKÿMn;ã§èÿ3éJýdà ( € ( € ( € ( € ( € ù¯Tÿ“£‹þÈêįɼYÿ‘vSÿa?ôÑ߀øêz/ÌöZü0ôÏÙoãÇÀïx7â'‡+ø‰áëVð]|YñLö³O¥êúŽÌQM$‘³D£RA¾×8Ês\n]Áõð9f/F<5“Åφ­Z*Q Û5(Is$Óåø¬Öš£š­©gü_í?vªgX™C›Ý抡…‡4onh©ÂQººæŒ£{Å¥óÏÅ o[øŸðköèøùð—øâ¹ð³Âº³>—â]:ÓÅ¿~E£h?|U#é ±á9­/|M¦Ïq¦Ä—-a ß,?¼Œë`°´òzžä\AB¼s\Ç5ÄáêËýÕf^Î95*Ôã­ V¯ƒÁã)¾d±têTŒ=¤£¸Ô–'8ÍWRu±¹G¬²…J<’çÌV#2ÌqÀι©Z†ì°•/<=L$£9S³~;á[Çø“ûöÓÙ¬ ýwÙó_Ù.Ë~£í½Ÿï>£õ¾o­r{¾Ûê_Xÿeöç]ðªÓâ$>+ý¢/>ø—öBÄ—_²¿‹£ÿ„Cö$‹â4þºñM½ÌÃá÷ˆ5[ìI|§øÖÖvñ ¥œÚŦ±,z‹ÉöˆTÜ[Æ{<ú³y¥"©€†•Jusùa”°ô%¬ÖXº‘Çʆ/Â;ý…ý‰ÿ ›ûsþ­þ¯øX?Ùÿñ=Çögü$?lÿ„ƒýífû?￳ëÖÀÿ®ñ?Öÿ°þ³‹æ·´þÊþÏö3ú§°¿î9ù¾§ìù?Û9½§¶ÿ˜ÓÃ|ŸêGÿlóÿjcâ¾³õ¾OííM}¿ñ=ëýkÛ{oaþÏõN«~çêÇmûCê_ü[ûD~Ð&×?d߃‰àÿx?G×> þÐ^›ã7Æ]J[Áâ½/Qø1ð«ÇÚÔ~ƒÃ­g«Üé²Zh¶7w·wIs=¥ÝÕõšÁó?O‡á+ O8Ì/0Ì'C’Ô† ¥ е;íz·³°‡Åé’XéÓȱÛÞÂ4š%+ô9ëͨq_árUŠÃf¸ŽËëá(a'WëÌ)ÔáGN¥I©ÕÅÃSVêÊJñŒš«5/Ùï"Îc˜Ö†+&Ãqƒöõ%B8jÙxœncWSê²Q§„Âbðq¥^½XQT?h:qkçý Êúóá‹m~ ^ÿÁ2´ÿÝKã¯øX×ÿn>'§íQcâÁ©jKâ›­@“x‰<[¥Ä–qxj`‘Ö!§C(—dµêaéÕɧ’TâÚ8*Xl¹å•2O«¬¾”iË ;É8óFvx‡RJÒöÉàÔéÛý¯™¬t0õ1’ÆâUhc¥ËBQ~í8á¥9”0 ì– xz”Ü(û9óêÍ@ÿˆGÁ…ÅšÏü$^%_‡ž]s_6Úí“ëzŠè6"çV–ÓÅN—¬[ÏvàÏ$z¦›av¯+‹‹heÝþOÅŸV\OŸýO õ 7×ñ\˜e*Ž÷Ó½Ë V¾œ¯{Õir(òNQ³|9$,¯J5UzT£(Qšu%͇„å7¿UF¥KPT×µ—3­okí*)ª’ÎÒÿäèåÿ²¿ú±+õ? ¿ä]›ØE/ý4V;ã§èÿ3éJýdà ( € ( € ( € ( € ( € ù³\Óö¡ÑÝ®·ðÄé„ð._Ã|8úÊ©þõºx¯C$u"ó#îœ~SâÅ9¼«+ª—¹O(·ÙÎŒœ~õ }ÞgvÚs_ÝüŸüÙ+ð“Ó ð¯ü1áÝnþÖöæ ÛËkÝWHÒíî®­ç¼¶¶žXå•–Imã‘tR;jæÙ¥|2úÙ–*¶›¦ã†ž"´ðñtc*tœhÊnœ](Np¦ÔS„g(ÆÊM7R«Yâ*ÅTÄ9Ê£«4¥SÚO™N|îòç—4¹¥{ËšWnìØ»ø{àý#Ä^¿ð?„/tßÜj¾-Ðîü5¢Üé(Õ.ÚÙ®µ/i³Y5¾·3YÙ™./#šG6–cå.ÞeŠÄÅàÚÄU‹Ë’XVªM<*U'Y,>¿¹JµJ•R§Ëj•'?ŠRnâÜ*Ö¯ËZ¼T*ÔZN¤†P©5ïN+ áÔdÚT"©%ìÒ‰—¤ü2ðŸ‚|%¯øWá.ƒá„+¬A©ÏksàOxgH´Ó|?ñ_Š4$´Dñ'‰|áÍw_Ñ’ÂòMFÅ4­cTÓg»Ó’ßP–[¨…¼Ñˆæ•åL;?„̳¾5ià1øœ +Kž¤põêь䢠¥5NQR’„cÊï•(ÞÉ#¶²XŠ ]*øhûF¨Ô\ô“«B«Tåx/ipM=øÂ WQVmÿÂO…:§‡­¼%©ü2ø{¨øVË[›Ä¶~¿ð_†îü=iâ;‹‹Ë»~ÛE¸Ó^Î n[½GP™ï’¤¾¸v´ÎYÐÌó,.#‹Ãfœ>/ Fj©×«N­=(ÂèR©)Ó£N4鯡(§¥¤æ•Hã¡QsÃ3æúäeªÅóÊ—ÖSº¯Í*tå/kÍyB ÝÆ6‡Vø7ð‡_ñ]§Žõß…_ õ¯XO¦ÝXxËVð7†5Ù]h­è÷6ž"¼Òä¿¶žÅà…­¤ŽáZ Šx\×4ÀÑ­†ÁfX¬¿µUiPÄV¥N¢¯J²© sŒgí©·N¯2~Ò ÂwŽ„U§N½8Q­Ö¥JÊœTá \Ò—³ŒdšŒ9§9r$£Í);^Nþ\ž5¢ƒ7íE©˜¾q¦|ÒVü¯"Õµ¯ˆZ»iK/¡¹]X(ãÂ\ãŒþëá<%¯4­ b¡ú^4“’ù)Gï<ÌwÇMvëÿúR¿W8B€ ( € ( € ( € ( € ( €8?ü>Ò¼}c§Gq}ªèï‡ï›Vð§‹|?=½·ˆ<1«µ¤ö/y§µå­Õå¼ÖWW×:v£i{cw ÍÍ´ .Î<~_ƒÌðµpXꯆ¬­(JëmSM5(Ê-^2‹R‹I¦š¹P”©ÉJ•ÇcËáTük_•?h»†Eá„þ yŠŽÌðÏ o)ÜÑÅ“’¨£ >1øiÂ×v£ˆŠè–"V^Z¦ôómù\®º­<„ÿ…Uñ·þŽ)ÿðÒø?ÿ“iÄ3áùõˆÿ‰}r¿u÷ü*¯¿ôqOÿ†—Áÿü›GüC>ÿŸXü(—ù×+÷_pªøÛÿGÿøi|ÿÉ´Ä3áùõˆÿ‰}r¿u÷ü*¯¿ôqOÿ†—Áÿü›GüC>ÿŸXü(—ù×+÷_pªøÛÿGÿøi|ÿÉ´Ä3áùõˆÿ‰}r¿u÷ü*¯¿ôqOÿ†—Áÿü›GüC>ÿŸXü(—ù×+÷_pªøÛÿGÿøi|ÿÉ´Ä3áùõˆÿ‰}r¿u÷ü*¯¿ôqOÿ†—Áÿü›GüC>ÿŸXü(—ù×+÷_pªøÛÿGÿøi|ÿÉ´Ä3áùõˆÿ‰}r¿u÷ ÿ §ãYá¿h¹ÕO bøOà´”)à˜š[‰dî—ŽEV¼4ád×îqÝ>±/»DŸÜÃë•×T­äz€~ižµÔš=KVñ'ˆüCw£â¯xŠ[Iµÿêöéim%ÐÓ¬ììtë [TXm4Í2ÎÊÆÕ ù6ë$óI7ØåÙn *ÂÓÁ`(G †£~X+½^­ÊRnR“{ÊM·Õœóœ§');·ý|Žþ»‰ ( € ( € ( €?ÿÙerror_chain_prim.png000066400000000000000000000167551160020716200356450ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.errorhandling‰PNG  IHDRAìe™ƒâ pHYsÄÄ•+ŒIDATxÚì}PçÇ—)I5™æ¢ ¾Xç¸82F޹©ªz4 wßépþmöo …³K·ëmÓÛÙéðˆi¤AױՃà *T*ÕK-/͸f²mdëÖÜ-ÛˆÍ0f€Ã@؈D¢JMåÅÓ«š«²jljÀ¥ŠR‰D‡à!íÉòÊòlsØr²¿i&׃h‘Éd«$«&m“Åtq–ìò—Î/?u|Júp,vîØ9rb${6›Ìõºú ¯$1PUUÕ¶¯íëÙ¯ïß û{îø¹?_û3Ë‘HD4>üü{Å“­%:c¨TÎY*2døÈ6bS(™<š‡A<Ôî¨}¶öÙŒle’®!±œ°¼¸ãÅÌÿFà0ˆ ¹\žKåÞ°ßX#_³ŒwsÆ5óáø‡³ƒeÈ.Ý.³ÉÜÖÛ–´-Löä—ö?Ø©¢¨j“ûGï¼lb‡Ôl=%Ê!ÏÒ¥ýçŽÖIB­Ø÷àé ×ÖÔ âë€Ã fjjjÚþµ­åHË¢;“¶‘±ÎáÍçÜœš“ï¼ô \mh¢=Þ–—8L†â+Æù‘zÏúË‘H¤Ñh.œ¾ðTÍSñ—Ât–çt½Ç‹¨Té¶ |y/]g»‡È’œÀ„â&kõòøÙÆâ iˆãà*su­l­T*…Ã`ÙÒ khhiX’Ñƴ,„~éüàC=ØÆûT*-¥†œNòGˆãÀr²sÇN¡|păB¡øvîÛLÙ’®~0q…͸f¦Æ§4ƒ8 –9µ;jß=ñnF8ìüüc~TØÅÓ+5•¤¿‡Á2g{ÕöÃ¥‡wuíJæÈVȨ»a³Šºô‰‹¢ý­kçUº9A½W³É|Î|N@_q"‘HJ¥¶[YUYŠ·\ÑVÝ©,ï)ðK+‡(½©"8þá½â{e2YÁ.Ý®¶Ž¶85.MQ¥¦F¶‘nš°R%ÊÏâÒþsu‰¹ãkÄ4BvJXßñCÓ´«Öõ¥óËUÒU1­Xl˜˜71Fq“{bñ—>ÝM‘VŒ¯g¿cÆN÷ž†Ã ‹¨×Õ“dcWã2Ø—ÑÓ£F@£Yp$€ÚšÚ‡K~¡ý…Tl%ÒþýàïWm8 –„D"Y/_•¹JkhAïÈ û\*W.—Ãauìܱóío ÝaÒ#Üh‰Á“IÐÓÖz& ým×oá0ÈR„ž)“Ó)Áa ¢HÈä:«.ïd‚ßå?¨”P&{rt”çáD[OÕÔ¶¥ŸÉé”à0HÑ&dÒûŸòå`ößn•$¸»¸¬Ma–ÈðtJp¤ˆx2ÑÏP užŸlJëd·žN ƒWB&Éê"ŠšúÜEó'èÕÌfÛÆC¾¼<| fjáKŠúäìneçùCY2´ÈãÊ™ŸN ƒWB&×çSU´Ú£–k`w¹–:0=ÁÞ/í<»;¿|7åј•ócÿMѬ绥ÑÜV]PqÔ½:Xì@2?©#Ö„L®_v2Tu›§!=yF;Fb¯×LiÅQ«³Dyf²®©˜}<¸tó&ŸfìÒ «sæ§S‚à uDNÈdÔ•N _ížçø ‚fØé|ßÖTLoجêìÌßME{cAé”à0H)2ùÇ¥Ù¦rç˜Þ4ßÄeŸã§Æ|úáfçTX&V·–èòK:ƒÌ_‚H§‡AJ‰6!“·©¬Û-ó \±Q·tóâ‘Öÿ¸"›ç%Êþp$‘N ƒ”CB&ºÉ¤Òiyvg#;¯ÝإˮŠH·|7(5vúg±üØ?)OŒ³j %©&ú„LÅSµQ×Ùpv{Õ§ø™þÒr¿ÒÞ¼jÜ´Ûð~p¾çLZÝÕ5ìß÷KUÔÐð®:²ºël{)¤Ãó'ßò!”tJp¤šX2±Þi;9°´¨%uG' zJ|^^²•Š£ÓÔîü’ïû¬ØÅÞ~²É™£óÌéSm5U3º…›ø‘žÒ–— \P:%8 Ò@¨„Lì¸TÅ‚%YoëØ¡fØáúÏMî‰ùæ'♟”'ä¼?J§‡AHIB¦%! tJp¤Ä$dJÂJ§‡AzH@B¦¤!¬tJp¤‡ÌJÈÄCpé”à0H”‰‡àÒ)Áa6Ò–),‚K§‡AÚH_B¦Eb:%8 ÒÉ’2%!¦S‚à Ä)4i&s2 4i&s2 4iÆ“éÍ–7óV¦3 Ä­on 4éçµö×FFF–XÈíÛ·ss—pº~—jlZ–‡ƒ¤#çXb!jµÚl6/¿Þ,Y ã Ãôõõ577ãhÀa <:::ÈÿÝÝÝõõõÅp/Ûívò‡ËåB(†Ã@¨AØB1B Šá0pF(†Ã@ØA¡¡áöövòwoooKKËÜÜB1‚ Âb±xppP£Ñ‡‰·r¹¼²²¡aa™Lf6›ùì+Šk×®Šá0Èô L"0˜üô‘D"±Z­¤QP ‡Aæ2;;KD]ìS~IßxéÏQÀa’EMMMÄeH' ‡p‡€Ã8 €Ã8 ÀaÀaà0à0‡p‡p8 €Ã8 ÀaÀaà0@ÀÛZs”ÆÐé­nàj°›£–X®­µ•2$¼fÔaÚàv<:ÔùÃÛ¦-uÒäUƒÝÜRÈoŽÕ€oÀa@–8Ìkn«úýaš¼Û-ë/Òj\«{Ëy¶‘l¥”ÞE¹%þ5}+µ¥=/ç×â7ßù­|ïûlKAË×Ê£¿*¡«ö·¯µTÿ´›Uƒ}‘¯¦üž0ZÒôv»¹¶óeTv÷s¯¹µòs´*ÞˆM¡ý XK©–qÅ{]wÓÞ:x߯³¸ ø¿a«'`ìvûøø¸ËåÊΓõàÁƒÙ¶Ëb±XÁ‘p‡mÇ´ Ñ+QÈêÈQ³Õyƒ¥jÛ&¾.ªþ^Ï’ÒMÛTC¼Ô:œä¯ÛP…XÌvž³Þˆ¼øêª'DŽÿ]KK³TzŸBñÀÊ•we¡Àb1ÙëÉlÛëO?½uæŒÉnÿßööW÷î}%q;?™¢¨¢ž:RÑé¼Í@s–|Ä)-("ÿ½\„¢‹Ñwp“º(öê ŽÊÊ-bñß§§_ãÎã,åàÁ§²vßçæþÑÑqA­~Ül~W$%Äaé|2¤ód]òwÆßóeûÂÓýݤŜIÕK}}¿‘HnõönGÇ/k‰îèê*?tèbGÇ/ººŒ‰p˜ kªm©ï`:´Ìüø–s ;£ª—”๎ŽWÿò—_à<ÍÍôúõîE©Tºt‡Iã–¾ì¬K±%l€Õ·Ññ¶(sª—ìv»Tú/ÙÜ„üh,—ß?>>ž‡)º±_ÅRæ:§É¿‚Эånê ¨©Oœíݪïï4U/ /L¡øN_à¡°ð^‡Ã‘ˆ¶47ÖË^ÍÉÏñõG“qfˆ­ööç{;ºì*ë±¥×Uz‹ž2jós†ûç/6¥¸zI`vvöž{îĹ Â¯u¡‚ñüí˜AïÆþ2Úµ‚ë«BpuBW€,t‡Ab°ý!G9ºè§ú=nCaÕÖyE’êÃR——°}dûE&=3 Þ¯¥žŸ¶lLþÇ·võ‡ˆ[žñ/Qfuo¥3Ðá‘‘‘¹¹¹ªª*X Zs^ÿUæ|Ñ?ýR˜áØÜÔÛÛÑÑ!‘H, ¾±øàÑòÝ=z«Û½5A1PhͬVN`^{ÊÖªS¯k®lZü䦨^»Ý.“ÉN: Âç‰Áªç§y"Ú`²RDc—3ôS©rØo/Å=‡a6›ÉÿøÆ’Ûgþ-çGo~ƒ-¨»Ø ÑÁ¿¯dòQc`×oà×ùÚëÑwóbm|ªæ{•\%‹öLË.p[\çk‹†«|Õ ¹­P‡E¦áæܦ8.¥ä¦Ì^$“8 Ñ’ÚµêG•ÆÃ­[8im`ï…Ñïñݠʢ0Ý-Ê{¾DQÆÃ9FÞÙ~ ±(ãa5UÆk%êçvŠÜÍ‹×1õI©Œv¿šâ©5u¡ÁÈ9©*f£ [ù(ª·ø¶–ÌœÌÏq…ø{ˆBB~YHÅTýážÖÉM™½„®®.•JË–ˆQ© 5Õ™?ÚØ½ñ°±ûJ#½â9iæ›g3 ìÙæ#\ð=oÛJÓÁù?U¶qñ*ü+ºG”ïÌVñ[‰þèÄÍ×gêb²‚5’2Ý\™\Œã&Eù d®Sýo¸ý‘9\å©ÈÕ[|[¶cœÀÁ ÿqãÅêp‡(d÷Xçùý ?°Ÿx‡Ngeee½öq@˜Jóbì®Ð`-3*I4àÜîõ·ën²·˜óÎ iÝKÞ{fœŽa&¸‰H>µ:Èi4e3Òáh” –LI7Z¬®€°ÃNWqÃÛ5ºHO§n:©BßΖµù+a¨ÞbÛ Ù‰}£j¿ÖsÜæÅpD>D¡Žx½07 眔ôxI>~üxÐG‹q8&¸™+‚|j\ÚÛ¢&'îsó BçÍ)r¾ÉV„úéu±ÁD»?'ÄÓœ_°÷¡‡_à2ÅžŸ[Ï6©Ä÷e6ö¯3²½MÒF]¼³#žF²—² 3K%‘F»w[#Wo±myé6Y`Ÿ oÓ¶uóï^~o?DA_Ç•nc´‡()mi¢ñàà`{{{ÉÛ·o¿víZÐS 9̰3!°=7›­.!£GK;%Ø€8ðCº£S™rÑ(Óªç¼<BøÔi-4yvvV­VÎE| ¼£eÖõ[‹‡•'»hÚÓ~“® ­F#¿ÓÂÝSvç•aRòù taPlçÅ™¼:‹Éw·;7<ËL^vnLÅÃd‘÷.Þêyé°ÃYÇ·}æò0‰êeóÙpuˆtˆZï²èŽLÒ¯-™ìp8H4&mh–Lƒ¯4–¡~O]X ?©Ô¾3°É3ÜÅ5ýCÖþa¶Í&cg'Óîo-à5Ô½ƒ.Üà­4ü4;Ušñ°Zưñ÷ô<‹\qáj¤,Ά­ü´¤;þê²ÌOæ·®àiqñ\_D/¨Ã¢‡(D» ÚKÑ=A&:thïÞ½p->—¦|W5=c°eVî”òŒQûnôÉ«ë}~8ÿd` ëúÙ%C}äé~{šâyá ¹O^ŸS¥/SG=ƒ7mú“ 9ÑsN®ùDªžè[yR‡%TÏ{€½R8ÖX²¡Qp3ê×ÜĬQ]{Ké½–|“†ÁøVÒZÑ~ñ(ÿuÀŒýù—n´¸W„¾ÇƒýHî†û𠕬ßci¼©6úOtÓ´ŒEÊï [ù¥U¯Ðà~Cáޘȇ(nÒð̃ÇdÒ7†o1Í%™…ͰàµÂÜÄïƱ@PÉ…÷ÆøÚ‡‘6·ð}þ;ѯMó5ü¶"–ôQ¸C”Ñmé…¤çvKäUËŽ¬z~yÕ©E$}õÕ·8 6‡yó°/š­,0IZôYÑ‚“òcd4…ÌmÓ*!óªe<2™ìÄ \‡^¾úêÖˆ#8mŒó—­ÌèSÈÆÎé˜÷)ʬhF¥RïIx”Ç,úÂ}Õ Ÿ-Ô*ÁyÕMÓµµÕ8w7lÙ>¤Ã;˜ml~BIç@7½|g?m°ê‰'´gÉh³¢é­Þ<³Ìj=yÌb*Ü›<-BÒ¶èÒ²e>b±¸ªê™¾¾÷êëÜå0Ìu‰ä¹\Öá…ÙÆ¼ï_f¨¢6ÞûìtíF¿QfEÓo™ÿ á>á&u§b,œŠ%i[Ø´l‚àÈ‘·×¯/‰î¨©Qà<Îf÷íµX¬Ñô‡UQÝ¥%³ÖMÅYøòÊŠqXkll¢¥¥±§çW4]€)ã³o¾ùÖf›‹W%I43Qµ<=‘0ÆŸ’€’9·ÅWø2ÊŠe‹zpð»Ýn³Ù²öÞ˜Û·oçæfãe”{î9òj˜4â¹ àTÀS”¿[9ÌŸ5Pµ-F…ø%³žzsÇ^ø2ÊŠ=rެ GjµÚl6㉷ˆq8(Û7ú[ÄŽäÖµéµÊüÖßÐ17ÉZ¬1þ’½YH-\ÒØ ?+Zˆ_(ñŒŒŒ0 Ó×××ÜÜŒ£¡--­³LSê|¶1ÿYÚà¶R9¾.¨Êwõ)&ôýÛ†}%\é½ð¸²¢æU×/:::ÈÿÝÝÝõõõÅûËæHK@’´‚ÅŠŽ«ðØWA5aÏôl.— ¡8*‡ÈÀ ì¡¡aÅit8¨‰ @ÌA¡q;#Ãa Ô ì™¿©···¥¥enn¡ÁaîµAFC&ÞÊåòÊÊJ„b8 „„e2™Ùlæ'ÙS(×®]##ÃaéAx±4·‰Äjµ’F5B1™Ëìì,u±OIø%}câ9JMMMÄeH' ‡p‡€Ã8 €Ã8 ÀaÀaà0à0‡Hv»ÝŸ®Õf³‰D¢0Y<á0if||üìˆyü¿lŽÿùØuó¯äyÁjñ]ß%ˆîÌíxI;÷oÇÙ4Ö”øîïÉ‹’—<òÄ“[T* m8N†a.üi„¹d•ÿÛªŠµ÷µ?zŸìé5’º+ÌZ³¿eÿü¦ý³ÉžWFÕêªÇüÄS•Dfþ$˜p€äâp8º_Ívù¢ê¡ûw®áÊø¶/œ>òS¸ ×ÚÔu¿i´¥—6€ÃÀ(ƒãxãÙóê„õ Uç´1³Gæ“­çQnÃ%cG/}kînµ®‚P(¬ú¾¾üˆÎwÛÖ”XªsÞ|LÚÞƒ§-E¿XR6~Ú¸c'¿FUB¢2*ºp~ÀçÚØ9~Ûˆ½Ç²Ûõ-4˜K~5Ç®Y{öB Ã/8 Œf@ÎÙýE掇ìÉ#fN Ÿñ(}‘°LÞ—[,ízÓ)jõÕòãÜÝ ¸@ HMßBÿ•——×­WïªÅ¦ø(|'F¾=ùDëæÖÎ>u¯w-­Äûaá«6hŽ©ø1ƒ¸“]Û¡?FƒÁVSm¼ Ç¤âÇ?Â&{Ý{ü+/=-Üý¨×xëŽ=gînn¹%›éO¬ˆÌÞ´”ëk€Áa€àv233éÏf³™$ɾHÛÜLQÔÓ2ã‚lœó`Ù 8 ðÌýÁ,8 à0à0à0CòàV!ðFeh}tIMEØ65z¾ßòIEND®B`‚message_commands.jpg000066400000000000000000002534431160020716200356210ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.errorhandlingÿØÿàJFIF``ÿþLEAD Technologies Inc. V1.01ÿÛ„ÿÄ¢  }!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÀš¢ÿÚ ?ýü € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € òüzøðûYx÷ã?Âx†+x.äÐ|_ñÁþÖcµºRö·/¥ë:ŵÊ[ÌŠLr‚¸© VtëQ«*ÔéU…IᦩՌeJ•GNU:‰6á7J­*Š2´:¹gîTêS9Nœ¡±s¦å”à§*nPm%(©ÂprWJp”ox´½N โ›i¢žÚx£žÞx$I`š PIÐË+$O++© ‚85½Ju(Ô*°•*´¤á8N.2„¢ÜeE¤ã(´Ó‹I¦šjæ4êS«NiN5)TŠ”'¥FI8Ê2WRŒ“M4Úi¦´%¨,(µÕ奌K5íÕ½œ-=­ªËuXE9;;&iN•Z®Q¥NU!:’P‹“:P•J“j)ÚéÆU''ÔSfÜrG4qË ‰,R¢É±²¼rFê$ÔèÊA E\£*r”' Á¸Ê2M8´ìÓNÍ4Õšz¦c ¤!R”ã:sŠ”%œe¯FJéŦšiÙ­Pú’‚€ ( € ( € ( € ( € ( € ( € ( € (–ñ‡|/àµïjÑi:wÚ`±·ýÅÝõþ£©]zN‹¤i¶÷úæ³rQÄ~Ÿmsu1FDåN9ï|C¾ñµíä_ð¬þ%xGG·µ[‹/øßLðæe«ÈÒ¬bÎÏBÿ„¦YÝ›Î?ÚšEe2yÃÊ •@ߌ<]á¿xWÄ>6ñ†«…áo h÷úö¿«Ü¤òçéZe»Ý^\˜-b–{—Xcm[Å,Ò¹XâäuFÈ£„¥íkÏÙÓç§M;I·:µ!F”bœœ§Rp„RM¹Iaðõqu©áèEJ¤ïniBœRIÊSJ’:táçR¥IF8FSœ£¶¾¶ÿ‚‘üû&—¬ü5ý¡|§ø«VðΛðçRñ§Ãü3¥|S¶ñ>±c¥[ku}KÄ)e®i6°jš^©r²ÜZÝÿg_%͵¥Ç•:AÛ†Ãׯ‹Ë2Ú´þ£›fšXYåø™B̪EóUÅÒ„¦½…Ê8Jõ0ÒÄû,MJ0i­:’ãÅ×¥„ÂfY‚“Åeù]*õ'‰¡JIP“^”¤ ã^¬)׫JãE8a«©ÊXªröÏ?µgþ øŠÃÁø3âÏÆˆwzjk×>xçâ‹´ É,¶±x§ÄVqÞÙ[hú,—ñÇiOv.%–æ3»Ä$–.*uýµ|M4jÕ†SXšñ¦ÞVº”ðøj•´‚ÄÖ¥ •£B<Õ!B ­eJ°Î·Téª4ðó«V)âÜþ¯FSJµhRÒµjtþ'F”ÜiÊ£´]I8Sçt«û/ø¹ûih÷ÿ²¯Æ‰ßôŸŠwÄ/i×þÕü'}ðù­~"üñ¦¡¢Íy§jß|!âðiš˜åÞ¦¿Ú– SympöÓÇ.vêQÁeU0•ã[ œã¡ƒXÌ5E:eB«þÑÃb+E©á14Ý*™g+Q­Ãƒ'b(b^Ù[¥W¡‰¤éâ²ì± U%Zt몴ðŠtÓ”jѨãõ䜬ð4+Ô«rt_ÌŸ>)ü[øÍû3~ÉVÿu¯Ÿøs{«ëw:ïßø²þ/…ZÝÊkÞ~•®{ÁºÖ»¥Ý½äóâì!œÄ²"‘ígÔêÒâªõ²êj•8åÅÅâ),Jÿh©ÝDÔêÒÂ8æsÃÊP©õ9ºƒ¥þõïÆJX5²ÄJœ¦¹hÔ•YrsðŸ?koø'ö´ýŸ<á¯ükñ—Ã[Â^+ñ©gðÓÁ^$Ò>%M¯hšl^×|1©Á¨E7‰4 ÛêWWºÀKˆ­lÅõ•ÛEs,Vïù%:˜œ÷Š2¬m ˜J˜,>/¤ñQt©`qUs LNeˆòëéÊ9rÆN2•<]n8'ZU|üßNŽKÃY¾¼q1u±˜ê‘Ãþò¾c„§–bÞ/ÂSi:˜ïkãþ«MÏ :§RIBöÿ‰ÿ¶¾xßXøyáÏ…ÿ~:xŸÂ©hº×šî™«é")nF±c¨ZÜY›kD»7S$bÁ®ÒæÝçëÌý–Quq8šRÂ×ö†"ŒJ8ˆâªÆ†TZŠœjÓNPhV½ ´éÖ„éÆ0TñÜM\ pÕ0Øü5YPÄa±”jakS§µa‰”§ìhª4¤ªV©*¾Ê”§:‘Œ$×çÏÇÏÛ¯GøƒðãÖ>Ñh_‚ú¿ˆþ'üºðŠüiá oᦕñcÂ7^>ÐW^“áï‰ôÝZU×ô™¼=ymusg<–’\iÚªH-å‰nE½à0ØŠœEÁ”10ú¥í¬"xcᇈþ~Ñ?2j:V¥m¤Ú®u¤ÜÞÙêO¡[éOtßh)zoD{aÞ[ŒÀe¹fœ2š¸L¶• à*ÔX|MðÔd±¸ˆbœã,RuR’Ä{ií±Tpx)b!JGY‚Åáó,Û4«R¦e‚Ææëa±TãíiÒÂÏ*Yn® «ÀÔŽœ©Ç ìÜg‡ÂO[ÙS­/¢d°Ôa/‚zm÷Âïè>7ø?â/Ú;Á·š6•®Xêwú_Ão‚¿¼A§Ø_è~×í¼e4º¹µÔõ4Ô¬µ«Ù® íYš[šS4´ëc*æ¼Ùµ*µñUñ8œ“‰åöXµSØã«å~Ú•DÔc‚• xDZiÑQ/«Æ:T¹+ÔËÖ_ÅÜO‚p¥‡†U‡Í(Ó¥QTÂOF8,6'¦›ŠÃãh?o>ÐÃÑšR¤ÜeSÚ}#ñ+âÿŠl¾3ü)øð¾ß×þ*ñ¼ñßÄËïXꚇ‚¾èŽÖWñÁ¥jÚsGâwÄÚéšCM<Ð#[_Mqm,p¨nL½¬^c§Q8å™>Ûc*EJ2–//g–àpõ\eCÛÔä­ŠÄÓêÒÀÒöЧ/i .£VÜØüÓ°¹}'+G–Œ}¶?Z*.U0Ø:^γŒè:ø¼f¯N²_*·íAû]üBºø¯ãï€_¾x£áGÁ¿ø›ÁzÏÃ{[ñÍ×í âæðð‡ÄØVžGѼ?ªkÑÜ>‘a©Z\] ¨ßg¾2ÃÇ.%•å™îaBx¬»:P«BŽ\œ±XJ§ X©WJ•\Nžž.…M¬ ZxzNU\1U·­Fœó\vE„«6;.kR¶5ž®%ÂRS¤”âვDð”ë×:s­F­ZµpðUiá¹?Ú[Ä´oÅŸÿ²G†>i? ´O†çý¢ôO |h°ñþ•¯è^'ðöq¥ß[üOÓ´;o7Mµ±‹ÅÖv¶@] ^ÚôÞ¼PÁoC.¡ 7ç1«Ž§^ àkBsÂ8Ô…|«:¯G)«ˆ¥wj˜Þz8©a«K °÷u§ZsTãÅŠ­N¿ eëa+ájg¹•U§6¹©ã2uS4…;¤ ðP•­WÏS^xYaéS§JxƒSÇ¿·OŽ£ͳêšÎè5&ºˆØ1[;†n gŠÂjÑtž_Œu'—á£QTÇTÂÃJx¬KýÞõ¹s¬6SUý:x¼G°Ž*iuU§õIG.ÄÂrÍ0ð¤ñµi®Lò§ÔÂÑçN­yCž*ua.J5iâ0µ"êSIõ~+ý»õˆÿc›Ú#Â>ÑÇ—_4¿† àÕ¼“Ǻ ÇŠbñ°ð潆µ/ êšbø¾ÖçHµ¾¾Ò®,¯’ÚâÔy² c'¡Z4#œpNõ0_ŠÃFåÓÇRÃÔ¡Œ©^«:4©b¨b0u0ж!R¡)rU:J¬iÇ–—µú—{ZØYãxZŽ&>ÚiÃ.­^Âà ‰ö³¥*ÐÁT§Œ¡‰­ U§iBjr,D©xïö¢ý°~øßáíÇþü0Ö¼ñ£ZÔ¼!ðÓáG<[«\|qÒ¼\Ú+j²ñ׉µIG‚£±{È|½RóJ6šdr\}®á4ïø™qà¥Vxºy>"ëç8¬·˜ÒXZ±† Ô%ƒ«Š£V¾)R­Ua°Ø©Òöô°ñŽ&½V:P©F„ö¨é,*ÍIá2¬>3†®ñ[ÆT§‰öðZjuaZ´¨:Ô0U+J­êRÀÎ~ÖU14}GáGÆOÚrËö±ø/ûDx_à•´>3øqâˆþ ½ø;©øÖöóÃv¾×t­*ïEñ¬ž-E‹R»•5ËXã¼Ó`´·3XÌSÍYöZï€T«,ëV³¯˜äX\·SF—²ÀbaŒÄâðmQ§V¤ñTjT«†–"*ß"çV¤féc‹•Z+(ÅÓ£ìpY¾+… ²U1Xyáð°Æ'V­$°óP„• û4ÕJ²ö‘t¡Æ·ÑŸ~0xàOÃ?|Iñ¦¡ªA£¥¦• hðµÆ³âoëi^ðÖ“ #–¿Ôµ‹»KTb¬±‰ZW#jå­Rº©ƒÁàpë™æ˜Šx<UcB±uT8T¯5(Ð¥ÂukÖq›§FIBZŠ§Û‡£N§·«ˆ¯& F¦'^|¼´pôUç;JPŒ¦Û:P”áÕ8Jtã'8üñ/ö™ý¸þx[OñOŃÿÚßâˆ|9à߆zo‚µïëZ¿ÃOx³R„éÆ/ï,í'_|ñ‹>x>Óâ ׎?gËã?„Þ,ðµüÅîqy=Íÿ‡µ½&]+ìW¶Z•ÃË+È.á-e„ÉYž&ž†3lú:°­’:ô±kÁòÔ¨°Õ1x:ØyCø´q0§R‹§:”êÐjSU+{ `èÕ­žåY=JÔ%9Tèâá‚ÄPÅÓšŒcV©CFTê8Õ¡ˆQ”iJ=y¿fŸŽ´ÿÇ |9øµâ|4ðgÁÛÿ 꺯‹‡Ø¼uwñ;ÆZ”zeÅÖŸð¿ÂV·—pi>ME¡°I5›½FÿWeÍå…œVšŽŸ$¾†>•<¢üF9T¯N9NƒÃ`¢ñ¿­:Tkâ%(¨Jª2«<«b)'…Ž':õ«áðœÔjËVީӔ³M*ÕñT0Ôp¿Y¯ 5S勯‰ÃQ†–a‹©õL*ÄUÄJ•¬£_ʾ þÔŸ¶€< }ûHxáOÀ¯|°¿Ó®ÿáV|@×¼u¢~ÒWºÕí´h!–ib‡Ã:O‹õä:œ:<Ö³\ÚÅ(²’Þêö'æ£*x[œ×£”â*AJÜøøÕ¡‹xKT£…X{ºÒ«9ªqåÅb0Ø®É9iUŒ8„ž­)G–R–sB %Ë$90ïäçZ¦*xuF•8P©ˆÇ¿·OŽ£ͳêšÎè5&ºˆØ1[;†n:gŠÂjÑtž_Œu'—á£QTÇTÂÃJx¬KýÞõ¹s¬6SUý:x¼G°Ž*iuU§õIG.ÄÂrÍ0ð¤ñµi®Lò§ÔÂÑçN­yCž*ua.J5iâ0µ"êSIúŽŸûtÅ«~Ξø§¡|;o|Wñço~xKá/†üOc«iþ"ø™¦j÷ÚeôzWŽìíeÓî<Ÿ§\kG]UkQfPyÇp˜öã(Ô«ŠÉp™*æ©Ä8IcðÏ¥Gê8:0“ÇVÇG–œä²Ú°„iTÅIS”c†…Yʆ8IS¥êy®"—±áÌWÔñ°r”éckÍÓú”2ÿkQËNµ*¦áV¥ëFÆJŒ#åŸÚ‡ÄŸµŸ‰ô³Oí௅OíñŸáÝ—‹¾j>0}ÏÃ^׬5_ø_ÅšWâšäk)Øu(n-¦–ÎKk+ÁµÚÍËVR°õ¸Ë†èûyaëpí|G9IEáó6]ƒÆsaðñná<=OeR½IÕü/Dø‡ã|ZÕÕnâм_ãO…ß ­ePðxsCð½wàÏjöq¸ÌZî¿ã½Ä1ÜÞ¨C&—¢hvñ.9e½ú € øÏþ áíoÄŸ²Ä«]L»ÖΕ?ƒ|S­h–6ßÝj¾ð—ü;âOÚÅc;ª^mдËéÌæE¶dPÌÁO:Åa²ìã…sl}£•äùÖ Ž“\ц>Ò”ªN:Þ*•iÔ¨íËBS¨ãN3”ziPÆcpþ[–b~¥›æ™>gƒËë§5(bëájFœ é©TLTyðtåN2©â"àœ’GÉŸ¶¿í?û5üOøGðKþø…àßø“Å_¾ kÞм7¨éº–µá[]?^Óïo¯¼K£ÛÜ}«ÁSE£^O¦MB k¯;QkaoˆnZÛ¿†¯þ¾p}.g^®:lF&”ÝJ¤•L4 ±PnomˆÄaëB›”•EAâ-ÍB óq©Sà®2q¶ l’¶žiS¨æªÑ¬¨ÆŒoîR§…«'V?ìÉB 5[­‡Ux߈^ð-§í·ûCX|mý§þ8~ˣǚ_ßü5×¼ ñ{Nø9àxkH𯆵{]W^Õ4Ë›+ÍsFÖl¦·‚ÞæêÖc÷&¤\µyÙ3£ý™˜`^*qÌrì׉¯…©QFœ°¹…Ju0x¬-7njŽ Øb%ÜãF’„dð˜ß«úY³¯õÌ›©S«—brª8ZiÑ—µÂâ°uñsÅàñ•Ó§ZUVaEYF”±sY©bp±œÖø=ÿ Kþ ¯|ø¯û@ü{¹àæ£à|YøµãOøïÁ¾ Ôt ø‡VƒDð‹­ll¯ué´kMSsºKb‘êVašT¸,Øæ~ÒŸ :ßTX,&cŸå¸„«R•N&Y~7…«§OFðÓŠX5^´cW,¾¢¥G =2Úq­Ä˜L"¯,V6†MŽ¥NçÏB„sJX‡‡ÃN¤’¦«Ô­BU} “†U©õÇF½NEé>4ñ…ƇUðWÄOŒŸ°®œol-ÿiŒÞ ñ×€¤²y#6¾&>£¯~Ћg,?ñçk`žñ…‹r¶ïFT}Ãæ²,=<Ç dتj®‚3,ló r‹:™/<ÈèJpiIbsøl¦¤¦áÅÊEWJ8´Íj×Ë+f¼E‚“¡[ˆr¼=XE¿cÄ•*QÈqUå{Óöô°•èg\ËJnŒ'R•J•)RÅu^&ðf¯¯üwÿ‚ŒxÀVf=cSý“þø_š]’¢—¸›À¾(Ó´½&Ñ%uE3*Ò0îª<ÅË“^7=|_x…‰«Íˆ«þ¶e8ºöMά)a>³Š´b¯)N”*Ú0‹œ›å„e&¢û°‘ÃåüAáÅU#€£†Ès4+KX`ä³…G ˆ|Í·%GN³»wTõgÍž´ý”¥ý4ø¯þ û\øbm/ÀÐiž+ø#oûHiwŠ´Í[N°FÖ¼¡ü'¾ðÏö”ö+¨$Ú}²ÛËhÖž[µÇÙVI“ès·…ÆÎ´ðtëñ6 =kêÔ£cñXêxéºtèâ ¯Nuªóû üsÿ‚sêꚯÃÿhß>.ø[HŸãF±á­Äúl—žð\Zƒã »K˜´«o0’ G·¶uˆÜâÞ,¾Ô>–uªqGàêÖ£ŠÌ19I‚£õyJ§×1\îä¨9^xšõ#MÔ“‚“¯/iV’”5^N*ßð~k‡XeX. ÍqøšØ„©ý[˜dØê”«ÖO•С)ÊVö‘Œ°ôù#ŠöU.7¿ø¡‰¾$þÒðx¯öÀð7ìYà |Sñ‡†ü[ð‡ÀžøsáoŒß4íK·lþ!j°ŸÜøßÄ1$fÞïÃú^·1ŠÂÒÖÔ=˃'Íeõ0óáì2®*¦&ZØéÿgà› ò¼M,dâ°jTªÍýf¯™9ST±Uêchέ8ªÔpŸU˜R­ õàp´é²ÁdñXì_³œ1tñxHU’ukU4ðÔëO „J´¥ŒiW©‡¦âªb8_‡øßþ sñoþyøƒá/ø‹\øÅðSÅšá»»mgZð·‹4E½ÔüY§Y3Üx T°Ö¿²Œ:Ìv3›WìK”J±*Jðãž §ºïŸSuñ4eÏ…tÝM/gõ¨?c[ÛÖt«R §9UŠTÜp²©N15éÓà¾1åÿc…|’¶y¥N§Îµ*U%‡ÃCîBR¥¾¾µ7Þ?¾Ñî–îÆÛÅÞ¹µHáPû8²º½®š 6ÉôXKÚFáG^n4¢ó¾¦%TTá„§ŽR©IFxŒ?ÂpTx ”%‹ÅdyŠËTš”«?ìÊ(bé&§%‡Ž"ž-PP«Vsޤ0ØšräŸÎω|1'íSûÚê¿¶Ö­ûXüJŸâ¤w¼>>Ó> xsÃÒi:þ“¡Ýiþøv·º‘㙵Ÿ²Ïsý¯s{5«y·P[[ÉlÒrdqæâ6°Ø9:pɳùbq5¥)¸â%–·J– ÔåöXj˜jNXš4UJO‡YÔj’¦tçÙðôjâ1p6w‘RÃaé(źqÌh{J˜¨AÎu*B¾"Ãâk*W¥^t)*‘ÃUœ?yk°(®¡Ñî•”ìwÀ`AÛ$l¬ƒÃ)APæí'ÿ½ø{û@j—>&‹â÷Æø‘ÙÞÎø«Vø§á;l‘¶“âÝOû^ÒÛ?(†×Ä6ñFŸ$q  ƒôÐ÷ï†²í¦•á=7Eøƒ­|K\Ñm­´Èï~þÕßµµ†u;H#·µ»´ðö¥ñm%ð£ì‹aÒcºÔíàE‹É½9ŠØÛÊÁ·•@ÿ†iøuÿCíÿ‰cûSÿóä þ§á×ý ´þ%íOÿÏ’€øfŸ‡_ô1þÐø–?µ?ÿ>J?áš~ÐÇû@âXþÔÿüù(ÿ†iøuÿCíÿ‰cûSÿóä  ¿üñÁÿ|k¡~;"×í~&Á×üwñÆ~!ø¡s¨êÖWšuåç†æ×~0ëzü¶¶Z¾™§Üéq,×ZÙË©”kfó'U©_[/ÄRÃ,u,67 ·‚öÑŽ.‚®ã'F^ÆS« Á)9Ó5()¹Ç« -YÖÃâëK O‡Äѧ‰Ü°˜Š”*C ‹åTë)Ç ˆtªÔƒ¡ˆR§ÇØUmAüݬþØ$ñFƒðëÅ_°íMâë6’x_Xð~³ðÏÃú¿Á]SÄ—èé‡Å=GV}ïÀjd#øš}-ì¾Ç›æ€Â1UŠÃSÌ©T£€Q«N¤}¥_QqöV¬ªN3š•*ô\=¥F¤+Ô¯ P£:U§(J® Iãªû)SŒ•iàÚ¯Npq~Êæ¹ý­)Z¥i>NyДªr·.Å_|QðÃþ {ão‡=ŸK²ñW…<â/ÿfÚj/{¤xGPÓ¼c7ĽÂv¥¨]ηpé/ ž”޳I ¯ $M4N¯6ÙîaýŸ_…1ølKÌq-‹áŠoV<’Ì*`±8,&¬¢©Ó”V&„«Q£û¸TPt¤¨R’Xxm’RXÜosåôò¼/®!œrèN—±ÁÐÌ0xµ.¥(ÒÃÁ¹KëuêS*4qjÍT~Ïë3ö_ÙŸÁÿÿáVüGý¢5Ý'D´oí¤Mã-Dñ ß¾‹áÏÃò§Á¿†z„¹´¼µÑ,`{kJ8 œu¬ß3™7³|-\‡[(Ë)ÙЭW™N^ÍKšTŸï©J¤'ÔŽ_…Œ2¼¿ÚV•*ƒä¬¨U”ß›‘Ë ˜æ8<~gVtò˜Ç—áóQÊpܰ­‰£êÒUó þß0«WNñQžs §O”økÆéãoŠZÆ®ø?ö7ý¤>þÞ±ÜiºF«ñ›ÀšðÀ[{JÕZ__x£Çmâ=CAñ·€¯­!¹¹w¿Óu[­R;{ "=NúÜB÷F]K C6ÂbrýC&«‹£ˆÌpùŒR¥[R´+fTjáy)ʽiU•J”ç…†[¡šJ„ªÂXIõW«?©V¥ŸáãŽÄQ¥ˆx)`%Øšu*ÒµÓÆF¥9Qœp‹‡ÄS­VTrøÔÆÐ‡Õåψ‡Úö×¾1Ò¿o««¿|,øŸ«iÿÀŸ ü>ð/ÄÏ xWûKáo‡^;ÿxÓÇòø§Å_n†/Í{«iú=µ¼ÐÍw4–¶`ÃWï?>_F8¬/à”¥—¬v; WR»9T˰yrÃááBiËÛb>¹™âç4ÓT•:µgQ^q¥–68ŠxN©V¬q‘Àá±KJ…¥%›c1Xl=LL©¨ÂQ£—¿5p¥:Ž?hñÇ>ð.ð+E×~xûþ Ó©þÐß4ßx¹|ñvßàßÃÿ|<ø£ø›ÄÚÏ„5ˆÓû |5—ᯃ¼;e¡|Y»øÅñ^?¾ºðÇÁÿ x“ÀÞ Ö5]>(áDºƒJ·¼ñ^­agmqqÎ¥%œ³D‘ñZút*S¥Åo…¯VY^Ig4°õ1/’U±ù`òúTðÐÒ0”þ³˜æ T–Œe’­)J¼¼‰Cþ«f4§É†Çç9¶SKK ªUË㊭‹­OiUr„p¸ ˆRöR«téΫB”½GÇžñ7Œ¿moZŒº´ÞøIð£âgŒ_ÄiwçÂïãÞé^ Ò´˜ufµ62x’ -Vì[,ââ+iFUŽdó8r~j8î,ÇUŒ!•å™^Rv¯*Øœ}ln>Xx´¯‡Ž†£Š« ?ÞU¡EÅûÒViO.áÌ-*–yÆ/¥ 4é`rèÃ,CI¸F8¼lªa£'kRICŸØO‘þðÏŠõ¯ÛâçÄc@×,<'ூ_þø'[Ôt«»-[¼ñ·¨øßÅÒx{P¸·Ž-_ìÒãZÝËi$ɱG¬²E± Ζ[Å5+F4§šgXaâݫϕe’„§:m' ˜b>­'uYªÓƒ²hy¢”ñ\-F•G<& .̱u¡:y†7O NSšMýa`pT\ÿuF¢«ì£õ¥R©ûmøÇ^2øYáMáLJgñ¯Š~|^øqñšÛÀ6×ÐéóøîËÀš´—:Ÿ† ¸¸GCs%…Ü÷QEåÍ$’ØGÏpñC.Tq++Îò<ê­ âp™|±´±Q¥IÖÄQÃãrüNX¼%ÔªbðÒ© Q„=éFU"š½×m pÆeÙþNëRÃTÏ0 Jµm)S«V9h ª¬;¢§7Q•HºÕ(Ñö•©ü›ãߎÞ+ý¥~?~È¿ døñGá?›â×ÅRŒú§…|kâï„þÖ5ƒ>‚ïPšÃÁvwš; gQ¸¶[ûëø­ìàÝ¥Ï#wdøi. žc*Ô%O#ÉsL\)F\õ¨¼|±ðxº¶ia«ËV½,5êTtc_QÒ§,*ÄyY•{påL$Tèb³ŒË-ÀWVŒiÖÃѯ…̱˜<,ª¥S”i:˜Ê´(ÒXl>’uÄ×§GXðV…ð/ãÇØ~/~Ã~&ý©¬¾*üLÔþ)ü,ø•àß‚ÞøÇ=½—Š,í#Ô| ã K_ˆOàkX´EµÓG$W÷w Ž ÷^VÜrœ&GK ÎWWN5ga08ü>/[€Ä×Ì©­J¥Jô³ ÔŠ–:%KØÎ•Zþ¦kQVÌiæÒ¯ÿ µ°~¥Juq8ZÙf–(`ãgUâ £Z›„¢«8œjN·¶¥„ôˆüwwû6øáÀýŸ~ü8×þ7~Ð_ ãøà€ž³·ðß‚¾[x¶?Ê>!kZoc­ßézckªø‰RÆÂK«¿³ÙB!òÞçפ£G‰x"•,ÃÛa2,EL㉜'KWËëÖ•,¶ðòÅb¾§‡Ã*Õ*ÕÄ<7;¿<(Ró#*±Ê8×J?PÆcp0Z§íg­‡ÀÂ*Ò÷¥8ÓÅf¥^ÃÒÂajºµVp­3è?ÚOÂÞ"ñçÆOØ÷Áö^Öµ_h¿u¯Šž3׬ô}BãÃþ›á·ƒõ¼µ«[ÇöM.Kßk H§uiä±+ÊŽ—*uaÄ•s ÕTheymÊçu,N/4–.¥J„ÛQ•Z4gŠÄV‡¿?ei$•ätc!|1‹Áa¥ìêf†Oƒ• KYeÔ«TÆc!8Á~ï þˆ„å'NN¹9ò?›~7xMøaûR|Gøµñ?öLñí_ðÃã„| m \x7áG‡>4ø¯áŸŒ< a>}¢·…5õWѼ=¬i’¥üšœ3ÇÜÚÁY\·Ùø²Ú”°”sL«ƒqÅWÌjfXñEÎá¿¶üW¹ð…¬Üë2A¬jºÄÚU¥Œ) ÙÂc¼’{Èç6ýxì¯K‡²F:>Û3Î2ß트zœùnO1§R¤aV^åw…ÀÃJYœåO Z¶):4¨ÒRu°Êñ´ð¹ž?<¥JT°™>[‹Äe²«AÇ3©Š¡‚¯]:tnçbq”ð+ €Tý²ÄRq«*ðTªŸTüxø{ñHý‘<]ðÇàÝé¾6оéžðBi1iz¡³Ñ-4Ý:êÃF¾I­ÓMÖ.|=i}mks°˜®n"’6VU¬8«S3ÄbqõhUÄa±Y•,V?B\µk`eŒ\e MÑÄs^ƒ’•‡¯*ôc<<(Ô•XÁœ'Fž[K†ÄÏ–µ jP«9곂« ‰Ö“_¼úô©Öž"s‹U/^u`Ôª/Çoüø{âohø ÿèøùðò}[Æ_ t¯‹ÿþ0ø_Ä—Z÷†4ñV“q}7Ã_øŸÄZ­Ñ´ÕSXÖ4=7IK 9¿…`ÔãžÖ¤èñ?c(V¥ƒÉiç´+[þ_IaÕiB–%*•jàp4éÖ…iW¯‰ž^Œ(9Õ¯J^UUV— ç1¨êÖâìZôhÎŒS¥Õ!J8ŒMãu±ª¬aOJžë…zøš/!SôùnüM¤Á@usáOÅ=KÃzïÀï ü<øsñ#@ð¨Ô¾øjÞ-KÄÞ3ñ»x»ÅK¨E‡®®õ?D°‚ÞH®.¦–ÒÐyQÃqo$þFWJ¦3Çx:õ>£_ŒÁÖ…j­SöØ,Z¨RŽwnµwŽÌñ•!Fµ(Ó©V¥EyÆ—¡™SŽ <5ªà2ú8ÈË JÒ©G‹Åáðê´áñÆ•,» B.s—³…9Ôtc*߯~ð.ð+E×~xûþ Ó©þÐß4ßx¹|ñvßàßÃÿ|<ø£ø›ÄÚÏ„5ˆ1Õ´Äðjiö2_ÇàJÖ[ËÓ§è—š€½ºµ´mOgÙîÒ8#)ì.aÄŽ5ÐxÊ9=<\£.c ˆ©Š•*ɨU¯ŠÁQtñ”)©Ë/T#J¼¡R·,òÌ«{|·%ÀàáQáñ³­™J¥>I)e´kÕÂ*pru!Bž!RqÆN£ŒúÝj4¡7†¥‰_¨Õ‘¨P@P@P@P@P@P@P@P@óÿìÅÿ$ŠÔ÷oˆ?]rïñ·â;Ý™‰$õ$’zÐÐP ñ+Bñ§‰| â-áߎ[á¯o¬Ñ|;ãeðöâ¥Ð¯á¹‚áeŸÃúô2ÙjV³Å ¶²Ç*†XîÝád™#uçĬR…9àåMV£V•OgYIÑÄBN¦¬©µV”+ÓR¦«Ñ~Ò„åÊ”%B¯Nxju¿Úé:Ô% °j-©S•JS…:ðJPS–¤£^4¥(Ó¬éªU$¡95ùÍá/ØïãÏŠŸ_Š=^ö{:âK6’%-=¯¡—,_[‰¥JTiäó•\¿.¢½–_J¿Ôq˜.)¨ÔRU2ªx©¬ ´œkUrtêS£Qy¸ÈWÅá±xz’…zùaqxêéOðµjÒ¯‹§ (¨óãkaðó­$ •J4ªZtá<=oÑÿ|8øyñ/OµÒ>#øÁŸ4› ѨØé~6ð¾‡â­>ÏPX&µ[û[-vÆê{Ñmqqž4W <‰»k°<Ž7R5]8º´ã(F|«ž0›„§Ê׌féÓrŠiI ¦ãu©ÍBT”ä©ÊQ”¡wÊå% 8ìå9¨¶¯)%ng}=Â~ðχm¼!áÏ xÃþ²´›O³ð¾‰£iÚW‡m,.V¸²¶Ñlm¢³‚ÒVžrð¤*ŒfrÊwœÞ'ý²3§‹ÿj„éFŒ£[÷‘•ÓTcJJ|ÉÒÆ”i¿uSŠ‚\©"0ñŽ Åá"°®%Z.ŠTÜkN¤«NªpåµIÖ”ªÊkÞ•IJm¹6ÎWFø1ð{Ãv6—áï… t3þ#ÿ„ÃÃúvà_ év‹E±³)Ѭìt¸¢ÓÇ^ñ5ž§[x‡[²ÒUÓK³Õõ¨m–óRµ³I$[x®&‘!0Œ(c’”cBéÑŠ£ MXÖ­.HÕ­:p«UFÊucM¸F¤¯(Á¸¦¢ìTÛ©*2©ïË NT¨¹jéRœý¬éSnîçS÷’„mOßiËS’¸ø'ðjïÆkñëá'Ã+Ÿˆi}k©§.<áY¼fš•ŒÛYj â‰4£©­õ½µ¼E8¹ó#HcD`¨¬;x>oª¿ªó{e/eû»ýcb/ÉËnªÕU¯ü_i>~ny^+Æ8¥ŠŠÄ(º2Šª•DžÂXv”ïgBT©Ê‹ZÒtàáÊámøËá×ÃÚuŸÄø7ÇVz=òêšM¯Œ¼1¢xžÛKÔ’6‰u: nÆå,¯–&d© V#v ©þçCK÷X¼-ýx{µ¨ÞTæýEiÓ¼éR›å’¼©Ó–ð‹U?ÞP«…©ïá«ÛÚR–´ªZ3‚ç¦ïZ5*Es'hÎkiIx«Å¶ b–(ñ'€¼+®xŠÉ4¹šãMKMoTÒ§¼¶[K†i Ì¢bÑícš(ÿ²ÖxŒ7û>"U#YÕ§ûºŽ´#«œm'R1§N1›|Ñ8$ÒŒlªÆ5¨,-hª¸hÓtU)¥*jŒœœ©*r¼U99͸%ÊÜäÚ÷úÏøGžÀð¯†<=á‘ân÷ĺøðþ‹¦è£\ñ¤"]G_Ömö–·t €O}qæO(…<É`ÃMÆŽ ã†ÂAÓ¡I;S£MÎU:P^í89Îsq‚Œyå)ZòmÔÛ«ZxŠ­ÔÄTŒ#:²÷ªJ4×-8Ênò”iŸÁ6ÔV‘²8»o_,›Zk?ƒ ­Äš¶Ÿ¯ø‰­¾øFݵíwIÔeÕô­kZ1i uMZËVž{Û{ËŸ6hn&’hÝdrÅQÿf§ƒ¥‡ýÅ,¶¬ka!O܆´)º0«‡Œl¨U…éF¥%F›tÓQv&²X‡ˆ–!{ybéÔ¥]Ô÷ÝjUg •iÖr»©N¥JtêT„ù£9Â’rŠkCÇþ|NŸOºø“ð·á×Ä+"íô«x#Ã^,ŸL‚åã’æ >m{Lº{(e’(™ÒŠæ$, QˆT©Æ¤«*qiÆ”ÔRœ¡MÎP„¥ngJ¥G·hº“i')_G9¸F“œ8JRŒ.ùc)¨©ÉGe)(AI¥v¡¯¥øÀzÞ½¨h¾ ðŽâ›-3Mñ5î—á½O»ñ¢X>—£Xk×6–QÉ«ÙXi’IgkÛJ–ðHÐÄ©:VoB¾ý¾W^µžý*µ±vúÕj´åxN®&Ëë$œëY{G+Mº2ÂN“öSÀS…,¡îË Fœ”¡Jƒp”c(BŸ,c(¦’izOÂ?…:„uO‡úǺ/€õÃtÚׂtŸøoNðްo¢Š ÓªxnÏMNÔ Ä0A¦{y<ņ5|„*ïë4èÑÄþþ–—ÙB§¿ \•ž"Î2º‡%vëÇ•.ZÍÔVŸ¼M(ÇR­Z P«]5Rt×$ê'Oص9FÎIÒýÓænôýÇîèdèÿ~xvÒÒÃÃÿ>èV6#Ó¼cae£ü:ð~™ieâí6‹HñM¥½–vÞ#±‰Ý-µ(Õn Waª ¤+U¥:S§VtçAW)FN2¦±TáK ÓN Jœ)×Q²­N…NhÅ$¹!ˉ‡*äÅÓ…*ñ²µjT¥)Ó§YmR9Îs„'ÍJr”RrmúÅfPP@P@P@|åñköeðÆÏxKÅ=ñÄëÏ øPiÒKðrÇÅÃOø9âíCGÕfÖô­_Æþ‡M2øPµÕÆdóoÒ4‹Hä…âóã¹xýŸ˜<Κöø¸rK ëÞ¤05©ÂtãˆÁÓº…,BZ¿½jr|úß’’…bšÅå²ÊåJ…WUW+®&_«óakÎíK¾®œ#ÆP•Z³„ÔÜ%£ (Q€À€R!%££¤’JÉ%¢I-’è… a@P@'ñ×à/ƒ¾?ø_JðïŠuOøfûÃ^"Óü[àÿü=ñÇ…|oàßiÉ=¼:ׇ5ˆ¡ž(/ÂîþѾÓit‚;Ù4Kˆáž ]±T1”«UÃbpð¯ET¥>G,>&1†'=t«ÆU´œcʤ£)Æ[B¬U ØZØj8¼-wNr¥^ðz Ï ‰…œe øJÍW¡8ÉZ¤Rš7:ráþ ~É^ø/â½Kâ ž2ø³ñ{âEþ‘ÿÜþ8xîãÇþ,Ñ|(gŠñü/¡^5¶›£¶¡Ý0[V¤¸™LþSùC²•oa‡ÄaèR§C듌ña«WTãÒ§V¦î•7%ò©ÍS•ohðø_aÇRµ­†«ZµZ±ÁÆkFU¡BuZ-"«ÕŠ7V\Ò…5(Rtã_«}IX›P@P@P@P@P@P@P@P@P@P@PÏÿ³ü’Oû(ÿõuüB  ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ùÿöbÿ’Ciÿeã_þ®¿ˆTôP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@?þÌ_òHm?ì |kÿÕ×ñ €>€ €<ãâïÄýà·Ã_|SñM¦¯}áïi/¬êÖz W:Äö±Í –úŽ¡cm,ûçC‰®à\óäy±8ª85†•gÉ N3‚Rn*4êfÜ>•J’“Šuq0i«Ê£9F’P—F SRt©4¥NŽ"»æ¿Á†ÃÕÄÍ+&ù¥ RPVIÍÅ7Ü—Ì>ÿ‚ü×|i០K៌ð—Ž5ؼ-àž)øwu¢üñω.¡³Ñ¼/ãyoݯ繼†öÚ†°ŠÕßN¸qqäæ—ÐÃaêâ1R·Õ±µ)Ô­†ÃWýÍ|e:nL5).i,E ´q8xTTªÕ§Z…f±•©agæUÆQ£„Ž9^¶ 5!GZŠUi`êËž5)â§ã†¯J®*n¥:)V«)ýR…lM>£âoí™àO†¿u¿„Pü;øÑñ'â6‡iáMQü)ð«Á6>0Õoô?Ûj“ŸYÚ¯ˆ­^ G–ÂÎÛT½¾[8íçñ–‘<­oË—Íf8Š˜l2qú¶>Y~"¬×. 5„ʱp¯‹¯­<>¼3jTðóªãRµL.aÉIÒÂN«ô1Tã‚£B¶"¬!VxªJs©[Ùâka冥J”êbypØŒB„báì)?Þ*ó¥F£~*þÙþøeãi~èÿ>7üiø¥é–š¿‹ü#ð+áÌßuOXêPÛÍ£¿Œ¤MRÊÏNšý'c 6÷W’(€¼é Ol×SJª¯S°ð|6·Õêb¡õooi5F3—,¥>XMéTáV“’­B½:iÓtðøJ¸‰G _F8ŠJ®Øš˜vç •” §MB…X•^jŠ\ըʜjSŸ´^ðûöœø;ñáF»ñ“Lñ$º„|¨Ÿ ñfŸu øƒáÞ­ ZGwâxÃDk wM¥‚ßíqÍ&>Å-ÒIÉ®>T2ü%ÂxšxŒ³<./í*ÑÅÁÖxzrÃÅAV›­W–4i:1¯SÚRq¥ûÚ|ÙácWŒ­—ÂŒèã°µ:´+(Ò+)KÚTs’§*œåYÍR¤©ÕiS©B¼)ù§Â_ÛƒágÅŸè>ƒÁßþ^xÞÇPÕ~kßþÝø;¿t½2Øê7:ÃaïîµíŽŠÖúš}®{kÈ ©™ü•è¡„ÄÕXÊs¢ð˜ü¶•:ø¬wcpô¥?e9T¥8þ⵩VQ©&¤å:j¥UêRƽzt%FKš¾ ½yáa¥ K õˆórQV£*S¬¡SØûXA9ÃØMÃR…·~(þÙ~øuãMKáÿ‡>|yøëâ ­¿ü&Ö_~ÜüCƒÀ77ðGu¤iÞ/Ô§§Úéú¥ý£M46Mu*¥¤¦á`&!7¿Ö}¼èÑ«,- ÒÃýeÓk SIEâ0ô*»*Õ0ªt–%ÓR§J¥O`æëÒÄR£ÕVš éR©Vœq5i*ÿWçN¼(MÚj”Ö´é×jn5¥8CÚrªU(Φíçí…ð>ÛàÍ·Ç MoZÖ<5¯é>Ò|5¬Mñ VøŽ.g°á—‚n-à¿_I©[Kl–7 oÝ5ÂØ:ÝžŒBö52Úx[f¿Û4ã_.ž¬M·‡œZ‹ÃB•9Τê:r¥(<=HÇl;Œú×ö´ÿ`þIJÌÖ*ðyl¿Ùù¡‹TÕNYAâðñ’¥íRu“pNJ‡ÁÏÚóÁ_d·Õµ_ H—ú…­í¾Ÿq5²N“\[ËþåHgh.0§:ÊÐÅPrË¡ غ>ÕF¾ R~ÊŽ.¬%Ël5jÑ«Fc)%REQS^ÍÏ •¸juhÔ…•ñÀ¿ô4»¶—T𭼚͆“‚µ»¨¡ß_[ƒ,B9-D–É}%ÔCWZ‹ú<ÇVq†'ÜibU9Î0Uðع_ØË T«*jg9¼i}OÂÇ©Iã§–ã!N¥L>&ÝjJ½<=gN•l'<=µ,MoeFW­c N¤Zª©Ö£ôÅßÚoÂ4ÏÁâüCñ7ÄÙ½àÇÂï/Ä?‰w¿`µµ¹ñ)µÓt›Øìf±Ñå¾Õ|×ñ[¸·Ú¼äm1ˆfXœ¿êæQÃ)Öz4gt°^ÖThãq*vxzXŠªhÓ›u¥V§*¦áJ¼éi,»ŽÇFžY:þÊš¡Zµ79bçMT©ƒ àÜqhCžugO÷Q„sR«B5s>~×? ~-Y|Hiôˆ? 5ß„60k?|ñ§Â3xžðÝÞ™q¬Xx›PÓÚîöì[:ÎòexîÞdKq$ÐÅͳÜÖ!ÑÂå’ÍÞ*\ÎwFN¥L5x9[Z”bê*Õ#j§Š»æ¥JSÄR¯F•Ч‰¯˜a2Èa+G˜¥,gã)ûXP•L<¹¬á DÖN~ÎÕc4“Œ\2Ðà¡ µsÃÐ_ü/ý£|àkV„þ7xÏàî«¡üñúåÇÙ|)w§øœßÍy›¯ÌöÂÂ{­*Øm»ŽK±iJðí‡ÃU«ˆ¡®–]™bš§‡Áâå8Šø—Sê”’r§,O°…ZꟴJt¨Ôä”§É ãŠ¯K B¾*”¾»‚ÂFU18Œ:s¥†¥OÝ«V¯:§QBkaêrÂSUåÆ2O˜ûư5 (  ­k]Ñ<5§\k"Öt­H´]÷Z¦µ¨ZiZuªsó\__M0¯—uP/‚¼}àÿˆºIñµëOø|Ï-½¯ˆ4•¸¸Ð56ŒrÍ¡ë~H²×¬ÒTxÍÖ=ÔHÞ?3z2€¾€ ( €8о1·øyðÇâ.¦ŠÞx'Å&y¦*#C¢h·ºŒ`ï1i-ÑBàî,HÇâ µ¨d™£Âë‹©‡©G “³–*ºöXß[sb*Sìí{ÙìzY>ž+5˰õì°óÄRöÎRä„h)©WœçxòS§ENu*9EB”Ü¢¢ÚüžýŒ¿oØÛà¿ìÙðÏÀ~3øÈ4ßÚXjšÇmOÃïŠZ„©âŸkÚŸˆ5u¹Ôt¿\ÚßÜ$ú—”ÓÁqø}à x®M3U°>ð‡†¦ñ/ŠÚÛNÖl,ïÅ寽d°Ù=¼2;Ën¡§C^U6²ÇæØÕŽ#ˆ¸‚µyQrƒç†–(Éã…NQ¦¥ŽúÇ¿QCë’n„á]˶¤#œq6S€ÁÂ1þÂÈÕbªK–œ¥™cqü[špR£O-i^jp‚¯âÔ!é:wí«ñSMÖ<¬|Rý’øŸ©|IðV·â {¯LÐøçÆ tØSðŒwÄÛ‹Ô¹¾˜éÏ7•›©Œi?} ,£˜ÑÉs´²üãêÑÃÐSU¨ÖÇQ§*òÀ¬Ly"«N*þÅrJ¤ëST¥JU«P毈_RÄf¹t;+ÀRXœUY8aêSÁóBŒ±4hÎRX˜ÇVŠJUí0’–.“Ÿ,hÔôߌŸ´¿Ž¼#ñ2/ƒ¾êß¾#XxNÓÇ~/ÓSâ…¾è^𶩨\é:4Òø“ÅP\C©k—öwtèaFXÏóDópõ1ª¸÷C ¥€ÊªRÃb±«¸c14V' ‡¥CZ•T°Ê­ZÕŸ³…ì)ÃÛJ­O«öVT0ÐÁBµ~\fc Õ°Ô#NræÂáæ¨×ÄTª¿wI*ò…*TÛ”æÕIIRŒhûIýž~:é¼ uâx<9¬x'ľñ¯àOˆž×Ú9u_xÿßgOxvkè!Õ-¡{˜%·¾Ž8~Ños ’Am3Im£V•«eÙ† »Åe™¾bðU§Jxz“ êÔ£jØz—ž¼*R©Nµ 9:s‹<•¤ù¹«RÅãrü]…Æ`'87Ï Ò­N5°øŠ5RQ­B½))S« Ó“Sös©“çþ<þÐ—ß u_ xá÷ÃMoãWÆêjøm¢kzO…­Æƒáö¶mÄÞ+ñޏ²XøG@·K„·†æâ¾Õ}4q¨2<°yôêÔÄck`p”•j˜,q¸ÉJ¬)G …W‡£7ÍïT©ˆ¯Ó¡J ÞöU¹§F”+v:T¨a#ŒÅVö«×ú¦1‡´«_ì¥UÂÔ¢ý(ËUs}^HTp”9Üyï‚ÿ´þ¯ã»¯‹ø¯ð—UøñCàÞ“¥ø›Å~ ¿ñvƒã*o ëÚ]ö«¢ëš7Œ¼= 6š’¼:eìw1%°[Y#óe“ÍKsŠÂa2 Ë=Ãâ#ІJñ4±ôîªaq40ÏNœù¹¿u‰Â8U¡^Q5ªÚ“¥ U«ç…¡Š«›eÙUz óˆÆ®´jF¬kaþ± YÔ„m:hâùéÊŒ”¹©{ШÝYS¥ó•ÿø®ü$Ó¾>i_±¯ÛàΙKñÆú—įè£A·¶Ö!±¿¿ðƒ©XǪ|OÒ`²¹…üVº-»ßGy`]„÷IÛˆ…»YÆ!eyn=eñ§‰”eV¬+cçUð”yêQ ñ5)G ZSö¸¬5Zx¸á©ª”©ÔËÞ68ºyrX¼fXé{>e >êԧ)b]ãK£B¤ñ˜XB£ÁÔŠ£ ¸§(Î_©:}õ¶¥ae©Y¹{KûKkëWdhÙí®¡Iàs€ÈLR)ÚÀœ‘F#Wˆ¯…­ZØZ“¥R)¦”éÉÂI5tí(µtìúaqñ˜\6.•Õ,U*u ¤­.JS2MÙÚJêîÏ«>TøËûJø³Â>‡áÁ‚:ßíñVÓ@µñ‡Šô xwá׆¼á;û‹‹-2ë_ñ·‰¢žÎQ¼€›-`3\[Autd E¸âÃÕ©‹«˜,5%<.Q:q•XCÙâ±4½½ 5:nó«Qáí^­”cN•JR‹©zªuZT°Ôp“ÄVöuóZXJ‡<êSÃέ^­¤:”¥JgÆuàè¾IJMøuû[h>#øCñgâ_ÄOëß õ¿€z—Š4OŒ»¾Ó¼Sáígºl:ÅŶ­iM ¯Šm/4û«Cgyv‘ÜK+*$%Ä×Äàð¹V9Â×xü2_W‚§ ÑÇÓÄÃ_RIÆ4«ÒÆN4×µ©©Ô¥R¿Õå*´hå„¡‹«™VÊqTa‚ÅÐ¥OßµU¨ýCF¦/‹ç¥;<%9T¯ARu¨Õ…Zws«æ¾ý´>#¯Š¾Zülý—|MðWá¿Æ}cNð×ÉR|Ið—#Ô1…7S£ÃÆt©¼e(Ö©fè¸K–¦&œ°Î00©ŒÉ©:3©_‘Ó«O ‰¨©PÅÔÃ{óiÒöóröTHÞ¬¥:1«·ñö²ø¥eñÇþøû0ëߣøF4ûO‰¾ O‰žøoe¢ëº¦ˆ-4Xkº}õSG‘u±…9Þ;tŽV•üš¸ý[›béO ÃøZøœ;ÅÓK‰©S.•³?e€¦ÕYG R Ô„ñ•Zp§NéÖ¯ßR•:xštkÆYZ41£%ìéQ¡‹ºÁJ¦*£*ê*I_’% N§;«N‡k}ûe|#´ýž¼/ûEÛÇâ}G@ñ¼Öz7ƒ|a¤%ÇÄ/øÞûR¹Ñ"ð•áø®™.üQ³c¨ZË72¿Ù÷$ÒBªïß™PÅ`±˜L· GûS0ÌãBxTeË ôq)âaŠJ‰,>–¤kâkÔèÃÜ…:¸™Ñ¡W uá˜TÇFYT2YV†eíá%,ðõ=”àá5NRœæâ°êJ’œjB¥WB’«R—ðÿö±øž~$ø'á¿íû1ø‡ö}¸ø¤÷Ö? LT°õSp­S œ+T…>xÇåR¥JnXhby+ש‡£ƒÆ<<¥—âkC :×Q–½uªÆ½ ¨Õ„1nŒ[J¢­hªR§ U\+|kû]xú÷ƾ1ðWìÏû8xƒö? µ t?‰~(‹â…~x?Bñ*ÛÅp|-áíkÄ–·¿ð™ø†Í ë©YØÃXIöT&fº/6jÕp•3?ªÎJ•Hañ橌tëUÂai©â*á£+ѧ]Gý¢´&¨Óaëb=JÔ)áñ°+ræu!F´¨8òÂ…*ÿÂxœDå tjM8TŒ%xû9MʬjPÄR¥ã¿¿ >;üø ÷Ã?øÏÃß´‡Åÿ ü<ŸÀZι¬øYð®©ámsRÕüQ{âFЗwº§‚n§›NY"¶¾û$K<Ñ[JÍ^¥ãÄœ;O Š¥Z/ˆâ\» B¥5C–ý{ ^£*”1*KBƒ¥*•(R©:•c:òÃÓU|ºµçO#ââéUÂW£*y+iÓÄæ•¡‚žbiªu°´jáêU©WN¬p¼ÔkS¥:µhèøƒûS|HâŠ~~Î?³v·ûCê ¥³Óþ&kŸð²<#ð§Â~×u;(5;ÃVµâ›k¥ñN¿„žv¡ki?Ùâ{5v‘îYmü¼>"¦+‰Ì)ÒæË(bq8×SS©[ƒ²ÆB– U¥ =F¨Jvæ–"3¦©òû*•½ÔhàÞ :ª8Ú¸zX•‡„-W8Ñ•jŠIQ©UB5(RpµZöŸ¹Rñ¿Úö»ñoŠ?b&ø·ðSÁ"±ñÄMB…7±]x³MðŠ~x¯UÕ/üw{g"Ì·öµeãíìlbÓZÚàý¾ F_²Åkh>3ø%â(þ=øªÑü à?ÙëÂþ2Ð;|Ö¿g¯ˆš†5?x>ÊëÇžø•áox[D»±Óõ¹,|aáˆííí|C§ÝßG%Æ‘%»bè ¶žÂnˆx| Ë3¡S,Âc”%„U#í+ÎÜ(á*âpн\,F&q¼ê):9}n¬S…\=>Ú¸ZÏS*ËÒÌ3<,¡N½7MF½ÜªáhÕ’pÄb©ÒV…òºø—N6éWÃâjÛÿ‚mÛÏ«üñ7Å»ß7ûCã×ÆŠ¿î>Ñ‚tƒSñ$ÚŒN¡ˆÛöme]¡W(92Iê¼.#+È8;$ÅÊœ±™^K…x—KøsÄc'W*±ºN󥈡Í{¸µÉv ­Ã[LjxŸ0¥_ëGކ.UL¿†£GFËwFn½6åiÆÊ”×56Kñ¦ëÇ¿´?Ççý—üã¿ü2øgà?é:ø÷âßßÇZì¾)¹ºÁ_<5âó&Э.­ôÛ­CS¹†3ÚŸ±³l–H§ò²ú4s*ÙÆ7_&ÈëÒË£‚~Ò4ó~'õšñÅ8¨ª¸ >µ(T§N¯3­V¥)ÓYa±˜.¬ujØ YFz–q øÏ®%ðX"#<73|¸Ú˜¸ÉFN›Œ)Æ•URpŽ' ‰ç9ðÚê–ø‡Àÿlµkï<þ½±·iÑlì7‹Û;'8«Ãß…Åb0¸ì½§´Ê"?ÚX[ÙâpÜ“ƒ•;Ÿã(FsŽ«”U(×®âá]ѯC ˜l6'ˆÃÖ”èb£MÏŒ§*¸l]8KØÉÓö”iÎ…Yµ L/ÓéV¶Âb}ïö°øÍ®|#øYoeàË{kÿŒÿµ3á‡Â-.ý£Ç~)"É5rLFÒ4i.uYçxR‹tÙ;ŒfAI$‘¹_c [ˆáÅC/Š¡C‡óÌ×.§…÷#<PÂUÉéT¥NТêà¡*êã .R©R8S”y¼Êø|n:Ââ±ØŠxšœC’á1np”äþ·„Åb¨æNN¥æã,^"Ô\Û¨éSSªïQ[;öÑ‹áþ£ñ÷áΉûZj>5Ò¿d[ÿµ¶‹ý—yâÍ'ᆵñÊóÄSA›ñWYð\ñÞé²Úøu-µ &kÙl­"6wóý©`ƒQVñòúX*ùŽkO1Q–b¥€þÅŽ"JZtÜ+ÒÆâ0ón0†b¥^T*Ô«5F–]*ª·³•\+«ëc%‹¥•åó˹¾«™…LéЧíqj•€þÏXªs—öuJÕ*.ZMש˜Ç ÓœW5/Gø7û.øGáwĆÿÿc_izwìÿâ?YüYð%¿ÄÏxûÀ>0F´û6ãý¢ï]¶—Æ–ºîŸ •ÝôºÄ1­•‡ÙàMÜW¾¾¦+,~2§)娼,káa:j8Œ&9ý^TkPnk‹Â):íÎnªtd¡UC <'Z80x›âÕŸìÓû8Ïá¯xÅ<%>)ü[ñn•?ˆ´Ï„þÖnn4|=ᤒ+_üC¿¹ŠêúÊËT—ì3ý*)!»il¹ðj¦c_5ä®°™vE,5EhFZõs E5‹¡¥JS\–1©Š¯8òÇ^N…Hâ©S§[\MJ8 ΄±y–n«O AÊT¨RÂP—±¯ŽÄVŒdß-gìpÔ)ÞsÄÆ2¯†mË€oøm¯Ù×Ä×¼gñ/Ûáwˆ¼K¤xkÇZg‡þ éþøðæÓSšKKOxOFøx÷x£B·¸¸Iµ„¿M vÿdŽ4–êêÛÐÁT¡W‡Ë1Xoa |½ž0Œß&ã)F9„fÕ8 SIâSS„êÊr“t¨áq¼XØ×£ÄfZÑ”òØ:Õ°S§'<^UÃÂpÀ{(Ô«W1Œ'V­;ŒiT…)S”œªÆ®éÏŸ´·À¿ÙÒÇJ¿øËñHðZë— o£ØIk«ëzî£å¤5Õ§‡<5§j:¬Úd0“_‹/²Ã$ÖñK2Is KÀñV!ayù«ò*ŽR“„’„ª8¦©Æn7QÅU•:ŠŸ3§5èáêʌ먨ѦŸ½)B N2¥B’œ¢ëT‡¶§)Ó¤§RåíeN2š·ð×ö‡ø/ñÀZ§Äφ¾?Ò_aûwþÉŸ‹¼à[/ž“Äþ=Óô-KÃ6/¦øšÞÚh¼Mlnô+M[X¹ÐãÓ¼1¬^@a)¥kWz}ð7–höê÷¶ë7DpõeŒÄ`cñXZ“£8óG—ÚÓ‚œéÓ©gZqþ-Ôo¥…Iâa*KµéPìUYrPi·&¥xEU•:‘Kž•5(¹º•#*Å9}ZQªú?þØ_³OÄ?ŠW¿¼ñkÃþ!ø‘`Úš6…ek­­¥ìº4~v©o¡ø–ãJCñÕ¼iš /R¼“Ê´»”!ŽÎv‡,yž¾?_ †<擇°Uá òΦUU‘áÛ«ÛÝ2ÞÇQ°2jö°M¦¬·Û›±q"Äyèâhb)ЫF~ÒÞ20iK|6®_‰çM^—.2…z4½ª‡Ö}j˜okJ”ç*ЫBs§V“„0Õmk ]¬PpiÚw¥iÔPrt9éFº§*´ÔÏ~ÜŸ²guŸè%øáá MCÇ~‘«xtØ_]ÓŸJך¤jZ¾µ i—ºw†,.c¸ŠeŸZºÓã¸fXä^Ì=˜¬Ò®K†¶ÌhJ”%N-:n¥x¹Ñ§O«U«V 5!J•YÔ•:ØZŠ.¼4ªà棣˜Ù¬%xÕ•7Ë/hãBNÙÒúÂä«ÑiÒOÛÒ¯A'Z…hCÓ~2|ø;û?xrÓÅüy¤ø/E¿º[=1îbÔuMKU¸& é£è: •ö©«ˆVxdììçKxäÎÑÆwWLM8Š8IÏ—_Ÿ’’Rs妛œå¦éÒ‹J­NZj¬éÒæöµiÂ{Q¥:øyâè¥<-5MºªQö½þŒ¯iÊ¢Rœ!)Êœ*UQtéT”iüý£¾ þÑZN­­|ñþ™ã[=î+-n,õWÒ¥¸G’ÒMC@ñ›§êv¶wK À·»’ÍmîÎå`–Fµ˜GÛ[[ „¥Ž«\%oiÉU58Þ‹ýä%ÈäáV ÆnŒÔjû:”ªò{:´¥>XW¥:óÃ)5Zž¼²Œ¡Ì­åMÉ%VçŒe:nQ„ß$ššq^7sÿýŒl¯ôM.ë㿇mïµÝJïHµ‚]Æ ýc¬É ÜÇây‡<¿º„NVã_m6¶ö9È‹ƒ†¬Æ¦–ªï†Ãb¨I5 u)b£RT"«O–’¯%Móá%5Š¢åF5¨Ó•z*§N.•L ÅÃNxÕ°õ —=HÕè:ª4éóN¤:Œ*ÒŒéUœjS¥9ΕXÃè‰ÿ>|ðeÇĉþ3Ѽ!á“WÔ%–·ÜÜÅ-ŵŽa§Åq{¯jS[Á<ÑÙi¶×WEo4‰$NË–&½<áKÍ Ò¨©Æ’„çW™Ô…'û¨FUiÊquê8û<=>jµåN”'8ÖLe9ÕÂ¥Z*.¼êFQöQ£¥ª:¨(ÍÊ¥ï^­Z”©RS«Rœ%ò7„¿küfý¥>èŸ~&iþ+ø?â߇õéÖš4VwgÅ~¾ðÜ:PÕ!ñ‡kâ/\ÛÛê3J–¯ö(î`¼†ãËž!ö`p¸®ñ qtï…Ãäyf;Ó‹‚­_7«„¯5:móKØÅR©F¤¥ìd®éÓ¨îø±øŠt¨äÃÏ—ˆÍ±¸\TZw–žSõª FjÊÙJQ­I.yBtI{9Â>®~ߟ±ï†þ OðÃYøéá{?ÚjðèW©ö\ønÃU”Æk¨xêÓC—Ã6ÚY<›¹n5xâ³–)¡»xe‚T ½¬ÏÙýEªê²“¤î¡Ê1rNŒªrF²ª—û;¦ä±.PŽÚÊ¥5.¬d'€ÿzƒ„£e(A:µ ÝOgËR.z”§ 'í!R1•(§:Š\Ç×ñÉÑÇ,2$±J‹$RÆÊñɨd’7RC£)0$ArŒ©ÊPœ\'ã(É4âÓ³M;4ÓViꙜ' …JSŒéÎ*P”Zq”Z¼e+§ši§fµGÍlOÙ£àg‹t¿üRø³ øWÅšªÛÉŠlµíjâÂ+§·KYüC/‡t‹ø<+o2ÜÅ,sk2Ø#þuc RH˜á«QÅâja0õa*ÔeNFä¡Jœê_–+ÍÆ„'iÕŒª)Q§:uk(S«NSÖ½:˜\41U©Ê4g“‡,e:“…-%*t`¥ZqæR§IU© ”©óÔ§R1ôßübø]ð·ÀRüOñïŽ4x --o ñ,ׂòËS†úÜÝéɠǦ-Ìþ!º¼µS-­®— Ü÷( A‚Œ]X`+G ŒæÃâe[êꌡ?m픹gOبºœÔ­)V÷mBœ*U¬áNœç„רýc(â0ÊÖ=´'GØ5ª­ý›…NhF“RýìêS§Kžu!yçÁ/ÚÛövý¢õ cGø7ñ7Lñv±¡ZG¨jZ4šW‰<3¬&žò¤QµÒ|[¢éwz–ĶðÍug Ä6ò]ÛG;Æ÷0¬‹ ˆú«ÆÆŸ65N./ÙÔqç„jE7*j¤T½”§Ƴ§YRstj¨s¼E(׎Rq«(©A8ÉFå„ÚTç8¨JR§:‚S”Tn¶³û`þÎ^ñÖŸðËSø^=Õ<{sðÆÇÂöÞñ®£©Kã[8ü?$ú[.›á¹ã·´ â}n©4‘éÒçXîÙ¬®Å·>ÙZ40-W«Z–.¼cu QÀã3 &¤ÝNUJ4ñyVcI:ŽÑajU¥ÏG–¤·Æ¯ìêUëc\pôðñÂÊNRÚÆÑUðÞÊnuœé¸sFŒg*S«B•eN­z0žE¯í“û9x§Ä6¿¼+ñb7ñ爴Oßè––~ ñ®£>„&ñ>›®jz”rxdYéßÙ×ÞÖåÚ¤ö†ê;¤e‚þÖKž)ÕXÌ£3Æàqj…&SK4ž-SU Àa±ø<\¨ÎÜòx\v°{wí©R©J5'Èu*_RÌ0˜leΤó5–¬+«T¯Š§Vœ*aâàÜã 98,\SîLD£UýWì»_…<=ìýቾ+øÇ¥xëËáuÍ_ãF·áëo…ºWˆlÖIüGyá«´¶‹Â±ÈÛcŽ‘á‚€»¤ú9½Zuªâi,¾”h`_+¨ë9χÃû)C—šs«Ž©V£†¦¥SÚâ!…§ TQƒór¨ÕÆÅÓ£[ëÕ#>EEB415Ôá.nXÆžåJ¦"n0”(K9(7#ø?ûlþË|L|ð³âîâ4qk jGŠ|#©êqÅ ÅÄë¡ÛxÏBÒ[^¸‚ÖÖæâh4ßµK <Ò¢D¥êéakÖ£^µ*n¥<"Œª¸´åN|ª¤ Ÿ:¤§Ë Uåöp©R•9Ê3­J3s¯JŒéÓ©.GRü­©(_šPu-ìãRR©N›’_{ÙÆJå¿ñ;öÆý™~ øãMøoñ+â÷‡<1ãMMìQtY-õ­LéGSkabÞ(Ô4].òÇÁÑMݵÊË®ÜéÉöYEÙam™G> QÇã%Á¿mˆ*þJ|ò•XªQ¯>Z®¥JQÔu åINœ}½iÕˆ¥W †¥‹¯NP¡Z5'Mò¹Np¤ùeR ¥VTùÔ©ÂqƒJ”êÓ¦åRXÃö9øã‹ üYâ_ëÉâ-BÃã?ÅÏ iz„V>ŸxkÃ^0¾Ó<=gz%­½ÂA¦Å båÑæ˜òË#’Åá#9p÷âëÅǘäôq8ÉI8Jx—‰ÅÒœ¥OHÒ|´¡N„"ãð&ÝùªT‹Î¸£ Fq– šN†E©F8oª`êÁFjî¤\ªÎJs”äÔ¾'¾° Ôùÿöbÿ’Ciÿeã_þ®¿ˆTôòíõøcÚ °ÿ„ ç*:‘ý£§ä1ÉW‹žªr¡•Æ­×£,û†”éSMÔ©ÄYZ•:j.-Îq¼b”¢ùš³OSÖÉn±x‹>V²ìÚÍì¿á+«ô>Uý¤~<üøÅû(xoàÏÂøwÅß¾'\|-ðO߇½·x[Ägˆ4 Ô¼×|-o:j~‹Ã–šìóO©ÅaFÅ"óBά~¶r©ãŽÆákÇçÔ3º˜êrŒðð˰óxì^&Ut‚öØ)Γ£¦&*½GìÃ×T¾g(«†Ê¸S±Ø5R†$Äe’ËjB›–/SS…ÀÂ…oÝÔ‹ÇF“…kJ‡¹J­ Õ©S ÞéðÂÊÿý¥.¥E–úÓàoÀ»(î›&Q Ôþ"’ñ‰ÎÙ¦°´vÏ$Àž•ád¾ÄnUË qNO%‹þ1š<º-=ÔÚ]Žœ} QÄp$+KÛW¡Ãy9Uwr“YÕ59^W“ç”ÝÛI½O=øñoáÀŸ¿µçÃßÞ<ð¯Ã_x›ãŽ«ñWAÔ¾ jÚoƒ´ï|5ñ.‹ [xN]ÄÜöÚv¦4ö¶¾³6±]µÊ´w aTþVÙ=Já\·J1ÃbòlvmC1 çV®7˜âq‘Ìy/Ï(æYáêÞ)º0[ÙªøokÛœ¯øÈþµ2Ž0É2_«ÕŠs§/ìü;Áâ©Ê¤ST§Kæ£N«„ªÞ¬°ê¬(Ö”>eøƒiwñ§áÏü»âçÂH/uï†~3Ö¾ Ûxnm"Öî×Nñêü·Ò§ø³ªèÖKûk‹hna}JÞÝÅØ³>\³¨;+^†Q‘ðF?5¢èà(qž'=­N¤5,¦¶3Fž.­ ÙÒ‡ÖhTÆU§UB­/«Õ•zp© #²aâ,N /å§ŽÂp¦/'©Ž¥Uþ³šâif•0˜t¢ßÖªàhW£ƒ §)§ e)`Û¥:|ÿEûSþʾ?Öþh¾½ð¯ÆŸx»\²¸ð‘àëO ø¿Äß eÿ„r{Ëïø’ÇQ¿†ÿá¾™£<Ö÷sK¶§-²ZHc¸H{ž´³ÜUo›†Ãfujæ4ýü5<²øëãÃá ãæ‹ð[À~,ðw¯Æµá_èkZT–zÆ£ya ŠèÃ}%Â-­·Cò2‰P|5“S†&¤ñY=eøü5Y©OŒ¥V½I¼=ï}Z¼$«®E;Ö©R³µVuý¬Ù×\A˜T©Jœ°¹,+ˆ¥FPŒð‘Áá°ë ^¦±ž#.©NX%;Æ3¥F4é©ÔÃb¹=Ã~ ýõÙËÅ:޳ñ§ö’ÒþøÓö—ÒõO þҵœÄ×¼;¶¤|FðŽô_ ?ö/„šãM¼ÓO‰<]g¦"Ëk{ºêÕâ¶ž.Š«K Âô©T\=˜WY¾;,§U¼n\Èž&–2¥\™ uóJys­GŒ…j•åV´’ŠPÆqL¤¥›áh`°9vl£'VŒ¨Pôéa_,ªâ'…©_ EÖ¡O‚æT¾±J"ú¿¾+xã¯ÁÏ‚ö¶ÃÛáÿ4oØë³h?‡æñ÷Âû/xzóQ‡Äz§ˆ<â-pê¶—Ó¶™i=ïŠu{Ûûٟ˵§2\IÕJpÌ*çØl~^Þ†U,w×(EF:”ëÇ ,L%*tÕHã#Zœ(ÃOˆuýúëFÇðbiK †Àbp¸Èûj™<$°U¥:ÐÅ?jñg:®ªú¤i׫QË“GUªJX/ŸSðGÁmÆßd?ø(ç…üàí=uÿÚþÌ_!ѵȣÖô/x‡V×¼ øcÆ7>/ø{¦ê“_ZGc¥øGûbñš9›P»7V×6ÞcÇbðF ­)CŠ0Ô(åÕpqUa^¾'õ|%:4^:„êN¤¾­gIÖÁP¦Ý:8‰ày+caíb°ñ̳Ìtq2y6eˆ­Š¥¯~Z1ÇÎþÓã[÷ sÆ’©YýmSq­õxÔ…°GÑ^+ø±­|9ñŸì·ûm|]ðíï…ü ã_€‡áÆs¦é:­úü+Ö¼msáïxwZ½Ñí`¿Ô×Ã÷Zõ¤šc)ÜZ½ÅœR™.&KìÊ… £Š¸›!u½–ˆ(åðÁT¯*IQÍrz¸éK‹ÅFp¡,&?F5!a¥_[:Ô°”ÝXxÔêbónÉqt¡Nµ\3Åâqƒö~Û§O.§ÂÂrŸ=(ΕLàê¹û ôÕo&íîŸnŸ‚^ ð%õLjžøÍñg^LJ¾ü6øyâ;â¯â_ê±´>³Ô´Ÿês\éú"]”šîââkbíà˜ÞÏm ܘÊج&…x¼Mz±æWP£O J¤.­LL­FŠ¥‡u*FS•½×VKêôq)vaêåôé¥ xgu³\-J¸aÄJN•<3Œèá(E9F¤ñõ9*F%ƒ„ñØ/ˆÆ`œ±xüV7Ú¥'*Yej,§pæ“…\WÖ=j’‡³ä£F”q|÷¥ˆñïÙ—Xø9ª~Ñß¶%„ß¼{ûEx ?gˈ~?ñmΡâëf]O\⇃º,m7‚mbÕ4ËÚê —2.—%Ü)_ŸÙàßq„±t*ey'ö®V©W©9¼gÕa–ca f3%í¥ˆ¡:U±˜ŠT¥8ju«BâäéOGŒ81aqTñYâË1¸…^Îjx·™e•¡KÍСNJ­ ŸUiº5«Ô¡&«F¥8q³|A½ý™|mãÙgþ àÿž±¹ðÏ‚¿e¯ŠKáïøóWÑ5K-'ÃÖ> Òïì55ñ¦‹ylÒÚ½§‡l²±ŠsÃâkP”©Íâ1xÈaeË:´ÕKÒËqº*Ôs,N†0õqu¯õhO å^´:ò¦áJ¼½ºR§b+Ft¡,FØú_¼63Oqeg=ͳÙ\Ïko5Å›º;ÚO$HòÛ;ÆÅâ‘™ ) ”È$V5áN•zÔ©UUéS©8¢M*ŒšŒÒ’M)$¤“I¤ìÕ̰•jÖÂá«V¤èV«JœêRw½9Ê R¦ÓÖð“qw×BÕbt5Ô:2À2²Žñ¸ ;d•‘°xe ƒÈ ŠüÃý¤ÿà—¿h RçÄÑ|^øÁáÿ;;ÙÃâŸjßü'bÍ’"¶Ò|[©ÿkÚ[gåÚø†Þ(ÓäŽ4p~úýðÏö]´Ò¼'¦è¿u¯‰qëš-µ¶™ïÃÿÚ»ö¶±ðΧcivö·vžÔ¾-¤¾}‘l:LwZ¼±y7²1[yX6ò±èðÍ?¿ècý ?ñ,jþ|”Ã4ü:ÿ¡ö€ÿıý©ÿùòPÿ Óðëþ†?ÚÿÇö§ÿçÉ@ü3OïúÿhüKÚŸÿŸ%ðÍ?¿ècý ?ñ,jþ|”óíÁ¢Úü:ý’¼KðËÁZ‡‰o5OŒ^5ðWÂÝxßâŽ>!ëWZ—Äé:v¡gk¯|CñN­ªy#C±Ô¤K%¿[h‚O ‰“3r¬% Ï<á—ªK™gx)b•.u8ap–eR¤¥åJŒja(µWhF5T”ªE>ºX™å¹ogðï,Ÿ'ÆÖ%%yWŒp4“Qiâù¡}ãÚMµ÷vŸg¥x'ÂvZ}²%¦‰áÛYÁœ%®• i©HÜŽÒÑFIè¼×FyšJ1Íó¼BçœV+U_—™¥R¼Õìùnï­»3ÎÉrÉQÃå9=^jTð¸:vÒ7ŒaB¾ÑºVìÅÿx‡â'ƒ¿àŸw|7wãŸ_´&½ñ7ã'Œ<m5ߎ|ð‹Ç<¿°ñ7‹|%$6/-½ý·…4} éyk%¬ÏwÀðÄ`xº +§á§æxùÓËrì˜bððtÔ«bpõó<<&ÕIË J¶3CZ¤>³)TŒ(,61b^·T*ÓÇc|IÎ2×,~"u1ŸØ°¯% ð˜5Fª8rÓ¡J…Eâ¨5V¬*Ñ(V¥æ6—¿þ#üiý“ü3ð·â×íQûExtþк?ˆuŒ_|Sñ#Vðƒªø?AÔõåøcá{oh¾Ó&ñuضÓu+—mk˜­nmcŠòHon-àïÉ^'ÄX*³ÂSÃS§“ñ\=jŠ+ŒæÀ(*˜^nwõ<zU§MQ—ÖåN5OgAÒóógþ¯ã©C*•q¸ü› W”,.®1Ò­V¥”"±ê«a°ŽsÄ(†.p¥BiN¿º~ÑŸÿg+0o¿ÅïØ³ö„øm¨ÞxwáWÅ¿j—ß¾E=õχµw>ð]Αâ/ßké$·š¡{e°7ê0[xx'7KûG'­R†}‹R¡ŽÊ¥GÛÁâpµ—ÔÕl-IÓÃãa]F‹£QO ñj•(Wö¸<>_^~æ.ŒZX,nëù,ha¥†ÌT¥‡•*øª4ëfXl"‹jœ¾^¤åÔé,uJÔ(CV§/èŸì¥âŸ‹3ø à?|lÓ/tψwöº˜ÔŽ©áè<#«êšm¶±¨[xw_Ö|)mq,^ÖuOæß]éјã‚{©V8adQûÙ…:T§„ä£ %z˜<L^iâ)á1³ÃÓ–/ N½HB¥HR¬ä—´„jCøUcš^.§´ž;ÙWx¼1U£‚ĺ~Åâp©¯g_ÙéË Kž4½ú1§QJ¬f«Tüøý«þ'hšgí9â_ ~Ñß´‡íû2|*Òüá;ß‚_o¼Uáí?⡨ Ûâψõo x3^ŸVÕ´ýItËH-fˆCi’C%ë­ç…•'‰žsM¼F#<Ž>… ._N:O<2xYáaÌã^¦+ëS•Y¬4•x¼,e‹õ[0‹£O!úµ8}J¶ S]¨óC o³…>nk,¥UÓå”`¥–¢ë_â¾ñ ‡†~ÿÁK~+x{Ãÿ¼3¬øŽëÁÿ 4mâõ÷Šu‹ë6¡á;/ iz§‹åñ&£}«ÿÂC¬ê7}Ia7°îŽ?Ñ­a ¶&†'3áL"ÃÐÂÇÄœaÂý^Œ¢°ÐŽ#0Ë=®s唥<.âá‰uj’ÄûuRu'9Îk/­G Æqÿ]Uð|-Ãxlu,f&ð…iað˜ì\ñõeWÙCꘙåø'†Š¥…¥õHÒQ¡JUeö·íWá~ÈŸ?fÍ2 -!ø…ãOÙ÷à PYÉ$wX6³£]ëóïUvgm/ÃZ‘šW fåÞV •“ØÅÖ†i⺩ÔÀÒÎkæ³§%Ò¥•ä˜|N6œaNÎ.4}Ž • $’‚‹Š‚<œ›ëYWgXþuK3ÂäU}úÑŠrÌsYQÁVnœ”cíêÕÇâ' Q‚å«ðRå‡*ý‚ía†ÞÃopÄŠªG@T :W IÊ¥IÔ›æœäå&÷rní¿VͨQ§†¡G IrÒ¡Nàžê0ŠŒuòI‡ßþ*xrÚ#ã.‡ûHþѵÿ¿h>>·Ò>üýŸux{Cø¡ðÝlí$ðtz$ðÒøƒÅ>(ÖŸQ²’òãVÒd7QÚG~‘Ú#iü9,¥W.§^ù¶y n`ñù|” ¨Ç UJ…(B& eñ†!â!Z…ZØw,[ÃS”ã‰Æwæ´ã|pê½<¯'–[–Ê–a(Å(V¯FÚ5ªIB»¨°¸®eyaër8Ê‚U/«PÕý|]£ü.ý‹>%|A¼ø⟈¾ø¥ûG|P_Œ_æÔ5½_ÅŸþjw×^ñ>«â¨õk]WXñ5ï‡t}ín綸‘¯f¼º¿µòç¸5þ§W ðÿ(ͪҥ•b²‰Ó­˜aSXL>!ã1óÃâ)<$hNŽU)Rއtêá•*ÃF¦+ê¸yá†úÍ\÷Žqù|*ÔÍ08Št²ìºp¾/ãGåõV"¥HˈžaŒ­ˆgV•NiМ ¸ô_²ïÄŸ [ü{ð_€¿cŒ?~4~Ï7–ž&Š>ñ߇<]်e¾—w7‚|ãÝGÕt >mBÚßI°ðÙ}en ¶Ô®.%–åcšß³ñòÃf¿^¢±¸<&\ê`qµe™ftªaiRË•H¯gЧ[¹}œ©ÐŽ] tëPUiÕź<¸ß©Q†x a3*øºç‚¥íg‡­ƒQœ±˜ÙB|ÑÃT…YÔÄW­Ëëx¬E<´áN†¿•|JøíðSTñ7м}½ñÇö-ý¼àº»Ðõ…> Ð8x»ÂzÃøIÑ|Iãq¥|:Ñôƒ¯%–«y`Ókà]ÁÈÐ ILƒ³OêøÞ9Ç`åO³*ÀdØZí{4ñÙ†/ûC IÕŽ¶-¤¥Uª3«MPuiFW¥OÎÅVÄVÈ8Z•JK³Ìæ®3‡©Ë,RÃåT©YþåÓÅcéýg“ÚRöÑxxÖ¨¢ªOóâŒ>Õ¯> Þ|xøáûlkµ Ÿ‰~!Á©þÇ µß‰žð6£a¥Ï©Ç hº6•àÿ YÅmàø| ޝ}¨EâM>æk;;ëé#¹’_ø˜ømF¯ S­O4«S'«<Ê®aJ8eXÖ£Œ«˜Rsœ0Ø|.¤a*ÓFTèT£N©—áýºŒ8£B¥g–åØlÖ”rê˜x¥_§õz˜HaùWÏB­©N¬êÓ­íàä±Òí4ÝoÀ_ÿcOø'U—¯ßDøUª|YÑþ'ü@ñ%¾‰¯kÚuœºJxÃâ¢^Å¢éÚ•Ä“]ø²óJ¶þDÒ:iW8 ¼­Öâª*Ü}ÂxiRö•0y ªåñp¿ü+O$Ëòì¥Ëâ]L׈„ýÅJJUHTTý§Íàib1<+ŵ¨Â«šfËŠŒoËG+þÙ©î s”£ì°™^êT•FÝYi,EZr‡±þÝø7/í ð—âwí[áx“ö\¸øQ¯x1u½ºƒ\† sEI‚1 È÷1ÇæC‹f’ßç0‹‚Íxƒ™¨ÐÇãéeÿÙx™T«(V– XÈâòšQ¦¥‡u½j™”jN|Ò£F²¢§Ö•?j­j˜Üƒ%«–/mK ŽÅb1©rÆRÇápT°•¹*(ÍS†"’ör¸sFœÚ©V…õ¾|ýüW§ülñßìƒðÄ^ÒáSøÃÁ_ >>k¾4ø£m/Äx£BÕ,oáðGÃïjsðÆqŸxQ{'{ÿ6ÒÞÔ}’âxë<Ãf4¸OÒ,'Šâ)Þk֚ѣ:5Öeš?¨dY}:µÜjNœ%šOØÖ§F1m9C-¡ˆŒçÄB¦¬eƒ©J5è·FÞ µ©T¡W.Ëù±yæ2T(Òt çO.‹«â*×Õ)ceCÙC„öuá]ãiÇ“[Ùø¶‘ðµÿà _¼MñöãâoÅï†_ ~ꚇÃÙÃ]ø?âû/k~!{¿Óþ$üG¶Õît=Bk}3Z»–-.ÝíE³Ïi¦¦b#xÎ9f¾,ç,F1âhÆTð’ç èdt¹eƒ¥Š¥'ÍíqX•S:aB¦pJ¤1Þ´6ÇbãWò~(üZø£§ülýžüN‹¯|hñŠxÛÅGÄ_¼[¤j ¦ÚëK¦Ø¥[h:¤òÅjðHÑ=Íˬ»%(½YF#ÚSã,£ê¦ðÐÈó¨â)Å/iW”Ô§YßšU¢êPq©ecSwtârf´hÑ|%™:õ^*¾+7ÊU9ÔNŠÃ¼3Š¥MÅ8ÏÛaêMµ6¬ç˹T”»öÛðgÂ|QøeûfhÒ|4²_ëúwÃ_¯Ãx‡á¿Åß…wÖ–’X [Í2ÇÄ)©ø’ÎÃQKm~Ñã‚Î9/`‰;ÏomçÑž •У‹ŠY’z9–½4á7 V&•hb©c!Šžj\ðЧSÙF*–#çÿ²]§GeâMSûZðGÂÿ‰Ÿ¢ñqiº×Ã/ë–6¦Ñt‹-cI¿»°²Ó-㹆âl¯7Ÿ©úøX¼WœQÌù©PÄb°•²œ-y{LU)Î5êãñ±nr6…\ ÃÓ•£R0£ìùéááC.ò±²ÀÕÆå2ÀÓæÍ(ÃÓF§‡ú’£‡†_—ÖÖ«c¨â=¾..%:4«Wœñ|ØéS¯ú›\GIùÿ¦xŸDø=ûy|M´ø}§ønÃöøuð©¾xƒWžßOÒõßü=ŸWðεà[]Fîd¼O4¾!Ònmôñ™.VêÝb +¤r,‡ž®‰²XÇý» ›¬æ()º˜¬¿•`ðÕ«%ÉË/¨×ËjÅÓ„çVg_(B„g8ÖråpÆcìåõ 6_˱ôöxlW×§˜S…g{Ò…\,œ£Zj4e8ûÍÕN+Þ¿hÚ3ÂtïÇi'мoãïxkÂ>øk¢_[GãË«ëºv›¬_èÚ|‹#Kk£é—“ÞË4Ë ©™-,¥»¶“Q†J¼úîo—e¯í1sýýH§(à°ÞμÞ3•¹0ñ• )I¸û‘­V<ÐÃÖåUÜ0™ne™×—²¡€ÃV«N-ÅOˆƒ¥Nާ({ZÕkb(FQ§í*Ó¥9U*®1¥SçÏK Çÿøö¾:}&?Íð—á“WhWT‹Íñ? æÞî*I«ë-áY¿iw¡i‘EK2K}'KS*ˆ?³­Š€aB¼8 µ1\sõœDåR¾/!âÚ•¦Ûæ©8`©Î›¿¼á*•9¯Ëí*(ÙNWáÇ9ax*Rq‡öïs_^yO1’IéiTŸ´¨ç6¹œ§)_™¶]ý•¼ᛯŠ·v½u£XÝêž!øý¨øKXº¹·Šw½ðÞŸà_]A£Mæ!Ý`g×õWxOÊæçæjãæáBœ|6¯C•J–cãj¸ˆÉFÕ\s¼Ó NÉsÓ§N3öq©ÍìåˆÄ¸4«Iæ6s¥Æ/Nrl&OÃ^Â\Ï÷-àÕIJ’mªr©*t]YA'SØPSæö4ù~bøcà_ ißðH?ˆpÛhZ®µðßã‹õbÖ6õi~ ñ šF¯xé ››ý9t +[‰wË z-’+âÙ1ëñ”äð7 òÇ †á9RIµìå‹–[_(ëî¼E\^&Uš·´öõT¯É>̽F—q¯±‚ ©fÑÎŒhÔ­ %ZŒÿ²Qñ§íÅûNéþ4ø¿áŒ6? <Þ-Ö|á}ÁúF®éÚî©euࣧh×·MªÜøb-t³¨êSK©Œׯ9à1¯‰€ú¿ú¯ÅÿSUjaiæØÓÆUJ/ÿ Xç,b§M,=V|ð«O å‡xŠUªBNS™éfó…ap£ZYcV88JN8:u3, hЄªÚ½JMVXš5kF5'CJmrN—ðgÁ¾Oø&í uý‡¦µÇ‰ìi]w]¬­„ú–­¡xƒÅ¶š-õÜËÉ=Í„:&—öi$fx œf6]ƒnmJnàjÕ¡G+áÌ\n—ûÆ#„­:Í$¢ê|TÚæt(Ñ¥7(ÓGÑå°U|Dâ¨Ô¼•|®ÿVžBT“æ7íëÉF-(Ô¯V¤ygRMöZ„º4þ:ÿ‚Z^üGTž‡zªiSkðîÐ‡Æ Ÿ†~ ÿ…z$ócþÏÄMqãhßh (½‹u–.QûœTãbqÿ,áAåxïìÖ’öÊùÝ:™×Õ¤ýè¹eð§õ¯dÓ–8T¼\"þ -öÐðó…éÒäYU,ÇO7RåæX:y>eO,Zûï ZkÕ×/±x†ðþÝç‹bøüßá]Ö‰>ˆ¾5Ùóâ$_Âka ½½Æ–þ›ÄI0ß6™=øŠK“ç5œ¹ÿGŽÞ¾?(ŽU¼F¥í2Ù丬´ã 0ÅË2£ d¥RÉF²ÁÇë';S¦¨ÍÆ.r”þ‡9ö¯ À°”y«,ã1ö)Å:¯òªê’Û–ëKì’ýß·x®OÞ:ǃÙü7ý ¾ü$ñµÏÁþË_µWìYieâOGà_‰–úpº‡ÃÖÞ,ñ½ã h¾)ðúKá¿OkˆæÖ|S¬Ý·:s$zM§Ù>Íw¦?S•`cÄØí*9\2¥ ”é*xšø*ÁýV½<4 °ñœd–/õj¼UyÆ|/Ö±U©a_¡V\Ó?ÌëeU¥€Í³jØÙbhÔnTá˜â`ãR•NNJÊ2‚…/e9á)B•ySÅIS‹Æ©ÿñO—-§ ây”¯V*¼3\\ó ÊQjpÅB1ÂΜé5RŽTj ÷q2ÅCª<–+êY Ë4Ü—a-Dã*òÄ5d`_ ¦œQÄ|Qñ_û½ö!ðwìµà¿ø¿T×u_ê?³V¿ñ»Zø³¦|2ðVðÿAòïµmGH¼¾¶ñ‹5§°˜YèI}ì¶ìË}jBGMÞÞk[‰¥Wž•ËÏ^½gÍ^®[£†ŒpøZtù—Ö±)ÒÄc1Ö)ahUŽ#JøŠ´<åK.§Ã˜þk×ËÖ{„Â{iΟöŸÖ±õ=½JòRÕ¨â)âi­ >"­XGë{açÌxüL²ÿ‚|1‹ã?Åÿ†>;ø›wð;â :÷‚~ø^ÛÃú7»i?±µ]3Áé¬ÝÞÏâ/Ù^¡º×-á$òn¡Iæž#¶»Flò/«û~3ŽUÄFVUq“J1yg8uS©Ò^ÁK/÷({dÞ"µ á–+–¤"ˆÎž*~ úˆ•|ß0– I§åšOUµI}sêÿ¼Š°¥ˆÂâ)P”£J\¿@þÇú&™ÇÛ»Äii ë7ß´%®‰s}å§ÚLÒ|¤_XÚy»wˆRëZÔ$Ù»n鳌Œžœ—P¦Ÿ,qŒšZ]Ç6J._ÍÊ¥.Kß—ž|¶ç•÷Í¢Ÿâ$Û~Ï áµÛjø:®§$^u}/jⓨ¨ÑSæT©òò°ö‰¦iŸ²wÅÝFÆÒ/|Eñ'öÔµ‹„[Û»Okú%´“HªO/MÒ¬¢PŶˆÎ0+Ä­9ÄáJw´!Á ¨ì¹¥ z”¬·“QŒ\·q„#{F)z˜8¥â?M·)­4àœ›n4à°28Þü´ã:•j*q´Jµj[ž¤Ü¾Kñô:­Çü§ö·OYøÂ3üCøUŽ%üø«gâo€zÇŸø(&•âˆÇÅßj 4;/ÙcÀ¶&ñŠ-µ+¸¬<'¬ü?Öd×4Û Û¶÷ú…¸:|V·ˆú‰6åU¹ð*~'ÊÔ°Ò«œàÖ=ªS£UàㆩÞ†*mrÒÁÔÃFPĬZúº¯<ù^.–Çlb~̹kÓ£•U†*ü´êÒ†&u¡ý•W ïSC„ð1Â?­É*ªƒön±ë?±Øð*MûhÅãxü-ö‰ø§/Åñ¯Åoùø{pe“ÀïâgÖ”3x ¼)ýªöi:o’ú“C÷îIáQÁÿÄ?áˆâ•8åRÌ#š)ZµÞcŒžlñ6·ûcŒðεJŸ¿qö*Ræ‚Qô1þ¹fÛýiO,þÃöÄþÊYVT°~ÃÙûÞÝbþ´—ïþ³Éí?wõRÏü.[~έ¿„dŠo Añ§ã >š X%ðô^/¹MHešX›M[fWnXO&»0ïøg‚9Ôxç‘Ñx‡V*}¿×±þÕÔ‚Œj{Nnx¨ÅFW\±µ—WEñ¼2¥;ÎêºJŠ‚¢©ýCÉìU?ݪJ6öjç%¹}Û¡u‘¹óÿìÃÏÁÝ2Uæ+¯ü_¿¶qÊÍgñ‡Ç—¶W1žñMi<2¡î²)ï@@P@ûMü0×þ3üøŸð·Â×z=‡ˆ¹Z*®-*‹ÛÍ)VµiBu—´•çj³¥Nu5§*p”®á™ãŸ„_ þ'I¦Íñ+á‡ÃψShÉu‘/Ž|á¿I¥GzÐ5ìzkëúeÓX¤íkleXJ ¼Eóå®!S§’ª©Æ5gÂSQJr…79B2•®ãR£Œ[´\æÒNNöç>HÒç—³„¥(Âï–2šŠ””vR’„šWjNüªÝ-ç…¼1á¹¼áÍ÷ÂéðÏáKÍ#O¹ðÜÚµ#D›CšÝ¬¤Ò>Ä¢ßìm‡Ê=›+LCxÉΦ-ýj¥JŠ´å[÷’•eQUUe)ó9TURª¦Û’¨”ÓæI™áã:tp‘XJTiûp¢•(B³t½”#U~ɺ|‰(û6án]oÀßþ|0}F_†¿ ~ü<“XKhõy< à¿ øIõD²3µšj/ i¶¦õ k›“˜¸ŒÜHSÛ7íjû/aígìý¢§Ìù9ì¢çÉ~^~T£ÍkÙ%{ ÙÓç^HûHÅÆ3²æQ“‹”T­u8E´›Œ[Ù[/Røð?Yñoü'ÚÇÁ¯…:¯Ž¿´,uoøMu/‡ž¾ñoö¦–¶Ë¦j_ð‘Ýhï¨hZ- ‚ãíd"Ö/”»c Þ JXFð’R©$èþéóUr•Y^¯š¬§7Qï799]ÉÞë´ÆPÄ~þ‚§(Ô÷Ó§*qƒRºpŒ" ¢ýÕ¢•’G§]ÚZ_Ú\Ø_ZÛÞØÞÛÍiyew w6—v—1´7·6ó+G=¼°»Æñº²²¹V+*Ôhâ(ÕÃâ)B¾¼%N¥*‘ŒéÔ§8¸Îœá$ã(J-ÆQ’q”[M4˧R¥”êÒœ©U¥(΄œg ŧFQiÆQi8É4ÓI§sÍ|ð7à§ÃZM{áçÁï…¾×%³—N—YðgÃï ø_V“OžHfžÂMGCÒ-®ÎI­­Ýà2f·Š’ŠGDjÕ…:”¡Vq¥[—ÚAI¨O‘·x§ir¶ÜnŸ+nÖ¹Œ©Ó”©ÊPŒ¥I¹A´›„œ\‹jñn2”[V|²kfѻㆿ~&XÙéŸ<ைnto´ý?ÆþмWca|н»^YÚkÖQZÝ$’3,h¯±Ùsµˆ8:TÝHVtâëSŒá¸®xÂnœ#+sF3•:nqM):pm7Ûe9Ƥ§(Ó”£)A6¢å% 8ìå9¨¶¯9%e'vh ~xSPÓõo |=ð?†µM#Ëàí'RÐ<' èÚ†™á½þÒO é÷šu„3Yxquô¡¦Béj&ýè‹Í[ûj©WµšŽ%ЕeÌíUá©{ 3ª¯ï¼=ÜÐr»¥K÷tùa¡—$(ÒåJž¥j´¡eËJ®!ÊUêSŽÐ©ZR”«N)J£”œÜ›f—ð#à~…âÏøOtOƒ_ tý¾ÿUÿ„ÏKøyá?ÅŸÚš¨¹¦¥ÿ ¦¡öûÁyv..>ÑæMö©¼Æo1·F¼?c…o GÙ{J_»‡±I%K–±öIF+ÙÛ’ÑZhŠ­þÑ)OûùÊj«•O}ºŠ\ê£r»sSJjoÞR\×¾§«R € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( 4ø­ðsáÇ Íோ ÑfÜa&­Ï7Ȫ%xƧ/´Œe8ÆJ5&¥Ö|lýš>þÑv:U‡Æ_‡ZGŒ×B¸kúK­_C×tíé"Íkiâ? j:v«™1póX ß²Í$òË Ém ÅÀðô~°±\œµÔ78¹EÊrp…E•HÓs›¦ª)*R©QÓåu&åÙEXQžI:2OÝ”a5åJR.xÉÑ©/cN3©I¤éÇÙJNœ¥oá¯ìñð_àÿ€µO†_ |¤xOÁºä¾¹aa6¥6£®GªÇuãë^%¿¾ŸZÕîµäöðÏw¨M-´\Ï0D‘ë™F9¶¶YŽŠ«€¯B¦¥/aMÓ«BjºPö|µkQ„#Z¼m^«Š©R¤ª.s'û29†÷xÈÔ¥QU~ü”¨KžŠýç2ötæå8Ò·²RIr^¥G+ÚÀÏ…š¯Â[—þóþizW‡4K ÿmøŠ/#Lð•x~Ûûn ]5y~Ëy¤iòy’_´’ýŸlï"ÈêýUñXŒNc…Í«TæÌ0Xª8Ê5yb¹18áTöqJœ¹-ðJ§/µ‡§ % V½en´nß=ÆjXÈ^W”}µñýïµhŸÚן ¼[eãŸÍý¥«Øbø§N³¼°³Õ<½2þÝ5.Òþî?³_-Õ³y»šeR¸Ñ”°øØæŸ&28|fTÞØ|}8ÒÅÓä•áûÚqŒyœyákÓ”lš´)WÁ,º¬y°q¯ƒÄªwk÷ù}_m„Ÿ:j¹©ïrórTÚ¬g ¼'ðëÁ¾¿ñ®§ámû.÷â'Š.)â×µ†(R_,råA`ÕáÊåìV޲mÔäýëŸ4ù´…j”±Xìl%ˉÌkãq‰Ù?i[0ueŒŸ+NöνWËN1>oÝF 1·ñKöBýœ~4h> ðßÄφg‰tχÚm¦á ±â}XÑô{4°¶ÒWÄz·c«Þé‹odÚÞ_\DòƳº4ê$),fg‰Îq K2Æsªõ’TÝe:²¯j§ËNJjUàÖÛWT=œkÖSçÂB8· ”aW³Ë°1§[söQ¥J4b¡:ŽUéBœj>{ÖöTW9R¦ãáWì­û?ü×cñ'†úoõ•ðŠxâïGÕx†ÛÅvzdžÿ¶üGqö»o]j¾'ûbëW“U·ûmΫ~û ¾¡óöÛ˜•'%z4ñ8<_Z<øLº† ‡§v½ #ÂÚ-N^ËÙÃÞœ¥9Û÷’Ýû¨â«áóNmJ§.a‹ÄÏV¯,_6"¤TgS‘§N7ŒRäŒ#k¨§q|Uð+á'Ž>Ú|ñô¯ü5Ó´3CÓ¼7ªIsý›c¢Ø®›¤É§kyý©§ê¶–Kåê[ßG|›™–à;³6¹ü*⥎ǥ_ñíRösyIÊsƒ¥ÉìÕKÊ!ZuiNtjFTg8K—–a–ûŒ2¢ðþÎî¤]-„•G>~Y(Ô„¥yB¬)ÕƒJp”x¯†²7ìëð_TðÖµðÇសá=[Â6>&Ó´MFÓYñ=ÝÚ[x¾k)¼@uIµMrå¼Csqýa]jßmžÚ (míd‚Ö1¿Ö«©V’©Ëíð”p3ŠQPxl>"XºpPIB2úÄZ•¡×­'jÕ*E$³žGAÎÏ ˆž*“nW…j˜ªÉ§{¸{(Æ‹nŒ%9Õ…8Õ©9Ë×àžŸ±§‰|osñXøáÙüMy¬[ë·ŸgÖ|_§xrëS¶x$ón|¦øŠßÓÛÏ, %Õ«é-oxòÎ÷qN×3yp©e”èÑÁQ§J†J4©J«Jœ2TáJª8Ò¦¥ËF’ЧB„(Æœ)ÓQéÅT©•Yâg)T®­Rq“§RO•EÍÔ¦á?k+sN¯7µG*“›©)Iýkkkckmccm•œÚÙÙÚý­­­¼k ½µµ¼*©Dˆ‰*ªª…P¶©R¥Z“«Vr©V¤¥9Îrrœ§&Ü¥)6Ü¥&Û”›m¶Ûw1§NtéR§T©F0„!BJ1Œc”c’ŒRI$’V>lø»ûþÌÿüS§ø×â¯ÂmÄþ*ÓbŠÖÓQñ‡ï/ ·0huÓágNOE[ÅI«%êÅøc ކ,*xÌ=(BµIÓ©5(ÆtªT¤ýÙÔÃÔR¡RrV…YN”jp§J³©N•8Ç\Lç‹ÂÇZ¤ÝB¥8rNTªÓ…[¹Æ•zNé%'*”ýHû*³©V—%J“œ»Š³§Á> Ò~üJøq xƒÁÞk3áí¼ð÷ü#‹§Å½¬>Ô<3u§^èËiVÍŸsm–ñˆ$G‡ä£JÌe<ÃÍ_EÖqÄJsuŸ···ŒêssT…iF*S¨å Õ¥F´¢êÐ¥8y}S <1¡„’‚taªkÙ6é¸BÜ´ç Ê1œgT«MK’­HˇøiûþÌ_uï ø§áŸÂ7Â>$ðañ Ðõí?]ñlº¹ÅŸ`Ö-µÝBûÄÍâË&µ%-­u×Ôa±,Ïc³±cÙK^‚¯SäŽ' X¨Ç–t#‰XÄ¥¹}ª¯KëúÃ…:t]_aNãÏ<=‘ŒjSStñ1ÅÓ”µ©J¼(¼:tj¿ÞQ„¨Êp©F”¡Bª©UÔ§9U¨åíøkàŸj¾8Öü)¢ÿejŸe:u¥Vª©JIÒ”'*NÍòCðƒö#ý–~x¨xßáoÂ='ÃÞ,ŠÖk;Mzÿ[ño‹/ô¸®cx._E“Æ^ ÕWC»šÖYí¥º°[iä·¸šÝähf’7饊ÄP£ˆÃÒ©ìébùU)›r9M.dçË9ÑRTªT§F¥HJt(ÊTÃÑ«R•Z‘r•Ôbå?gw:sSt¹½”ªBT éU”J>ú¥8*µTö>)~È?³_ÆŸèß¾'|%ða¡5¡¶ÖfŸXÓžý,e¶–ÎßĶZ.§ggã 8E¤1%¶»o¨Â°y–á<‰¤ù°QŽ_Œž;ÐÄÎQœ¤¢¥R Qoe5*^Ý&“¯Éíš§E9¿aGÙõW©S‡†´å*4£8A)8N¨ù¥UƒXÙÊqŒf£ “©R 3«RRô¯xá¿Á êzW„4ëøR]w]ñn¤—Z½ôš|:ljuÔu›÷¼×µþà ÷ó³X­¡Ü#‚(Ð* Œ¥ 6¤Þ- °ØxɹJc:•T]I^¥GÏV¤J³Få¬ÚJتTã_ˆŒ# ¸êÞÞ³ŠQŒªû:toqµ:qTéS‚…(šQÒ)¶ß ®ü\´ñÚj^ø®éþ*ñmÊÍ¥ê>8ÐLÿ¾y€Ãy¬øƒ_·i4»ÿXÄþm—„ ¸ŸQ»ºkOµÁg¥½Ö¥f‹=wÁÞÑ|á? x+ÃIk øKBÒ¼;£Á4Ïspš~e …©ºº—2]Ý´P+Kq!/,Œò9.ä“omò:J( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € (”ñίâÁþ"Ö|áøO¼Y¦iWW~ð_öþŸáoøIu8“u¶‘ÿ ­–z7žÿ/Ú®Q£« V‰Ö¥N2¡Cëu(ÅÞ4íNu¡ Õy¥tý…)N·'ÅWÙû8ÚSLÖŒ)NmU«ì ¡VJ\®wœ)ÎTéÚ:¯kQF—6Ðçç•ãniw·zfu©éÿÙ:Í…¥Æ¡¥}®ÿìËÙ­ã’ïOûuºˆ¯>Ï;IŸ '—½@VÛˆ…XŠôðõ¾³BIÆnISö´ã&¡SÙÊò‡Ð<[áËèõ?xŸEÒüC¡ê1+¬wÚF³e£§]¢Hªè²Ú\C&×Ue݆‚åP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@òŸíËÿ&ûEÙ,ñ?þ’W‰Ÿÿ¸Ðÿ±–Mÿ«| êdÿïu¿ì 3ÿÕn,ø§ÆŸ|5ñÓöªýšü ã[¿·ìW&¥â¯è$Ö¼/Œ´¸5­Ò? k÷¾»µ½¹ðü—÷ÖW³ZGs™&•lKá ·Óbpt±câ\L|.y\–n^Êx¿íLÎXJõ)«)¼©ÔÄáåÌ¥K <ÒœH¿À×­C‚¼9… û×ÄbéʤRö‘¥ý…€•XS“MGë‹ÃVvnXZÕéÅÆSŒãîß±g†l~|Vý­¾øNïWO…ß ¼mðûSøyá½SW¿Öað…¯¼Þ"×4m*ïUžâðiÍ«o™V[™2Îò¾ë‰î'¹XLE|o à18ʯ‹Âgî]ÒŒÞ S,%rF Ç Ó„N\¯{(ÅmŒÃÇÄr… SÃf9SŽtc~Zx¥[„ÄÖr”¤çŠâ|«‡„² 9 T2¨§ jÇ1ú8Ú2UåFñ‘‹£RµJu(Ðú­XÏ ŠÆÓÄN)Ë •`óŠUêoQÎ0¹}<|¹g^Q̰XêØšÕ.•%ZœrÙÖ¡8Ñ´qµibðØiЃGÓt¯ØŸâÇí‰àÿ–šž—à]öOÓ¾?xsÀ·ú¾±â}Bø¥Iâ/=õŒZýíÝôÑÞ®™eqwæ_–”B!f0[Z%Ÿ5lÃ>âHËyäüC”åø ²§OŸ G9Â*˜‡ÍËË(ÒªãVœjÂ¥8{>g J¦&UîŽø·ƒðÒÂÉÐÌ2\׎…OÚc]šQTé¤äíZt*TÃPö|Š2©uz““ù“Bøñ³Æ¾Ò~&Û~Ã?¼Añ»Å^±ñ>ûTZþßѾ ÝkºÆ™Ηã=7EŠâ +H·ŽÊ{k{] éê-´è¢±gó"3×v3 ˆÉkWÀä±|?ŠÊæèÓUÌùjÑ—-u–&SŽd±²Xæ’s§õèâ1N•L;« ÓáËñt³:8l~c8çt1Š‹û/©Ç’V†£'ƒx;Sx:u!QágF”j¢§*oìÚ§À¿´þþÎú·¾ë_àð¶‘w©þÔŸ³·ƒ¾!_øûUO Û2æ-_ÁWrë°hÞ*°›R]AmFK««›5´µ—ÊYm3Ì\¸‰âÞxŒ–¾Gr«?ì¬Ã[çR8{FxÏaN¦' J­IB4aNuªV… ÕåS¯'Xš\;‰ÀÏðùÍ,ELMIEÕÅåØG§ˆ£R¤mIUÌ0ï V´v§>hÓ§í•*7öVºø/øëð‡önÓÿho٣ⶻðÖûSÑ>|x‡_°Ò<'«¶’l4ï‹Ó|G>½wm$úέ¥Åy4úÉ–æ=6ÝÆ˜°[Dâ3æÞÏ)e˜ØæPÅB”bçN–/-ö˜xÕ†)(Ï C0J˜Ÿ~®"®_뫇§_ í³ËgÀñA‰ÍpÃR®¡R¼aË ™F„ñœ¤—¶¯†¥…–”œ0ðž5! u*SÄû/“¼¢üø­ø[\ý¥ÿgŸÚ¿ögøÙáøpx§ö³ð¯Œ¼iñÀ¾/×®,mu _Wñgç¿Ôô9l¼eªKi©hÚ>‹¯þêöKi/Ðý°[z8Õ>Ÿâÿ‰>1Ð~!è±ÿox–Òã·—$Zv•í:H’@ãÄÁá§:¹Ìá‚–/1Ž2L>7RXLÇW(§RNt©Iâ éÃ2Œ#V¤(SUp˜l-:ºª¬ÿtñIÖñ?‡=ø©ðoöWý²|£èÞ%ø9©x7ã'„<à_]xúOŠÿôß‹’øKLÔ¬<5ã{¸~Õk¦C¯]jZ|ÖÓ£[]Þ å–kÃq<þ<÷ À¸ Ù”ëO5âlFE[NšÃâ#ƒÀT¡8aäÒ4èòUÀ{gT¤Õ:Ê‚ÃB ±r<Ë35•F42ÃçtòøJ5)ׯ<6:Y”jFµ6±5£G0ÆBtêARZu)Ê0p=ö¢ý‹~þÏ_ ü â¿…¾/Ñõ¹¾2|Ó¾)Ýê¾0ñˆ"ø¾%ñαk~,ÒµJçO¶ñ=¿‰Z=ZÝ*ÛNX¾ßªÛ¬~MîÈçˆXn,àl K’TϨB†[M/«àe 6&XzØYJ3­QÃQ©ö~Ò4êP¯ÏQ9áè¢s^Û…xÒ¾:¬ñY”2lUWŒ»…Jަ"‚¯J¤o%<=YTgóVU°ØYºòq«í»ÛFûâOÅÚKFýŸt¿‚ZÿíðËß,þ%x“á.“ñ³Mø¥ø›YÕüY¨h¶:犼EvñÝxŸIÑ$Ò´÷³Ò,n-<›ùÖòf•#;Cë•óÜ~# ñɱ<r¬ãKS„úåLJÃEÅ×ÅbiÆxZXšŽt°¸zXª4é¦6u'èãªÇ †Èðtq2ÃWÍ~½Š®£EIbðø:˜z°‹(Ê4V´Þ+B<µ1ÛU>\#j/ÙÇáíEàüKð§‚>ëß²·ÂO|ñe‡†ô oöŒð÷Ç_ øGã2£/…<]á(Eíαᗺ—P½“TÉ¿·º{Ki\ÆÖÐE[ã6¾GŸ`¾·íkÆÙDyUô&¦©ã²úxÊIJ8\m9¼UVýæ Mj‹c*Xàþ©†Ï8w<6–.K7§'G†jHb*Ð’æ–.Õ©à£(MÂxJÊéSußËÞÑ~üÖü-®~Òÿ³Ïí_û3ülð¿‹ü8€ €9ÿø«Ã¾ðλãêÖš†<3¥^ëZî±|̶ºv™§À÷W2ùjÎûbC¶8Ñ䑊¤hÎʧ N&† „±‰¸RƒŒn£)ÉÊs:p„!N¥J•%téÂ2œç(Âri=¨P«‰« cÍRW²rŒ"”S”¥9ÍÆéÂ)Î¥IÊ0§Ês”c×Ê¿ n…Ÿ|s ø|cøyyã{CUøY¯|Søwwàï ü]ÒôËc¨Üê?u‡¿¹þ×¶:+[êiö¸lí¯ *¦gòW¾†Uc)΋ÂcòÚTëâ°ÜaÃÒ”ý”åR”\ãûŠÖ¥YF¤š“”骔iW©K޽zt%FKš¾ ½yáa¥ K õˆórQV£*S¬¡SØûXA9ÃØMÃR…·þ-~ÙŸþxîçᎋàŸ<£Ø[êž.ð¿À_‡7?uØjÁ.?‹¤mGO¶Ó›RŽf{xažæeXwÜGOl×<+ýeâ] U'‡ÁÔ ¸…ÜGÔ¥ìÛ÷ª(Æwå‹‚•:´¹ýµ ÔéöÕ¡õxPuêÓ¡[Z†MûzØu9Ó©ˆ„T\U*U! u9ç Þ½ B§>xøoí5ûMè¿¿a‹¿>øÃž×4¯ hz—ÙåÖ< ñáñ热|AáMz[ˆ/t-zÖÞþk;¥·¸– RiD6Ò‰$ô°ø~^ à7´±ÙVožåѧZ‹sÂcð’ÄT¥;)Æ¥ ¼—t«Ó‹•7 ÊŸ$àß^DéVÆçLNÓÄà2ÜëÚPÄSJ¥´²¬mJTeuxÔ¦§J¬öu©Ê†"…XSôŸ‚>4ñïíkûhh~ ñfµwá/h³¥æ…¤kíôþð²jßõ}GÄZNŸ{tÖzÞÜ@·W’ÛÇ™áÎY—pš¡K…±8ÜD¡MÐâN ¥:õbéápÔr霪Êܸz u%9*t”¦Òå.P©:| 1”«cøfUªÆ ¹âqO6¯F5j(ûÕ«¸(ÒŒåÍQÅ('k#6çþ ðŠÚòçQ‹á¯íð’ÎâTŸöŠÒþ kÚ‡À¡ajæÚ÷^‹ÅV·-©]h6ÚšM§½ä,ªÓÀÆ-¹Iß“ %V8Ib¿á8ßcì´¿Øy¾¶â° j¿+ü{©‡Xe‰ö./IbVûENê&§V–Ç3žR…O©ÎÔ/÷¯~2P’Á¨Õ–"Tå5ËF¤¨ºË“ŸÙ~2þÔß > Yx/ϳñÄ¿|I†KχŸ¾øqü}ãŸéV¶ê:†· i6—P[Ï£YéS-ì—s^@;@fd( žÚ–>¶YõLDñ˜8J®2¥'õ1©*Û'eFÄÅaaz“­+F›…:Ó¤°ò£ˆË©fÔñ4£€Ä{‡«)ò¬L«¨Jœ0é«Î^Τ*IÙB Tã9F­|=:¾ñgöÌÒµ_ÙâÇÆŸƒzgĨ6|pñþaoªx»Âÿ~ÜüAÔ< a¨Gº4þ.‘µ>ÛNmJ9™íá†{™•aßq =³\øT+ýeâ] U'‡ÁÔ ¸…ÜGÔ¥ìÛ÷ª(Æwå‹‚•:´¹ýµ ÔéýZW…^­:±PU¨aäß·­‡S:˜ˆEEÅR¥R§SžpëД!:sçyðÿö–øcñ7á'‰>0øJãZ¹Ñ¼c¯Ëã? ßé/¤xãÂZç…´£ªø‡ÁÚÿ‡õ)¡[X¢˜#rÖ²I†‚î[vYÚójÔ²Œ¶YĪG•Ê…LM NóÓÅP§9AÕúžÉÚN Â5U)¸JqŒ'(ËéTÇæK(Œ%„ǬM<,éb"éÊ•J³P§)¤¦ýœýø)ÚQ©JIW¥V”>uðÏü§à_‰¥ð-ü> øë¤|?ñåþ“¡Yüb×þ\éŸ 4OêÞt áwÆ-ªº.µmªÂÚmÄštŒwœ^=¤3]CÝC :ù„2ØÎ«â¤á—º²öqÍd©©µ—©¥Rrç|:zxyJ¾¼cc:¼uñT°ø,V:W• º«Žä´ž”*(:˜¦Ÿ$ ©NŽ+Ýœåì1U¾±'B<¯Æx›ãgí½7ÂÖøïûAü'ð~û6hþ8‹Oø+ñCPð$wž oˆz¶‰%Ρhlאַ ØNªò D¾Ën Û#xr¬:¯CŠñ•*Õ”òüË*Ãу•éFž+-­Z­¢Óq~ÓG’QçQÊ2rN=ù«ÑáL5*4¢³œÎµNKUo <½Q\é«Å*õ4š•´åqÖôõ¯x÷ö>ø±û?_xwöøéñÁÿ>)éß¼mðûãÏŒ øtñkzV¯w¥x«Áš«éÖ3øn}îÔÉy ´/Râq2Çl±ËÙ•UUó‰dµ©Rž•æxÚuZÄa«åybTÕNozi bâ©Â.R”jÖž®ÎÍ)¼>Uý±B¼¨ÖËqÙ} ”¥4¨ã(fxº87B4ÜñT¹¥ˆÃ¨Ê5*JŸ*©J„q4±~ü?lÿÞüWÔ¾ xgá·ÆÏø¿ÃßÏÃßKàßéÚÞƒà‚Ñègã/k+âXâðïïN­x–××A.do ë³U¶‰®¹²¶³XR«Aû ,¾¿b+§ =Ùv;2ÀUÂÔ­8}n¤òʸŠ8jn¥g…Äà*T…9âéÓ:ó²ÏiÒö•ãKZ–Š•JøŠxºë©Q‚Š÷pê¶ž&u]*p©^©JêQÀñçíåðßÂ^.ñW„<%ð·ö…øã'€neÓ<{âß çñ·„¼¯Zùí}áÍ{_¹Ö4ØcÕìí¡Ü asK!§ûDÛå…ÄPÄQXÉÔúžVêN 0Ä)CËG—ë”â§RTpñ’©Rq¤ù©J¨ª´ªRœú*ájQ­ '4g˜ÉS“ÁCšX¨B¼!<,åT±\Ó…Ær©í(Ö…XS”W7°ÝþÔ_ìþÚ3þËþ½šÜÚø’ÞÓRiï.üé1höÚ$–i©o>¬¦Ëû>KXçI•„©£ºml¾¦„ðÕq¼ÁÑŽ ‡‡µ¯©‰§í0ô°Ð‹JS«ß½(F-Gˆ•J«‡6]lÅTtš¡??Ö]ݬ"¦Ò¨ëÛšÊ<Ñäö~ÓëÒÕ}¿·¡í9Ÿ‚µ§¾6x«Vðü!~|BÒô8¼U€þ7x_ø›Zð”—I§ŸhV£Q¿ƒPÑ£ÔdŽÿiŽQ b!1©tC *˜lN&”áQ`kB†&œeûÜ4êÃÚPu¡eËÉME§'ªª~Ûí¹Þ"1©…„©Ô,}9TÂâ9Ãb}½­:5ãxJ­8J6âêR›k8cÃø·öïøqáïkš†¾þÑô êW:/Œ>&| øKãO†>Öt¹Y|E¥ê¾(R¶3Ýh–Â;­@éÖ·ÑÅÊ#’Y–Hcóðø¼=\4qõ§õ ®\ó†;QÂÏ JR§WN|²”ð4çN²X˜Á¬hεkBTªÕì­F¥*ÓÁÒ×3 J1ž(ÔĽHóRÂNQŒ1U#*mQ”×$ªFWN¬jBŸyã¯Ú÷à÷ƒ|ð÷Çú<¾+ø¥ÅÈÌß |!ðŸÂÚ‹|{ñ ;{xïuc xaþÇ,-¤éï%Æ¢šœš{YýžKy•o6[?V*–# ˜<®Xj•q”é’ÖæîÛÅóÙÉsyk7‡æŠÆÿÃy$©ö63CËO5ç‡ÃåøŒÏëtjáp5Z¥'R®8:Ô°ÕèÆ>ÕW¯‡ä¯BãSÛS«N4ܪ¹SŠÃƾ#1ÂetðµcŒÇ®le¨ã ªÓ¡*”%ÌÓ„1c‡“©ìÚª¤’q‹‘æü#áV±®xz ÿ…ÿ´oƒüâíjÃCðŸÆïüÕt?ƒž"Ÿ\¸û/….ôÿ›ù¯#ÓuùžØXOu¥[ ·qÉv-#I^ðøjµq05Ò˳,STðø<\£G_âê}R’NTå‰ö«]Sö‰N•œ’”ù!<±Uéa¨WÅR—×pXHʦ'‡Nt°Ô©ûµjÕçTê(Q­l=NXJj¼£ÆIóÃáïøfãö¦ø“á+o|VŸÅzWÂoë:Ÿ…õM[O—àÞ¤_ëZ䯄ôXî åŸng·ž=FæXR)má´Tv(@ãÁTÔxš¼/Rž3ÁS®ë{ÕiU–Të–§h`êQ^ÓNn2–2ÓK—Rñ¿»Æä4¦Ý9â2ÜuZQ¥îÒ©JžaN”êc³ž.§‡œSŒp®PmIØùÖ?ø)×ÀÉôÙõû‡´>©á= ^½ðÿÄi? eÔüð®îËZ] ÍãßÙk’YÛA5¼–úœI¥I«Nm.¡ ^H-(ÁW¡¥–b}¬0x ÚŽx|f)ª8g_%”Ýä±tyðñ¬”%‡O‡öXбu].œ^¶˜à~µÊêbaW‡÷êÊž2oùb°õ*üø x×ÄøSá¯z݇ümâûj7^Õþ ø¿Ç§ßßI¥_êK¬[Ûøu"ŠØGgerê·¦[Þ<¾‹«“åYÎ.¥_®g´; ‡‹•*8<·&°ÐÄQ8N¶6¼)R¯)NñÃFST*U¥‹p¡×­ìs,vM†Ã•’ªÃc1#Ï_˜FœgUP’Ÿ.†UT!î¹âå':Ñ¥*âzïÁŸ‡¿´OÁвxSñ׋¾=~Κ5=ÇŸµ¿ß|Qø_âû;³4žñ·%Å®©ñEÖ’ââKkä°‘¬ vÖ~U­µ¡–û¿ˆúÅ nB• F 4ª`±TcÉe9ÕöRÀÖÃÙG†¥Ëˆxɸ*ܵT¥VxŠT0§•º“‚Ì1 PÁòÑåúÅe8©Ô•jR…j*­*”§?F®¥ÐÂsFyŒ•9<9¥Š„+ÂÂÎPQåKÍ8QŒg*žÒhU…9Esz‰¿kïþø1á_Ú/\ø‡áO‹¼Iáÿ Xø—B´NŸ^եџP×,õÛ2ãJ°ÒîíîN¡±ý²Ým¤ i,€!×Ö]ʰX×õyfò’¡UûÔ¹c–âóH͸sT’«‡ÁT§N©Ô¬ñS§‡t£7?gɃo„Ì1Xh6òº|õ¨JЮ¤±0ΊRjš©Ïˆ§(ÊU#Bt_·§ZT¥Nsó ?þ ðTø‡T𿊼ñË᦮4÷Ô¼gñá>¹áËïíª&§Ãð‡EYnuojZåÆœ,ì.4ý:îeÔ¢>J˜.ÖÎ[«ìñ”á…­W6ÀR§Z®QN1žgÏÛGZ“¥N¦­:Õ*W… Jzóª°˜\^#iÓçÃKÛSŽ]‰u¹3&ÜrþZãZSu¤”ùeBJ­;RréÑQúÎ# B¿{ð“öÂøyñjÓâœqxCâ¯Ã¯üÒ£×¼gðÛâ·ƒàðoÄ} çG›ZÓõ‹= õ›¨f²¼¶·š8¼Û¸$WòZxá‚òÖk™ÌkÑËr o:°ÅàrØâž&iF¥zÂRyQ©NN…Z´éÍÐæš§Q¬9ã:5£OL5¸ŒÓ.Ê=œ°øŒÖ0žu¢áJµ7‰XIÔ§$¥)S£^P…Y(4œ¹aÏ(ÔŒ<‚Ëþ aðöÏÃþ$_üt‹áž¬š:߯føg%ÇÂOkZôV¬¾ñŸŒl5‹ˆ­uë CN´½‹L‡U† ›èáYäd—Éîxg t05kRÃ,EYÑÂb+MQÂã¥N5/<-ZŠ<Ô]jŒ:¯R4¨©áëV”デ֟ ±0މ¥N¦)à5ÅQÃÇÛ×®x%í©Sr|îZ¨Ñ¦êWEB”±Uí>7øÇÄ6?µ‡ì7¡è*Ö¬ü)ã;¯rx‹HÑõËëx²ÛKøge©hO­iöWKg®Áiu'Ú­ Ìs¬2?›ÖmÅå¥ý­Å˜lU'|B¤iU‹½ JÎðt'R0šýÕuNS£)%ŠTÛ³hô12¥.«Ã¸JrÏx~:ôÚrx|DsT„*ÇWF²…78Æ\•`ä¥Ë7Å¿·Ãx£\Ð|5ð·öˆø· øOR¹Ñ|añ3áÂ[ÿ|1ðž³¥ÊËâ-/UñDz•±žëD¶ÝjNµ¾Ž(¦Q’̲C›‡Åáêᣭ?¨erçœ1ظʎxZR•:¸úså”§§:u’ÄÆcFu¨{Z¥V¬V£R•iàéGë™…%χ”jba^¤y©a'(ƪ‘•6¨Êk’U#N«§V5!O€ýµ?j©¼/û/xcâoÀËÏkö5ŸÅ |@ø{áÑ©Ùi^¾×ôíxµ«Ma¹ð¦¥«é’_hv!­¡Ô"Õ®Ô+¸÷ÃÔÕlp¶UÁÖ«JxúxŒM*Q…hc0øuJ¬04*S›†"¾;ÛÑÄáhÒŸ²Ç`°ø·íe‡R…^:Ó§‹áŽ(Ç`q´(WÃàñ8l>"¤ù!ƒÅª•hTÆWæ‹TðØ)áëPÄV”'ì+ÕÃòÁÎQœ=«ÅŸ¶üàø›Xøwñµ¼mñ.ÚúïÂ?t߇7:‡ÇÛËm"é¡Ö®.üm¨²ivÚu¢›û‰ï5bå|§’wXq¸ÇG/£þßZ8Z8ÚÒÂ'ZŽ ZœjbêÚ0 ý½h`½œŸ´ž.5©ÒHa±5ii‡¨«`媞“ÅVÁц.ÔjâkЭR›Ž›ru£:Tž.VÕeF¤Ü'^:GÀÿÚkÀ¿¯µïéþø‹ðßâ…­,õOü.øÁàËïü@Ó4=Ni­ô|éRÜ[_è×nû.,on¼¯2º[w¹…eÚ4yð²ÅЭKJ…e†Ä*UçƒÅJš¯OЧ¤èÔ­†”14y—%j3½9Êtë”:êž&žµ9Э^JøuQ$±8z2¥J¶"ƒMóR¥^ªÃÍË–J´d¹yyg/¢«p € ( € ( € ( € ( € ( )øåðÇþ?ˆ¿ ?¶ÿáÿ„ûºŸ†·¿³¶?²´aò¾Ûý—öû·ù}|ŸµÛîéæ/ZâÌ0^¡N‡´ö\˜œ#›—›ýÓCÉnhÛÚ{gÍs››–\¼¯«‰úYÕäçæ¡‰£kòÛëj¸~kÙüמÖ÷¹yoó.Eýžÿ±þ4|=ø½ÿ wÚ?áø'Á?øG¿°<¯í]ú¾‘ªÿÂMý­ý´ÿaÇöW•ýö;õû¾×òmbX®lÏ‹³goõª¦ ~Ï›ý×êxŒu{sÛ÷ÞÓ뜗å£Éìù­.{GË¥†öY7 åüßêíZÕ=­­õk€¡·³»ö<¾ÇÚßž­ù¹,¹yÞçÿ‚¿ð€ü^øïñWþ_í_ø]—þ½þÁþÆûü#?ð„øa¼9åjjÜlý·?hÝöK'ý^%ûõÍ„—ÕrˆeVçå̳,ÇÚíÿ#«~ç“_àý_øœÿ¼çø!ËïubÿÚ³6?øWË0Ùo³ß›êøŒV#Ûsin¬ò{>WËÉÍÏ.nXÛøçðþG‡ü¡ÂEÿ×ü"¾|JûWöGöÏÛÿáñïö/‘ý§cö_·yGÛ<ɼÛü‰±°çF>Ç7Ès[óaⱟe·¶öùVc–rsëìù´=¿7%NocìùW´öu_´Ë3¬»áþØÁ<´ßØß‡¯í94ö–ú¿''4>>nov;8ø;ÿ —Æ?‚?¿á"þÍÿ…7Ę¿áþÈûgü$ð°t7DÝý«ý§ö?Ø?³¼ì}Ž÷ívÌÁ³{i‚—Ô±Y®&ÞÓûO,§—rü>Ë“Cí¯ïsߨû/gh[›Ÿòò3þ³—QÀ|Ç4Áæ^Ó{ýS™á=.–öŸÚ>ÓÚs>OcËìåí9¡ƒwû<éZ§Çüa×u{}gCñ÷Á ?àž±ðúóBÒ].ß]Õ5kûûhê¬.íïm5IlžÃû:-ª Ÿh}ûP¥ý•ÄYUxºÔ¸ƒƒÆÊJNœ¨}O/©PƒW“œœÕxWŒ©ÊŒá¹%Q)βÎ8{9ÃVxlG`±xZI%':˜œÃ…u'ec,:§ìÜ*)ós¹E.Gó%·ì)ñoGÐ&øCá¯ÛGâf…û5L­¥'Âáà/_øîÃÁ×[Qðž•ñ®êoí]>ɘÜÛÛÒÌVÖ2­‰·ž%Ïq…<],- ú?Û”p±Œ&ÞbiÐrxZxLJå•zQJ•kº·„~h_¾0ø¿ötÕ¾ÙG£ø2ãÃ6vÞ+ðTºö}¦&ã?†ºõÔzO¢ƒJ¶o°O"Ïcxâò9Ã$ºb«ã±YlÎx»Ï ”ñT§J•J5#:‘­ ÐŒ£þÅ^Jq…:Øgð³­…©Np•aóÁÑÃ`ò¸åj“œ(ÊŒéWs’Ī”[æu«¯ÞWŽ#šSÄ£ýõ~JÓ“ýì+q?eiþ$ñ/Ä/Ž_´Œ~4üOÕü«ü.ð÷Œto è—À> Öæ†ÿPÿ„KIðDògxÂMV/´­Øœ$°¤H-Ù§Š”°ÿQ̰ØXÔÀã3ˆááŠÇÒ¨¾µÉƒ•iá)a¥*mQÃÒ«Yâ*aj*øjø˜F­JMJ¬*i µ–+,«YÒÄárzµká°•(ÁÑxŠñ*õk½'[ž„GšÎ¨ï)ûPó½Cö0øïã;þÏÅ?ÛgÇ?>ÎöÖ¿ÃɾøEñ·ˆü-¥\Gq£è>!øÉku6µ©Ý³Yéɪê­f·ªGyæ,z^a*5±l^k„¡˜ÖÂסŒT£J| ñ˜z°¯Nu01ŒéK ÐçŽê0’§(TŒéBd¹VÃÇ ³<·z*¤ùq5©Ðĩ´aR¬yUWF¤é§³ä…Õ¨ºKؾÃâì™ñ$üRñ?Å?ÙÓö’Õg­GÇúG†ôψ: ø[àÿŠ^×%ðn›‹áCIÓüMyhž¹¶Òíæ0‹ƒ?ÈCD–^ZqÅEft*cjWÁf8©ã)éRŽ/eJ8ˆµV1Å5 ÓJÕ=¿4¥Z¥8a)a*k éeQ†4kdø?ìêU"ß½‚…iW¡J¤]ÝIÐJ‘…J’Ÿ-tãO÷Ò¯æß²†¿gÿƒµ-·µï‹¿´×‚¾/Ûx_ñ7‡4ý×\øÊúͰ²×¼C¤j—>#†ÛÄš¸Ôç·×m?Ь®l#ТC&©,(dœÂ¾ ’`råN¦W†ËózøÚì3ýæ\±upjŽ&³)ɼðÊ®;r§V5±5±JxonެºÊüC<Þ8˜Ï0Æå‹Š£U:x\SÃQÇ7‡ÁÑèK OGWC ÍÆøJ4144ßçñ¾ƒö‘×þ |+ð/í‘ñSö² |Møy­h>‡àUßËO†Þ ðæ³§§ˆ>!|[ñÞ­¦B|nÚO…Ñ´¸¯®§7RêšÜrFÎ×òAsìe”ñU8‹(Ï1°¥ˆ­–âgˆÌ38Bx\¾1§†Äâå‡Âàc̨ã3lv œ’¡…§¥)T©*Q—‰téðþu–a'S‡Í°u0˜l¹¥[RµzxzU1PjŸÔðT}»ÄѧbëÇˆŠ£†ÀÊPý‰øûû2ÜüWñO„~*ü8øŸ¯|øãàM>ïBðÿÄ}EÒ¼Qe{áNî+KÃ1ðv±$ž,ÑC}®kKiÚîìÝŸ`ˆøôiUÂãªãp˜‡Cët~¯Œ¢á”q4’“§' i ô¦á(V÷½ØBðu¨á+á}j•aˆÀÓÀâi{Xa1[ÂMNTç†ÄIS…iEÅûЯFœiÖƒ³”cóª3ÄÑÄbü0ý•5½UñÇŽ¾2|rñ·Æ‹¾4ðuÇø>"Ùéºo¦ð'‚gÌ­aðßAð|ïƒõ™¯¼›ÛVÚ餚çO´™#Öá¯:*Ó¡ý›ŽËðQ«—ÖÍ'N®7J´¥‹«Wí#ƒT¥QN.3s§ƒöu0õ1+ÕÄÆ½:°¡G S¯v‰•<]¦U~§„+acB ëËKÇŠ©*S¦±v¥Z:‹ Óö“ó Cö0øïã;þÏÅ?ÛgÇ?>ÎöÖ¿ÃɾøEñ·ˆü-¥\Gq£è>!øÉku6µ©Ý³Yéɪê­f·ªGyæ,z^!*5±l^k„¡˜ÖÂסŒT£J| ñ˜z°¯Nu01ŒéK ÐçŽê0’§(TŒéB`å[L2ÌDð^Þ5誓åÄÖ§C§ Ñ…J±åU]“§ žÏ’V¢é/bþ̵ð§l¾$Ãâ _ˆQÁð®×À‘øj×á^ ÑcŠßÅPê±\CãHüp³j,qè±,h‚²Â㘠UB´¤³IãÅⱸŠ5¨×”œ%†„iÔXšRŠºÄñV…¯øŽÊ#l­0ß éº>R³F\ƹjbpÙ~eÃY¦='•å9ÞW‹ÆÞ*q†ž&*U§{®žr§‰¨Þ…TêeQIæj=Ž3–f˜l-EVQÅb2üM* ¥¥Z•*IQ§ ÜêG‘9¨§V/ÚŸöUñþ·ðEðµï…~4øÃÅÚå•Ç€4ZxWÅþ&øc/ü#“Þ_xÏÄ–:ü7ÿ íôÍæ·»šXíµ8üém’ÒCÂCë<=ig¸ª4ß6' †ÌêÕÌiûøjxxòB½'Ž¥Ï³Ê• 4£' ]IS„ôqgÍP,6A†úÌU:p«–áရ½j¸¸Í±¡RÊ«Á8UÄKí 4iʼ*>z~ÓÆþü[ø_ð'ãoíyð÷ãw<+ð×Ç&øãªüUÐu/ˆ¶›àí;Å_ |K¢èÞ—Fñ·=¶©=­¯¬Í¬Wmr­ÃG•?•çäõ(K…rÜ(Ç ‹É±Ùµ ƃœZ¸ÜVc‰ÆG1ä¿<£˜ag‡«x¦èÂ4of«á½¯¯œ¯øÈþµ2Ž0É2_«ÕŠs§/ìü;Áâ©Ê¤ST§Kæ£N«„ªÞ¬°ê¬(Ö”>CøÙ«iŸþÁM>6xV»øMã¿þÏžð~·mo-®‰âsáÞ±á]ÆÞ"ÑC¬cPµ—U»‚©$%.¶äž`„§ÂXz^Ò­IЩŽãÚù• s\•#‚Åb0Ô¨Õ•6”¨ýb¶7J¢…hÎ3U骒=<jž&ÅSÃS„§“ð~gÇbé¸IbñrÀç8št%Ru^Y„©J9NS‚£ˆƒÃ?«Î2ŸÑW>ñŒ~+ÁT¼'áåŸÄþ#ø%ð[EÐm`òÌ÷šž£ðGÅV¶–‰]ͺ–E·]ì«™†H#ËÌ!)p-ƨ¨q†s^¤"œ¥*8z¹-zñŒbœ¥)Q§Q(ÁJro–”šOŸ(« ÿ '*ñÂ[…§b%ðáªÏ7ÅBŽ*I鈫(Wiô¦|Éà‹OÙJ_ÙÓHñ_Šÿࡵφ&Òü ™â¿‚6ÿ´†‘§x«LÕ´ëômkÀZÂ{ï ÿiObº‚M§ÙÛ-¼¶iå»\}•d™;s·…ÆÎ´ðtëñ6 =kêÔ£cñXêxéºtèâ ¯NuªóûLB÷ñ3ÃÕæ\ÔÕý¼©Â¯ÕÁSœ1y„ò¿g:´åŠ/—ã!‚ÀT®Úµj0œdèÝÓÂÓÄSR”%)Â<¹âÿ xÓEÿ‚bj>ñ.…â{ ‰ÞÑ/ï4 ZÇV·°Ö´¿‚šœ:ž}%Œò‹=ZÎVXî,æÙ4,BÈŠN+ì3{ÄìV&ö•ñÅ|=XëN½:QZ3^íJnPœTàåhJ7¼Z_–/eá¶_ƒŸ¹ŠË±ü†ÄÑzTÃâ)´çF´>*ue òÉ&á8M^ŒŸKðâßÂÿ?kχ¿¼yá_†¾8ñ7ÇW⮃©|@Õ´ßiÞ*økâ]@¶ðœº7ˆ5¹í´íLiím}fmb»k•hîÂ<©ü¯'©B\+–àéF8l^MŽÍ¨f4àªÕÆâ³N29%ùåà <=[Å7F «{5_ í~§9_ñ‘ýj4e6a’d¿W«çN_ÙøwƒÅS•H¦©N–)ÍFW U½YaÕXQ­(s? 5m3âÏü«ãg¥k¿„Þ;Ð-<7àýnÚÞ[]Å:çÿ„zîãoh¡Ö1¨Z˪ÝÁÔ’—FÛrO0BSÊÏ!,?…˜ªU©:1ØÞ"̨Sšä©)á)Q«*m)QúÅl6"n•E Ñœf«Ó…U$z9ujž>áÊxjp”ò|6UÇbé¸Ibñṟšt%Ru^Y„©J9NS‚£ˆƒÃ?«Î2Ÿ5ñ2ÒÚËþ 1ð¹-¡H~Îw±l1^Mã_]Ës”®f–Mà‚ÉWÜfÑT|FàÚT½Øa¸‡(£M]Þé`åFM·'ËJ* ¶å%~fÛmü¾SNNã*U)Ætêe« BÃѧB¾.Ÿ°ÄbcõŠØe8T§†œÜœUU#9Ã’©zõá:“¥QÁcZÖ5jT• %IV§AË÷*³QJ³‚ø§ò¦Ü¡N£ƒ«FŒéñ¿²¤ ñ{ö鼎$KËÚCì’܉ ?xz[H˜÷H¥¾»e·ë^.IÕ84hÕö5%Ä|l©Ï¥:“Í#ÎßÝj/þÝFù¤a,ÅO•]ä<.¤ú¸Ç‰i_²æ•»]÷<›ö-øñð[à—ÂO|øÇñ3Á_ >,|0øñ2?ˆz?µ½3Áú¶³¬øÏÄ ÓüE¤A¬On økwáoŠßgðŒu/‰_“ÁÞ5Óþxs–÷6Þ"ñ½Ž©%׆×YÕÆ´Ë/´Iq-¼Mw Qù2¿•ŠÁⱸ*¥§,5hep£WâéÑÅJ½J°Â`aˆK“VUS¨J^Î:uk©)E“ ^…N­ŒKN¦=ÊŽ ÿš…S‹• œ²ÂÒt90•+IB¤êV†F~ú‡å'ìçàÿÚWÂ[ âïíãûMþΟ~ê¾,ðïÄ?„6¿´f•ðÓOеWÔî®ÀÞ»Ð&¸ÕôÛûGŠî1£>¦gº»š4-;ùu×_­–`sl zؼ°T#ì¥Í_B®J|#¡ûe5`éa©ò7 1†MbpøšTªt1±Î³Œ7ØË<ÇV8¸Aa°¸êXÌMJØl´ªÕ8ËJq©ˆœçæÞ&ÐÃWÃÊ~áwðãöZŸörýìá|üwý›õMWXø«ãÙßãoÄí^ßþ4‚÷Å‘jz‡ˆo¼Wâý Oð׈¬®­õK{C[ðΧ«ZMm7I5ÕÄRÝzUð†Yƒ¥ZŽOšeY 3ËÛ„#ý™ n,»…•HañXœ²¥\>XL,«Ó˯J5hT¥NQ’Â×…LW”jf™n?9ƒ«ˆŸ´nYžl&B3‚ÄÆŒ§G/mŠÃÇÚ¥^´gIJ†"ÏÁïŒÞ-¿øñSàWÅoÚáïíð/þ'‰|u⿊¿|%eo¬xGL?gðæ¥àÍ~ÓáTú–¨5þ–Ú厥Œº¶»1Fœ˜£Ù râþ§È¸®yÎyn+©ƒäÌiÏ’XciÎu!È£aë`e‡©‹z^ Bœ§_*²ú®°k—æÜ+,Ÿ N/Zp†¤ ëЫj¥W´W9R­9á°ò–&\õkÔ„! n>×óÜßof_ÛxÇöYÿ‚†ø?ãg,n|'sà¯Ùkâ’ø{Æþ<ÕôMRËIðõ‚ô»û M|i¢Þ[4¶¯iáÛøZ —} ov÷~Ÿ·Ì¥›eX~ql^f°x‰aªÑŽ"PÆV©¬¬bœðøšÔ%*sxŒ^2Yrέ5Rô²ÜG;¡‚­G2ÄáqÈaCWZÿV„ð®UëAÓ¯*n«ËÛ¥*q–"´gJÄm¥÷ÏÃ駸ý¾þ5OslöW3þÌß渳wG{Iäñ'Šž[gxØ£¼R3!e$™Šó°Ð§K+ñ•*ª½*|A—FiT„xz¢ŒÒ’M)$¤“I¤ìÕÌ15jÖÅð-jÔ Õxw1JN÷§9gyJ›O[ÂMÅß]Ÿ~ ØÚGÿ¼øã¶Þ/ôÝö©º» ÅÅÂø“Çvë,Šù ‚ÇJóóˆFðE:k–²NœUß»*˜œ6&rMݦëÕE¯ºÝ£hÆ)}FWËÄ>(Œ¢¥ÜCŽ„âÒjp–)FIé(ÊŸ¹(µiF馛/kÚþ‘ðëVÿ‚h|eør¶ t†‚uŸjvðÏ¢x;Æ¿>xBϾ¿¨Ü1:•ÛiÚ«j® PŽ÷3C gg˜Ö£†ãþ;£^µ<5\ëŠÃà'Vq¥ b0YÃÇãhF¤šŒkWÁF^Λ’ž#’té©þ÷—árš8ŠÜÃ/ )<6M˜`ñy†œe9WÁfc°X:ªœR§–cjÑšƒ²RÄRtT±¡N{‘ü`ø?ñgþ Ið‘>ø§Ã¾8»ð¯ÀˆÚŠ(Ö~ˤËvÓø‚æÊm0Þ›µ›M¼¤‹et,ï.¯õÞȽ­HG1Èp8<“1¢Ü)N8Œ¶‚ÃaëQ¢êNu0¸Œ,=Zu"ÜÕÔñ¢±w[lÊigùÖ.Tù°\C‹y¦ ¬¨½ž&µ(VQW£[ [ V_h•)IÂ4jÕg¸øGö­Òþ.~Ð–ß þÅ£üJøsáoëZ¯ÅïŠú-Ì÷^ðLjï³›À~ðω­M+Å…Ôk«5嵡MÃx²é:…¨tpØŒn<ÄÉO‡¥J8|»5É,FbªÊ˜F”íRTpô% ê¼b¢šƒ|Ôñx9ÖÃ^†YnŒ£ŠÌq8‡|cø™à¯†Ÿ>|Fø™Ä=ÇÚÞ™àý[Y¿Ö|gâiþ"Ò Ö'·&ƒPЮtù#}%¯ŽÑn¼ àóU,^ § p¾'Cêx<M„ÁOÞ×Àârê¥ÂÊ….zÓšÅ{Z‰ÂUkT©FxŠ5éÓêÌ)IñoÆ4½œsÑã°Õ$ÔhVÂc©QxJ«&¨¯rŸ,ã:‘«B§R¼)Ó«FSùãOÒàñìÙ?ŒKž/‡?à¥>øƒðÿIÔôùtûk¯‡$ø—¡éúuÌ:=ÂÆÖzf¦úv¡r°½½¿˜—FCYCɾ<7À¬»OØcò—ˆ«Ršœ\°Õ²8³2ÁSr¥'ÜÒ©†©ÂR¥Ë(ÇX·“4¯…Ìpþ+âð´b°²|6SQІaˆÂ,› ˜f“”ñ5ÔèV•eõ‡<4£]óEF?vüx°³»ý²ÿa©®-ã–[8¿hë›wa†Šh¼ $oFí«<¥U²6à7BÈÛ†mÅr»%Ã4Uúëž`àìú^œ4û3”v“O£3“\5‡§ö*q>M+/…eÙö"ɽczØj—+\Δ¯cͼlL¶Oí5d¤sþÁ–SΈv¤ÓÃâC ÒªàI*BÍ»UX¨ WÍfÉ/¼avI¬^[kÿ$ž6ÿ’û—c£ &¸÷Ãݨ¼·Ú¾—\I–ÙÛk«»v»îÏðGí5û6iÿðMí?áùñw†/ü_'À¹~ŸƒÜÀŸ5¿ø‹B} + îþ×¼ƒSñ¯âjÖö’Û<7†ùf*¬WéxÎ…\æºÀ䱕lNcSƒÀF6•L|,¨áaJ”¿ÙêåµprHbg:˜xœªÊ¾Öáá¸|¢·Ö³\ ,Æãq˜ßi(UÂÕÅÕÅÕPŒÚ¥ŠŽ/ˆJQRt¿{V©Q…,S£ßø‡ÂÞ$ð·Åoø%‡‚õÛ‰ãño‡¾ü`ðÞ­qs!žâ LýŸô-6ñç—Í—Í–+ø_s d¡!˜r{³‰,Óˆ|Zyl£/¯ðÞ1a§”fëgøuJi¾Ui¹)'+oy[QdÉ`ø,^Ð¥Oˆø^¬ðm%ì(¹fuV ÊÑŠÃÒk £¡MF E$¾Dýœüð;JøKs¡|]ý¼i¿ÙÓâOÃWÅžø‡ð†×öŒÒ¾iú³£êúÕÃxÁz×¾›hñ]Æ4gÔÌ÷WsF…§.¼ÊøÜ l³›`kÖÅàå‚¡e.jøÊp˜zTkáGÛ(Ñ«K O‘¸QŒ0òk‡ÄÒ¥¼èccg,o±–2yŽ&¬qp‚ÃaqÔ±˜š•°ØÿiUªq–&”ãS9Î)ͼM¡†¯‡”ýÛânƒà_ ÿÁ2l/>ËñH|?»ø‡à/éÚ¯Æë þ«ÍZøç¡ë—'Õ$Ñ+a¥êBâMVÍž8îd³¿‚k„Ê» žWÄþa±Ôè唲\Ë,¥:>í?¨QXLuXaqV“£J®5ã…«NŒ,(Æ…×°›^V*„ó^ñ:t«fX¼Ó-Í£µ;ã1o«Q­S«FwN§ÔêN¯U¯QN¤£V;hõøoâ¯Úÿáßü[ûHüGø;ðsâÀAះ¾üSÒ|á=SÅ>ñž±ªë~ñÄ+{MKOM&kè¯ÜKmln ‰<ó*˜Ç—–ÓXl_e¸ºÕpyŽ*y~g…¡V~Ë‹ÀSÀ{)ÉFVU+Òœ•l4®“£‰œUçŒÁGêãk¼N]ØÜ±Åå¸Jùž ìé:˜Œ:µ\7%iû*XˆÐžEÇÚB®\§5N–(z·ìÃàÿ€‰ûMê·ÿ ¿hoÚGöño‚>\Øë^:ñ¯Å |XøMámÅúÅ„öžÅ–šu­Ä¾'½ŸHkØl´¹níQ4ûÓtÉqncNü«6y‹§„Xzž/©^½)SxÊ”§,l!ƒ–’Äg©IÕ«%õ|xÐŒ),ZØ*>Ù×§N5‹«*4ëJ—Õiªõ¹Ž€ € ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € ùÿöbÿ’Ciÿeã_þ®¿ˆTôPŸø[á?ÂÏkzlj|ðÓáÿƒüGâ?þ ÂÞ ðï‡õ½sí7o¹þØÕt6ÞëSóoÿÒ_í2ɾoÞ6_æ¢û6`°ÿ¸ÁÇÙZ…?rŠö:6¥A{Tœ){¿»ŒçÙI¦ªÆ5±\­W•Eíæ”«Z´¡:ËÚJóµYÒ§:‹šÓ•8JWp‹NñÏŸ…ß×MO‰_ ¼ñ 4fºmÎI µ[©eñHÑñƒ”¡IÐŒœh:µ1šmCÛÖPUkr/wÚÕTàªT·<Ô ¤ß*´´šÃE«¬«á×J9ÝGBŠÿ—T}£u=”9aÎܹy›g%qðOàÕߌ×â=×ÂO†W?Òú×SO\x ³xÍ5+!¶²ÔÅiGS[ë{kx"ŠqsæFƈÁP°íàù¾ªþ«Í픽—îïõŽuˆ¿'-ýº«UV¿ñ}¤ùù¹åu^1Å(¬TV!EÑ”UTª$ðîô§{:¥NTZÖ“§WÛ¨ño‚üãý xïÂ~ñ¯‡.f·¸¸Ð<[¡i~#Ñn'´•g´š}+Xµ¸µ–hfU’7h‰FPÊA¬çJœåJS§J„œé¹E7Nn¦çÕã'N¤é¹FÏ’sùdÓÖ3œã Ê1©¤ÚRŠ”f£$´”Tá ¤î¹£oÔº'„ü+áŸÛxCÞðÿ‡ü'ei6Ÿgá}FÓ´¯ÚX\4­qem¢ØÛEg¤­<åáHUÌå”ï9¼OûdgOþÕ ÒF·ï#*1¦¨Æ””ù“¥1(Ó~ê§¹RFxxÇâð‘XW ’­E*n5§RU§U8rÚ¤ëJUe5ïJ¤¥6Ü›g-¡üø?á‹]ÇÃ_ ~xzËÃzìÞ)ðõž‡à_ é6º‰®lÿ³îeis>kßS.ïá÷€o¼%kàïxBóÀ¶6úm¥—‚®ü5£\xJÎÓFšÞãGµµðäÖM§ÛÛØÏik%´qÛªÀöÑ4AZ5#IÖ«SKR¬çŒÃÕjUå&ëR­MZiÕmÎ`£R2SŠÑ4ˆ„cJ•j¢©Ñ¯ ´êÓŠQ…Juù½½:VŒá[š^Ö2N59¥ÎÙ¢žðÄ~$ÇáÍ<]&‡$ñJizø‘ü=Û_Å¡>¸¶âõ´d¾f¸[#1ec @ç5n”k›táŠ:µ£uV©J§J¥T¬ªNœ%(Sœï(BRŒZM¡Ê*K¤”– TÕÕÕäöªŠÂU=?h¡Ê§ÉkòÆÛÔ†ahþðχ®õËíú‡}â}Lë^%¼Ñô?L»ñ²má´:¶¹qeoš¶¦mmà‡íWM,¾\1¦ý¨šQ + F*Ž5kWT ”)ªØ‰ûLEeÚ*­zžýj–ç«?znRÔ'ïÕuçïW•:TIk7J„\hÓs~ó§F-Æ”/ËN-¨$™ÇøÓà§Á¯‰®·ñá'Ã/ë66i§Yjþ4ð…|S©ÙéñO=ÔV·úæ•u=½š\ÜṴ̈G" ’âW ºF&¨?ª×X¬7û>)Nj_»«í)[ÙÏÚBÓç§Ê¹%~hYrµd\ªÔ•aåRR¡NS”i97N2¨¡’Œ匪F56’rTà¥uÛѦ¶¶¸¶–ÎâÞ ìçí§µš(ä¶šÚHÌR[Ë©I h™‘£e*TF*+S§ˆ§V•xF½*ñ”*B¢SHÍ58Î2MJ2M©)&¤›M4É¢ÞÒxgõw‡åöNŸîý—³·'³å·'%—/-¹l­kgþ|3øa¡kð×áß~Zê³Aqª[xÂ:„ Ô§µI#¶›P‡@ÓíRòhc–UG˜;"ÈÁH s»«UÒ…RN9Np¦äù#:Š©8Âü±”ãJœg$“’§ÛP²TiF¬ëÆ”#^¤!NuRœ©Óu%Nš\Ò…9U«(E¶¢êTqIÎWÌñ_Á?ƒ^;×­|Sㄟ ¼eâ{--l¼Gâ¿xWÄ:õµ„òÝXÛÚêú¾•qwo½ÌóÍqÊ«“;  䘠Þ·Öp¯êØ…R5½­/ÝÔöÔÔ# ¼ð´½¤#Nœc;óES‚M(ÆÕ^1ÅPxlTV# *r¢éUJ¥7Fnntœ'xºsu&å rÉÎwO™ßªñ_ƒ¼#ãÍëÃ9ð·‡-ÛüðŽ©¡øOXð'~~̾ ¾ðŸÂÝNñ§£ë~%ñ•û떖څk"ÂÆHÖ·†×J‰Ä³IrRÏÒ¥Rކ;’u±ÜÒ– R¥gh`ðxF; œ¢ðõ±8·­RP¥Uâ¥8KÚR…C‚µU«ƒŠ¥G…ÀÖ­‹ýÔ-WŽÄaპ#6·§ƒ¥Kœ¹¡J/±öU>³öþü6ø›kccñ#áïþ Ùiw]é–~7ðžƒâË]:êhÄ3\ØÛëÖQÙÜ< #I£2¤‘Åp:4]jx‡J½(Nœ*8ÇÚBYS•Jq¹£ ’£JSŠj3•*nI¸FÝŠ¥HÓ•%9F”¥Ê MAÎ q„œog(*“Q“WŠœÒiIß[žð—€ô;_ xÂÞðg†ìáì¼=áMLðî‡f÷w]]=®“¤ZÛÚÛ¼×SK4†8”¼’»¶Y‰=*Õ«ÉíjΧ²„iÞN\†‘„nß,"´ŒU’葌iÓ¦æáÁÔ—4ÜRNRåŒy¤Ò\ÒåŒcwwË­’9O|ø5ñ#SµÖþ"|$øeãÝfÆÍ4ë-_Æžð¯Šu;=>)纊ÂÖÿ\Ò®§·³K››™–äT\JáwHÄçAýVºÅa¿ÙñJp¨«RýÝ_iJÞÎ~ÒŸ=>UÉ+óBË•«#iU©*0Ãʤ¥Bœ§(ÒrnœeQB5%7ËT:jm$ä©ÁJê1·c­øcÃ~%¶²²ñ‡´=~ÏLÔôÝoM´Öô› VÛOÖtiÖëHÕì ¾·•-5;”I­®¢U– ÔõÄZ—‡ôMCÄ’øo]¾Ò¬.õŸ®³VºÂèz¥Äs¤‹ëX!†äZËŸ(’îU87JugK÷s¯IQ«(û²©ETUJ£Vs¤ªÂ59^ ¤c4¹’j¥ïÓTgïQXWTå¬zp«NeéÖ­TKž0«V1j5$Ÿ)ãO‡zˆ4ïßiz†m<{âÏk0ŸJ³ƒY›Lº³¿n‘©ø‚ÞÆMFMßS½k‘kºhãw’Xá27ÍägxØþâŸ8Pžw…ÄS’“”(ÔÅOW ‡¯ˆöq““¥ žÍTp©R\¡׺ûrÚôp¹¾O™b`êÿeU¦á%Ê­|2ñ—‰ì`´µ²ñŠüá_ëÖvÖËucok«êúUÅݼ÷3Ï4QÇ*¬rLî€3’J á+}g þ­ˆU#[ÚÒýÝOmMB0«Ï KÚB4éÆ3¿4U8$ÒŒmãU†ÅEb0Ò§*.•TªStfæçIÂw‹§7RnP·,œçtùû}sAÐüO£ê>ñ.¥x‡@Ö-e°Õ´=sN³Õ´}RÆq¶k=GL¿†[kÛY††hÝpA¬êR§V*iƤ#(MFqRJtç”æ“M)S©ÎÞ3Œe¤“5„çI¹Sœ©ÉÆQn-ÅòÎ.Õ½ÙBR„–ÒŒœ]ÓhåføMð®çÁ|3¸øiðþ†ðy^GÃé¼áÉ|‘}ý©•áGÓN——©ÿ¥®ÛQ¶ß IóV•ÛÄÎ\Köõ0üŠ”ê{ò¤©Òt ©ÊWpä ÝrµËIºjÐv3£á£Vxª®äêÆšäUê*²ul¦åV1©'+Þ¤TÝä“5¼àO|;Ñÿáøàß ø@Sßaø;ÃÚG†4q{r#[›ÏìÍÎÚÛíR¬1—ËÞâ$ NÑ‹Zµ#J*Jp¡ q”›Tàç:ŽMµº•*Tq—<ç+sI·£J”ªÎ•(Syª•e¨º“P…%:$ç5J:jR»P§_–Kª¬Í€ ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € (çÿÙ‹þI §ý”úºþ!PÐP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@|ÿû1É!´ÿ²ñ¯ÿW_Ä*ú€ ( € ( € ( € ( € ( € ( € ( €<ŸÅÿ¾|>Ö_Þ=øÏðŸÁ!ŠÞ ¹4üEð†µ˜ín”½­Ëézαmr–ó"“† ®*H:Ôjʵ:UaRxiªucFR¥QÓ…UN¢M¸MÒ«J¢Œ­'N¤'nYÅ»•:”ãNS§(F¬\é¹E¥8)Ê›”IJ*pœ•Òœ%Þ-/S‚x.`†æÚh§¶ž(ç·ž X&‚TE42ÆJÉÆÊÊêH ‚ oRJ5'J¬%J­)8N‹Œ¡(·FQi8Ê-4âÒi¦š¹:”êÓ…ZSJU"¥ Á©FQ’N2Œ•Ô£$ÓM6ši­ j ­uyicÍ{uog Okj²ÝO¼Fæúæ++e’VU3Ü^\AQƒºIfŽ4ÝAñŠø¥uÕÙ9;.¶Œe'm’odÃe'²Šro¢ŒS”¤û(Å6ÛÑ$ÛÑh € ( € ( € (µÕ奌K5íÕ½œ-=­ªËu¤  € ( € ( € ( € ( € ( € ( € ( € ùÿöbÿ’Ciÿeã_þ®¿ˆTôóí“ñcÄgŠ<ð†â»¿XxoR´ðþ£á/ÙøŽ j×vKcâínËQÝmmá}&tK›ëÉṎ—{A ùkÈÎ1(ÒÁaé9Óxüf *ѼaF““«[ÚÕMJ‡Ö)Rž V¼úö+ Nœ©Î¤jÃÑËhÓ©SR¤c5„ÃW­oYÔš‡%'mSØÔœq5¡/uahWœÔã y×ÃïÚóº'ìÍðóâgÄ_ |bÑ5ÍFÏ@ðFƒàßx.ò_‹?|m‡4éc—áÿ† ¿º¸ñ\>!¸3Oc©K=´3«4÷R[&^¾£ˆ]*Ó¥ƒÂÍÔÍkã«aòê›Å`pô1X•^8Ú÷pQÀУí±<óöt©OÎuñ(TùŽ©V¶M ¸ìTÊè`©b3“QÁã±°xZ«¯eõ¨c+Vt¨8B.ua]¸B µaÝ|ý®| ñkÅßð¯/¼ ñ—à¿Ä+­2÷\Ð<ñÛáÕ÷ÃÝsÅš–`TÖ<,Íw}c«[ÙËp©, z—`E<«lÖöòË%*>Ú–*¥ ÔªÔÀ*SÄáãQ}gB¼Ý,>*­i,5zЫB£ÍÖ¤éÕtåR‚«ßVºÃÔÃBµ9ц2¤¨áªÉ/eˆÄS¥R½l=)&Û­B…?mV2ŒR§88Êo™CðoíÕðëÇú½Þàÿ†_5Ý3E¶ñÔž.ñô™< àmCÀâC¨øž**ûâ+ë/C{ac\¼Öþ%ÑZ_!×ËY…Ãø®%’,« “QÎá9ÅAâ¨UÀas apmµOÃÃ6&*Ž…eUb-†­8z50“§šÓÉãS1žf²ÇJšœýœeBÊÍBÔ°U&«(T©ËY¬5_Ü'<2Ärv_ðR_pø#\—Ÿô߆Þ3MÞo—É-þø;^×EO ø»Çi«Éi»cv‘Yß)uk;K‰š9/?Ñ/ Ÿ§Rœ(c#ƒ¯ˆ¥‡öõjQÂV«?gC:TªÎ_S”’•X9áñ4cRP„°õ«9,>²ø[áëb)R©ˆú¢æÄÒ£kW k jU¡Ò½:”q„%:’¥^8Á⦰çuàßÛá?Œ¾*øcád~ø¿á…ø€š›ü,øã‡—¾ø_ñ`iv6Ú£‡¾"Ô¯ïY‚çM¹K›[™tË[yÐÂb÷¶Ix`¨VÆ,e9R–§R´òübö÷BYÓ•e…•çGÛÎ_gŠ£CסJ¥ M:cpqUy£ŠÁÇGS†j¶–*»”)Ñ•xû’œ«ÂxhºN¤'V•9N„]e·à/‰~ ÒüGû[ëÚïÆ7Âß%÷´ojzV«áý ]3áý–¾úOÁ½>;ôþÌðüÚZ,ÒZß½¡}FiÜ•÷טñÔp<+<Þql1ÏT§%ã¥S ˆ¥E'(ÓxJ2j9u74éÒsŒù[GDpµ1œMªT±˜œF£ÜpPŽ.£‡ª¢”§M[9cæ ÔånÖ<›Ã?ðRŸ~&—À·ðø/㮑ðÿÇ—úN…gñ‹_øas¦|$Ñlˆc¯9WæÅ<5qiRXŠî”¡„Ã9:PÄbg¤iS«]GI]Ô«V^ä:uªRítÔ0ÿY«Z–”ªª}¤Ô%ˆ®×;¡‡ÅV¤)'Z¥—%8%Ï(έUóO ~Ú ñ÷‚>1jºߎzăš=¶¥â_ƒ>'øk&•ñŠmnÉ®<9©éž“RžÛS¶½E–xã[ÿ5bµ2ÜCWÍuŽu:¸NÄæ¸ôëûïí(¸ÕþÏÆT©ì!ßSÂà ƒ ðóU'ö”2ìº/èEU¯]fUë¹àgW˜T”¹a*ÒQ—…‘ÏÄb°2\ÄGŒ¬±4ùÙU̳% 2¯ûºTêå˜|ðÄ]$øƒÀÚõ§‰ü>g–Þ×ÄJÜ\h›@Æ9fÐõ¿$YkÖi*&øj2XÜD1Nq–):©Ib=¿´öت8<±¥F£¬Ábðù–mšU©S2Ács õ°Øªqö´éag‰•,· WUàjGNTã†ön3Ãá'­ì©ÖŒÑ2Xj?°—Á=6ûáwŠtüñíàÛÍJ×,u;ý/á·Á_‹^ Óì/ô?ëöÞ2š]\ÚêzšjVZÕì×?ö¬Í-ŒÍ)šNÚu±•s^ áÌÚ•ZøªøœNIˆÄòû,Z©ìqÕò¿mJ¢j1ÁJ…<"-N´è¨Æ—ÕãN*\•êeë/âî'Á8RÃÃ*Ãæ”iÒ¨ªa'Š£ŠSMÅañ´·Ž èaèÍ)Rn2©í>‘ø•ñÅ6_þü ø_oáËÿx„^xïâe÷ˆ¬uMNÃÁ_tGk «øàÒµm9£ñF»â ítÍ!¦žh­¯¦¸¶–8T7&^Ö/1ÆÓ¨œrÌŸ í±•"¥KŠ—³Ëp8z®2¡íêrVÅbiÎõi`i{hS—´…÷Æ[ —Q«nl~iˆX\¾“•£ËF>ÛŽ­*˜l/gGÙÆt|^3WЧY/•[ö ý®þ!]|Wñ÷À/‡_4XxÿJ×ô/ø{G¸Òï­þ'éÚ·›¦ÚØÅâë;[ .†¯mzo^(`„7¡—P†Œó˜ÕÇS¯G†p5¡9ájB¾UW£”ÕÄR»µLo=T°‰U¥…X{ºÓ­9ªqâÅV§_†²Šu°•ðµ3ÜÊŒ*Ó›\Ôñ™:©šBÒPx(JV«ç©ˆ¯<,°ô©Ó¥8é^.mµYxëÄÚ¤£ÁQؽä>^©y¥ ›M2 ¹.>×pšwüL¸ðR«<]<Ÿ uóœV[Ìi,-XÃGêÁÕÅQ«_©Vª°ØlTé{zXxÇ^ƒ«N(T£B{Tt–fФð™VƒÃWxŠ-ã*SÄûxF­ 5:Ž0­ZTj*•¥Võ)`g?k*˜š>£ð£ã'í9eû@Øüý¢^Z8z*ó¥(FSmÆ(JpŒêΜ%:q“œ~ ø—ûLþÜ<-§ø§â‡Áÿmoñ?Ä>ðoÃ=7ÁZ÷‹õ­_á§ŒüðÂ_‰¾/ømà][ÀV~"ñ¦©ñÃO¾ñôãH·ñ¼þT^²´’í£ÖbÐä×ÖÖsG§ÞN—‹qsgëË C Ä´8{)Êy¶/„ÁýU*¿P¯O[©f5d¡E<+ÃV¥ÆaiQ ´©B3Œaõ.ž"¥~ÅgUÿdåðÆâ'8Îø ËtðXI¬¼¶Õ¼Y­ëÚ^YÚi:™í÷Gw‹8ßwBuq˜œe<=L=6T©¬TëN^Ö®"´a:8,šs”ÖZÄ⪸a°ôý…ê×ŨÑõêB–†«ˆ§Zµ\{¨°Ô¨¤”iÒjœñXгNéF¬”iQÒ¦+Ùb•)BXtªSýkýcÇ-ñƒÂŸ¯¾ x‡ÅŸ¼iñëdz¿åñŸÂoxZþ bá×N¸¼žæÿÃÚÞ“.•ö+Û-Jáå•äpÆ–²Âd¬ÏOö}FXVÉzXŠ5àùjTXj˜¼l<¡üZ8˜S©EÓƒJuh5)ª•½… 0tjÖÏr¬ž¥jŽwÕÃ΋œªaÔqpÁb(béÍF1« T¡‰£*ujÐÄ(Ê4¥Gž¼ß³OÇ?Úã†>üZñ>x3àíÿ…u]WÅÃì^:»øã-J=2âëO¿ø_á+[˸4Ÿ ¦¢ÐØ$šÍÞ£«2æòÂÎ+MGO’_CJžQ ~#ªW§§ŠÁá°QxŒ_Ö*5ñ”T% UUž„U±“ÂÇŠzÕðøNj5e«GTéÊYŽ&•jøŠªj8_¬×†)òÅ×Äá¨ÃK0ÅÔú¦b*â%JŒV ѯå_jOÛ?À¾ý¤ kÞ:Ñ?i+ ÝjöÚ4Ë4±Cá'Åú„rNkY®mb”YIou{óQ•<#'ÃçYæõpÔrÅgᯠkÖ¯Œ|/âÍ+ÆñMr5”ƒì:”7ÓKg%µ•àÚífå«)XzÜeÃt}¼°õ¸v¾#ˆ¤¢ðùŽ.Áã9°øx· ðž§²©^¤áÊž3ËÉ(ÕŒ£S…áŽ"ÆÂoý¡‚†SCÙK“‚Ìqõ©{'NHbi¾ƒš£R•E^R£‰¥%ûPбª¢¨ŠTpT {¬›m¶ÝÛwoϨéÓ…téRŠ…:QŒ!´c£¼’I!Ô‹ ( € ( € ( € ( € ( € ( € ( € ( Ÿþàoü@øCªkrž2ñ¿Å/¼Ÿ*x‡Á?¼YãMj[ kŸøóÄúö‘wi-ei7‡¥,zµ®ð ( š¿l˜%¹ý“ÿhÈ ]ò·Á¯ˆ;Wr®vxoPvùœ€0ªO'µxùﻀ¤öPÇer~Q†gƒ”ŸÉ&ìµ}.ÏW%„ªcÕkš¥|>68蹪UÁb)Sݒ朣¶¢¯y4“gæwÆýKÀž2Ð?àŸ_nþ5xÏÁ_´ j¿ |eñ{àOìt[á¯Ä À ƒH±×|Q§[jMá¸g¹Ò®ôÝN9í”ÛD$fÝNOÕæÎŠãî%•lTðÔx–†&9ExÕ<2x|ã^­:•ŸîêáëS\Ô䤩¬F5e8ÐÂâêQù<‹ÛÃÃì F•:µøv¶Tó|¨Ê®.ŒVPðð­N¼èb2êµ£ÍEʶ2TèBuq~oPøeàoÙ½ÿiƒ6 ý­?jÚ§Çž_øãI·Ÿã„>3|2ðo¢]èZŽ·ã­J 2Ðᾚi°Á¦Ý½ô·vk4 m:<œ¹bª±y†*ŽE`2êÔ«c+Ò”h{<ÆP °4ki*¸œD©G =.zqy|q8—‡§~üÁSú–lD”q¹ŽRÃQêÔ­ƒæÆ*õ!gN• éÎ3«]Ó•HÖ #«ZS„}öDµ·¶ýо2Ë)—Þ-ý©.®ÝFâá%´)ÁàÙÎö-ƒ+ɼkàk¹ncc’“µÌÒɼC9 Šý6Š£â7Ò¥îà Ä9Ejîð§K*0Šm¹>ZQPm·)+ó6Ûoæ2štêp·R©N3§S)â—8J)ÆMTÆÕNQi§j‘Eu¤ã+4­Þ~Õ?5Í;ö˜øàã?¯Ù.é¾ ê~*ÿ†‰ñïÃÿx³^ñ$rx¤i²ü(Ñu¯ˆ3ÙiÚ>nºÕ͸ԢžyűH™Pùß1‚”jæKãa‚žž^¥‚Œa™…*³®éâëTn2,HÔÃá(Ù©ËS’¬!9àýY¯g‘ðÕYQž2XÜ^5:²“”02Ãàp’rŒ/'ØÅ_–µYSP”)Q¦±1¨Ý þOû jþ ÕkÚžÃÀß¼mûA¤ô=Câ/µxu³ªø’Ë]ÖÄV~¿³Ó¬ôø< i¨jVé¦ÛØ ,cK‰>Ã=Í I›ŸMË€øýÐÁK ƒ–+ #­)OZ‚Èó*têã*Õå­[ÏN¥Zµ:U'J)Nœnœ:Їp:Äã!_ýŸŠ¯‰TTVŒÞk•Uœ0ôé9Ó¡OÙÕ¥Yá¡R£¡VµJ2j¬*Ó§ÊhòÁñ#þ „>ë‘xÄßü?áûßxkÁz¾™}âýOðïÅOøJ5»+«g’]VÒïµe¹‰^T³À’‚¡ý¾(Äaèæ|'žÕ«Z9&®C"x?àot/Ù·ÄZý¯ÄØ#ÿƒnþ!øÏÄ?.uZÊóN¼¼ðÜÚïÆo_–ÖËWÓ4û.%šò [9u#rlÞdã µ+áëeøŠXeŽ¥†ÆágŠÁºŠ‡Öð^Ú1ÅÐUÜdèËØÊua8%':q¦¥78õa!…«:Ø|]iaiâpøš4ñ1»–R…Haq|ªe8᱕Zt1 Tã8û ­¨?›µŸÛÄž(Ðoþx«öý©¼AâýfÒO ëÖ~øWø+ªx’ãý]#Pø§¨êÏ¢ÝøML„O¥½—Øó|ÐF*±Xjy•*”p 5iÔ´¢ñëê.>ÊÕ•IÆsR¥^‹‡´¡Ô…z•áJgJ´àã… UÁIÁ/|mðãdzév^*ð§‚6ðõ¤77.÷ún«uªGoa¤G©ß[ˆ^èË©a¨fØLNC?¨dÕqtqŽ1ŠT«`jV…lÊ\/%9W­*²©Rœð°Âb+b”3IP•XK >ªõgõ*Ô³üÓ¾hºïÀïÁ:u?Úâæ›âï/€þ.ÛüøâχŸôx‚ûYð†¯ñã'ˆí™¼!Ošåø6ô¾©–Ó¯ƒ£O…”%7Œ£<ib¹iJ5±X×Wz§*t= έ%žg¦&¬ñfmŒ©¡ 75\EbeËõ)Qå“úuâã:œ²…(Ôž&4«aáN¶+êŸüñ'Úa¯†²ü5ðw‡l´/‹7¾+Çð7À^ø?áoxÁºÆ«§Å(—PiV÷ž+Õ¬,í®/î"¹Ô¤³–h’"^+_N…Jt¸­âpµêË+É2 æ–¦%òJ¶#,_JžFŸÖsÁá£*’ÃÑŒ£RU¥)W—‘(b?ÕlÆ”ù0Øüç6Êibia¢•J¹|qU±u©âm*®PŽ‚Ããq ^ÊUcN9Â5hR—¨øóÂ^&ñ—í­ð+Q—AÖ›À_ >|Lñ‹ø‚m.üø]üqãÝ+ÁºV“¬Ö¦ÆOA¢ÅªÝ‹eœ\Em#Hʱ̞gOÍGŘ걄 ò¼³+ÁÊNÕå[­ÇË•ðñÃ`ðÔqUa'ûÊ´(¸¿zQêÍ#)åÜ9…¥QòÏ8Åâñ´¡f,]`eˆi7Ç•L4dáíjS©(sû ò?Â^ñ^µûoü\øƒ¬h凄üðKáÿÃëzŽ•we£kwž"ÖõøºOjñÅ«ýšXtk[¹m$™"–(à•–H¶!“¹ÒËx¦¥hÆ”óLë <[µyಬ²P”çM¤áAãs GÕ¤î«5ZpvM4Rž+…¨Ò¨ç„ÁeÙ–.´"“§O0Æã©áiÊsI¿¬,Ê‹Ÿî¨ÔU}”~´ªU?m¿øëÆ_ <)¯ü8ðìþ5ñOÁï‹ß>3[xÚú>ÙxV’çSðÔènd°»žê(¼¹¤’[ã‚î(eÊŽ%eyÞGU¡Òµ?“|{ñÛÅ´¯ÇïÙálŸ~(ü'ð3|Qºø£ªCñŸC´ð¯|C}ðŸÃúưc‡Àð]êXx.ÂîóGa¬ê7Ë}½œ´¹änìŸ %ÄÌeZ„©äy.i‹…(Ëžµö>VÍ,5ybj×¥† JŽŒkâj:Tå…X+2¯n©„Š Vq™e¸ êÑ:Øz5ð¹–3…•Tªc#R'SV…K ‡ÃòN£Xšôèâë оübøûÅïØoÄßµ5—Å_‰šŸÅ?…Ÿ¼ð[Â?ç·²ñE¤z[Üúô”hñ/R¥˜{l&Eˆ©œc±3„é`êâ°9}zÒ¥ƒ£6ÞX¬WÔðøeZ¥Z¸‡†çwç… ^deV9GâéGêÌn¦+Tïý¡ìñµ°øB¥Z^ô§x¬Â´«ÂzXL-WVªÃN¦}ûIø[Ä^<øÉûø>Ëš֫àâεñSÆzõž¨\xÃs|6ð~£7‚áÖµkxþÉ¥É{â-b!iî­<–%cùQÃråN¬8’®a:ª ¯"͹\î¥‰Åæ’ÃåÔ©P›j2«FŒñXŠÐ÷çì­$’¼ŽŒd#O†1x,4½LÃ0Éðr¡Ik,º•j˜Ìd'/ÝáÙpМ¤éÁÉÓ£'>GóoÆïi¿ ?jOˆÿ¾'þÉž ý«þ|cð-´ ü(ðçÆŸü3ñ‡,'ѯ´V𦾪ú7‡µ2T¿“S†xã{›X ++–û?[R–Ži•b0n8ªùLËŒ¥‡N5ðÕðøz8¼>7¦åØZô¨, Â*xz•¥IÕtë¬?^bç‹§âhV„iex:ù~'æáQΦ3ޡЅ;8Õ-IPrZÓ|ÞÑÑN‚ÅÛÖü ã{Ù?ö‰ñ'„eo‡ÿ<[ñgHÁ?>|(øg§[üW‡À>(¹Ó¼7öߊ÷>µ’fH5WX›J´±…48Lw’Oyæß¯€uépöCˆÇGÛfyÆ[ý±WSŸ-Ááéæ4êTŒ*ËÜ®ð¸biK3œ©á«VÅ'F•JN¶^6ž3Ç甩J–'ËqxŒ¶Uh8æu1T0Uë§NÜã,N2ža° Ÿ¶XŠN5e^ •SêŸ~ i²'‹¾ü{½7ÆÚÂý3Â^M"æ-/T6z%¦›§]Xh×É5ºiºÅχ­/­­nc–ÍÄRFÊʵ‡bjfxŒN>­ ¸Œ6+2¥ŠÇáèK–­l ±‘«Œ¡Iº8ŽkÐrR¢°õå^Œg‡…’«3„èÓËi`0Ø™òÖ¡­Jg=V`ðUaC:Òk÷Ÿ^•:ÓÄNqj¥ëά•Eøíâ?ß|MàÍÿ¿à>O«xËáN•ñâ?Æ ø’ë^ðÆ€Þ*Òn/¦økáÿø‹]Ôµ•º6šªkƇ¦é)a§ ð¬œbÓÚÁÔ'áÌe Ô°y-<ö…kËé,:­(RÄ¥R­\:Э*õñ3Ãb+Ñ…:µéBkʪªÒá¼æ5ZÜCý‹^ÑŠt£Z¤)G‰¢œcN¶5UŒ)àéSÂ}b0¯_EáãB¤*~Ÿ-߉´ø(£s®|)ø§©xo]øះŸ~$h—Ã? [Å©x›Æ~7ox©u¡ðõÕÞ£§è–[ÉÅÔÒÚZ*8n-äŸÈÊéTÆ`xï^§Ôkãñ˜:ЭUª~ÛƒËU QÃÎíÖ®ñÙž2¤(Â6¥u*Ô¨¯8Òô3*qÃÑá'†µ\_Ga©ZU(ãñx¼>Vœ>8Ò¥—a¨EÎröp§:ŽŒeQâøÏÀ>Ó¾hºïÀïÁ:u?Úâæ›âï/€þ.ÛüøâχŸôx‚ûYð†¯ñã'ˆí™¼!½,KÅCžØzS„gSWޫdž¡[ÃyŽ¢Âa3JÙ–7Q•¨Fµ<»ë®8z•¹ªEâ–xjR—4Õj´ZÂÂmaðÓf‘â_Œ_´í‡ðÅ:ÿÀO‹~|+ð—¼}á‹ß‰ ®—¬x‡Æ:¶˜ž QâÍ>ÆKøü©ZËyztýóP·V¶©ìû=ÚGe8u…Ì8ƒ1ƺG'§ƒË”eÏìa™c0Õ1R¥Y5 µñX*.ž2…59eê„iW”*VåžY•oo–ä¸*<>#6u³)T§É%,¶z¸ENN¤(SÄ*N8ÉÂqŸ[­F”&ðÔ±+õ²5 ( € ( € ( € ( € ( € ( € ( € ( €8ßø Ã^?Ó­¬Õ/&†9eTyƒ²,Œ€Ç6êÕt¡AÔ“£NSœ)¹>H΢„jN0¿,e8Ò§É$ä©Á6Ô#hTiF¬ëÆ”#^¤!NuRœ©Óu%Nš\Ò…9U«(E¶¢êTqIÎWÕÒ<àïè—~Ð|'á­Ãwòê³_øHд½7D½›\š{n[½&ÎÖ;[™u îndºi"cp÷4ÅÙØžYaðóÁSËgBœ²ê8ªS¸Eá¡…´“ÃBƒ^Ê8{Nkبªv”—/¼ï¼jT§‰©Œ…ICV²ÄN¼dÕi×\¶¯*©©Ê²ä…ª99û±÷½Õj÷ð%ç„ ðß‚¼%uàKK]:Æ×ÁWÑç𕵎5µÎ‘g‡%³m>[‹;9m¢Kp=¬-V‰JõNµZ˜šXÊ•g<] °¯N¼¤Ýju©ÿ´*6ç ´þÅHÉN?e£:qU¥J*•:ð¯N¤ ¹cRž&3†&œã)C •#^2N5cRq¨¤§$ïë>𿈧Ðî|Aá½]¹ð¾­¿á«gGÓõ9ü;®ÛC5½¾µ¡Ë{o#i´V÷%婊dIäUp®ÀÄ¥Ybi·Ou¨ª±÷j*Xˆ¨b))«IS¯£Zå«£5$¬LéӪΖT£UR’NŸµÃKŸSÙµËí(Oߣ;sR—½©Zx2Ôø¥­¼#á‹vñÌ7šJˆøÂW°])åñIŽÐÂA#ij¶e¯þÐL !'Ëk)Q£<,°3¥ `e:Õ%‡”bè:˜‰)b&é5ìÜëÉ)V“êÉ'7&‘´jT§‰Ž6”1F¼[U£5þ¯UZj4.ýŠRµ+¾E•îþxûÂV¾¾ðG„/< co¦ÚYx*ïÃZ5Ç„¬í4i­î4{[_MdÚ}½½Œö–²[Gº¬mD£R:'Z­LM,mJ³ž3V5©W”›­Jµ5hU§U·8U‚vHÉN+DÒ2„cJ•j¢©Ñ¯ ´êÓŠQ…Juù½½:VŒá[š^Ö2N59¥ÎÙ¾|8ø•ce¥üFð‚|¦i·FûNÓ¼má] ÅV6¦·7vVší…ÔV·FÞI"óbE}ŽË¤ƒƒ§NUcZTã*ÐŒáŽ)Î0¨á*‘ŒšæQœ©ÓsŠv“§Óq´Œ¥N“¡ 8Qn Ó‹j¦¥>EhÞœãkÅJIYIݺÆÞÔ4ý[Âß|á­SHðâø;IÔ´ è:6¡¦xE/´“º}æa Ö^]Gý(iºZ‰¿z"ßóVþÚªUãíf£‰t%Ys;Uxj^à ê«ûïC÷4®éRýÝ>XhgÉ 4¹R§†©Z­(YrÒ«ˆr•z”ã´*V”¥*ÓŠR¨å'7&Ù7…~ü=ð%λ{àx7Á·ž(¾þÓñ5ß…|1¢xzçÄZ’âQ¨k³é6ï«ßy·woçÝ4²nº˜îÌŒ[:oØá¨à©~놿±¡v+Âß³¤­^©AòÅ{”ᡜ㘊˜º‰OYZ¥i+Õšæ”í:Žó’çœçfß½)Ky6ñ4?‚¼1â»øká'Ã/xâî}JêïÆZ€¼+¤ø®êçYi_W¸¸ñ†•üÓß4ó™ášs3™K9tÂQx|+ú¶TãEÒ¥ûºnŒ% “„-N¥NQ…¹c*p’IÂ-*ÑŽ&¬+â"«×§RU¡R¢SœkN)άg+Ê5% µa)¦¤áR¤[jrOÓiP@P@P@P@9|Zý™|ñ³ÆÞñG|_ñ:óÃ>t’ü±ñpÓþx»PÑõYµ½+Wñ¿ƒáÓL¾#Ô-uF±™<Ûô€"Ò9!x¼øî^ÿgæ3¦½¾.’Ã:÷© jp8â0tî¡K£V¯ïZœŸ>·ä¤¡X¦±yl²¹ER¡UÕUçJ𫉣WêüØZó»Rï«§Æ1”%V¬á57 CèÀ€ `Àp ˆIE(Å(Æ)$’²Ih’Kdº!hP@P‰üuø àïþÒ¼;âSÆ>¾ð׈´ÿø?Æ¿|Gqá_ø7ÄÚrOoµáÍb(gŠ Æ°»¿´o´Ú] ŽöGâ8gƒE¬U e*ÕpØœ<+ÑU)O‘ˉŒa‰ÃÏF*ñ„D­'ò©(Êq–ЫB¶¶Ž/ ]Óœ©W‡<#^ƒsÂâagB¾³UèN2V©¦§MΜ¸‚Ÿ²W€þ ø¯Røƒ'Œ¾,ü^ø‘¤Â7Ä?Ž;¸ñÿ‹4_ â¼ èWccm¦èí¨F÷LÕ§i.&S?”þPì¥[Øañz©ÐúäãØqÔ£íkaªÖ­V¬pqšÃÑ•FèP_ãV§KHªõb£MÕ—4¡MJ8×ĪßRV&Á@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ÿÙterminate_action.jpg000066400000000000000000001057721160020716200356420ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.errorhandlingÿØÿàJFIF``ÿþLEAD Technologies Inc. V1.01ÿÛ„ÿÄ¢  }!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÀÂèÿÚ ?ý§øŸñsBøR|)±¡øÃ]ºñž³y h6^Ð\º¸Õlt]CÄÚJ¢â‚VÒ4Nâ5gÜé§\²©X\¬N¤)EΤ¹aÛÙt×±Z´èAά¹!äö]5}?®‰œ/ü4€ÿš=ñóú¦î:g×Wÿgõç£mçúþ ÌD¼ÿàZövåþÒÀ/ùŠ‚·›ÿ-?M{;ðÒ6þh÷ÇÎ?꛸éŸ]_ýŸ×ž´úþ ÌD¼ÿàZöv?´° þb ­æÿËOÓ^ÎÇü4€ÿš=ñóú¦î:g×Wÿgõç£m>¿ƒ_óo?øÖ½í,ÿ˜¨+y¿òÓô׳±ÿ #`?æ||ãþ©»Ž™õÕÿÙýyèÛO¯à×üÄA[Ïþõ¯gcûK¿æ* Þoü´ý5ììÃHØù£ß8ÿªnã¦}uö^z6Óëø5ÿ1VóÿýkÙØþÒÀ/ùŠ‚·›ÿ-?M{;ðÒ6þh÷ÇÎ?꛸éŸ]_ýŸ×ž´úþ ÌD¼ÿàZöv?´° þb ­æÿËOÓ^ÎÇü4€ÿš=ñóú¦î:g×Wÿgõç£m>¿ƒ_óo?øÖ½í,ÿ˜¨+y¿òÓô׳±ÿ #`?æ||ãþ©»Ž™õÕÿÙýyèÛO¯à×üÄA[Ïþõ¯gcûK¿æ* Þoü´ý5ììÃHØù£ß8ÿªnã¦}uö^z6Óëø5ÿ1VóÿýkÙØþÒÀ/ùŠ‚·›ÿ-?M{;ðÒ6þh÷ÇÎ?꛸éŸ]_ýŸ×ž´úþ ÌD¼ÿàZöv?´° þb ­æÿËOÓ^ÎÇü4€ÿš=ñóú¦î:g×Wÿgõç£m>¿ƒ_óo?øÖ½í,ÿ˜¨+y¿òÓô׳±ÿ #`?æ||ãþ©»Ž™õÕÿÙýyèÛO¯à×üÄA[Ïþõ¯gcûK¿æ* Þoü´ý5ìíÐx㿇üwã9¼„~#øcÄxjãņ?øJMÐèöú¥žæ ±y:Ç<×·`ŠQN¶w¦-ßbœEµ*Ô«&éMIGFÕ÷:(â(ât**Š.Í«Ù>Ûoä{}jlP@P@P@Pž|Sð|FðN«á¸o†­«ZkñÁö‰¼/ã- æ=SÂþ Š ñ´Ég«Û[5ŲÉ»´{«9É»4N© S’¼dšk×B*SZs¥5xÉ8µäÕ¿ážèóÿ‡^0oøRÇX»Óÿ±5Ûy¯4Oøu¦óåð׌4+©t¿è2LR6ž+]VÒà[Ýã[»Vµ¼ˆnceøÜEa«N“ûGµãÑù]yék][Üüû‡–½Jÿ—oGk^;ÆVét“Ñék]rþï¹ý1øc—§·NØýÞy[úòíå·K{˜~þ¼»ymÒß»?L~ÇåéíÓ¶?vmåoëË·–Ý-î…¿¯.Þ[t·îü‹ã§ÅOøR¿ µÏˆßØ_ð’ÿbê°þÆþÔþÆûGü$Þ.м+æÿhg^ù?fþÙûVß³?™ö_+1ïó ÛGëy®K–s{/í|uµµýµS~Ó’ñçåöväç§æ/»½>Ò–eW›—û;-Í3 [øŸÙ™v'ìouÉí¾­ì½¢Rt¹¹Õ9òrG×L~ÇåéíÓ¶?wŽÞVþ¼»ymÒÞæ…¿¯.Þ[t·îÏÓ†1ùz{tíÝ›y[úòíå·K{‡áoëË·–Ý-û³ôÇáŒ~^žÝ;c÷fÞVþ¼»ymÒÞáø[úòíå·K~ìý1øc—§·NØýÙ·•¿¯.Þ[t·¸~þ¼»ymÒß»óÍâ^¯üGñçÂû}U|AðëFð^·®Ý\[ÛG¤Moã”×dÒ Ónñ§žêü=t×[h1=¸ŽI˜-u§IÔÁTÇA¯eG[/”]ùÕz<:Rµ¹}›£˜ÐQ|Ê\ñªœ!ÂF¸Š3ÂfûK[4Ã×ÄÑåû4ðØ……šÔydêk®Xݸ4”=ôÇáŒ~^žÝ;c÷ymåoëË·–Ý-îeø[úòíå·K~ìý1øc—§·NØýÙ·•¿¯.Þ[t·¸~þ¼»ymÒß»ÍÖu/ÚF©¯kwÖÚ^‹¡i׺¾­©^H!´Ó´Í6ÚKËëÛ™[+x-`–Gc« ±µx|à)ÑÔ=¼Ú^—uu¨_Û–=sÄþ hÿw*ö8L:ÂÐ…$¬Ö²}ä÷{.–KÉ%²Hûü8,5:)%%¬Úë7»Ùl’оÉ%²I{½ta@P@P@P@óŒ,ÿáYü[°ñL#Èð_Æ‹« øSˆt‹nš–žñÃC‰|3¥¯†n§iE÷†ü#oF]NyWÈͰÞÒ’ÄA{ôt’ï ÿí¯]Õ“mìœ|óíh¬T¿AZIu§{ßþÜzoe(úŸéÃü½=ºvÇîþko+^]¼¶éosä¿ ^]¼¶éoÝŸ¦? còôöéÛ»6ò·õåÛËn–÷Âß×—o-º[÷#~Ý~Ìž8í|+öÆ>-øééútã Ù’éÅ|ÒÙæËìVó]¼¶éos» ¦‰:Æ7ÅúÏf~¿ ´´<§ã7Á?üuý±´/ |GMkSð]¿ìÕ¨j:·…tÏkÞÓüO&¶+ Äy4á–`2)âðøjtaex¨c°xL*Ã(ÅN FU°r¢äÓŽ ”â¢ðókƒ^xÜ“ šâ«{|} ÏK Šnš©§‹§?¯Q—$b«ÂC1ŸÕÕ/eR0¯]Ê’¥ ^[?‰¼=gÿÌÔ ºÖ4ûk‡ñ>±á4µžá!ºr -d++j‚Þ9. ¸BâÞ&¸#ÈC"mF?Xμ.ö VXõ2­' FQ©O ƒÀÙ*ýý1øc—§·NØýß›·•¿¯.Þ[t·¹Éø[úòíå·K~ìý1øc—§·NØýÙ·•¿¯.Þ[t·¸~þ¼»ymÒß»ñßÚÂËø…áß„±7Ãzi?>,°Üh–šÐð‚¥*3»Ä.ÑeÔ.¢ Ç.“àRÆå|½^ }œ£ ÏQâ$½Ú:Gü]_ýº¾æÕ¬â”}ü‹ í*Ë5îÐÒã¶®ßÝZm£jÖqJVWÑŸXP@P@P@P@r^<ð^‘ñ ÁÞ!ðV¸ncÓ¼C§Kb÷v2,–™r ϧkZMË#ýYÓ5m5 ;¬`º²·™FèÅ&“M5tÕšüÒiÅ«¦škÉé±ã_ üQ«øƒ@ºÓ ÚZFmíWĺT· «Ø[³1ƒE×ôKÝÄz|fGh쇫Øëº[ý³I¼´º‹ÉÕt»)öÇ:+ýŸË4Lè.…Iá±x,uìñYuxbpóÑû:ÔÔ”'ÊýÉr§/vq”Xè¹.'Jšp|°Åá±X:ÊËÞÃc0õp˜šz«ÇÚaêÔ§ÍYÂüÔåNpŒ©)ð7…Žcøt¿ø­"ð³ø)5Ÿ¶ê#o†dÕS[}3û8]‹ù Ä“} Úý mØ%Xòˆ©JT!Œ¥IòÃ<5Jë~yá#^ww¬=œq5Õ à¥Ïy¦áITœªÓÂR¨ù©àjW«Eh¹'‰…uåuÊåÏ 5i¶¡ìïæãó_ÇoÙòÏ\ð¾¡|>ðU®§»ûN|7ø¹ñ/L¾ÔḲԬ`ñ6qã½jîßÅZ¯ÙåµmÅ|Í&È•chíìÙ’´Àû(cx~Ž)/윪žuIFQæT¡ÉsúpŽ‰ÕŸµÌ³(®kÊTnféТýt1“މë{iC3ÇäðÁá§hJU°ÒÀÓÂB.¢éáð©*­ÓMÓæ©7QÞ>‡ðƒö[øðVÖõß„ß ´ë^!‹ìÚ¦¬—ºÞ³¨›#8º}:ÂóÄ:¥ôº6•%ÌpË%ŽžÖ–ò=¥³I6›}¥˜ce‚§—Ë9a)Ê3änîs„=œ%Z£ýåyB<Ü’­9¸Ju¥U­#›‰¯¯F.~Ò¤qIF(IóÞTèSP£NvœãÏ q’ƒtï.Z|ÅïìSû._ø£Æ>2ºøC¢7‰|xfjQjž&µûD×7Öº•åÖ™gk­Åká»ë«Û8为ÑàÓæ¸Ý$Îéyr¯Lf'C †ÂVt(à±|M«?gS _ëx©I9<=Ê2†MáR¥F&ŒhéˆÇâñn/]Õå¥^¤£g FxJÎqI)Õ• •!í¦hJu*B¤*ÊS§Ýüø]{ñ_GøáqáXÿáih:žÓ|U«®ÚHš‘ßDöWzM®©—©£x‹=í”ó"²*È¢…¼á±°tóXyû:y¯+ÅFÑj«ƒÃ¸¿y>Fž†´ù©$Ú\Ê<õ*N®—ÔjX\²«­†,TèÔtåIÚªJ³‡$ª%JSt¢êV’„eV«^­úcðÆ?/On±û¼6ò·õåÛËn–÷#ð·õåÛËn–ýß7âÿé>ðÆ·âÍqæM/AÓ翹KXæöäÄÛØiÖq2÷T»¹0ÚÚÚÄ “Ü\C c{¨K§NU' pW”šI[%mv²]-î]*S«R©«ÎmE/=¼¬•®Þ–Júrþî÷Á_jÞð¥Æ§âÈ¡_ˆ~>Õ$ñ¿Ä"dº‚ÏÄ•¥·†¬nÐbëIðÞ§èþ´˜cσBK–mÔ¥¾Ò…áéS£ ©«_ÏvþnïË¡ú„0´)P†±¤­~ïvþm·ÙtÐö ÔÜ( € ( € ( € ( € (抖ð¯<}áï‹–£Éð߉¿²¾üUD-íæõãøuãû’¿*+_¿—Ã÷Ó0\ØxºÞîæt¶ðÔk^fg…öÔ9à¿yFò^qKÞ];&¼ÒJ׺ñóŒÖ0þÒœ{Bò]ÜR÷–ë[$×[Å%kÝzoéÃü½=ºvÇîþ[o+^]¼¶éosã? ^]¼¶éoÝü¯ªþÛ_²Æ‰ãxQøÇáø|SàË=f÷ÄØxŠöÖÕ|;`ú޵eg­Xè²éšÆµim ë&•¦Þ]_ ­g¶ÿi¶’(5¡F®#±Ô)¹áZ‹ŒÒÖqHR„éÁÚu)IÊ3UiÆTý…ñ<ËVŸ¦òlÊ0”^Ʀ2¤(Ò‹•4ÕY¹F­y/«JR‡"XcûÉR§¤êÒŠöí7âW‚uoé~ Óµ¯?Ěǂ ø¦é¿ÙÚ´?hðeÍìtÏÛ'°ŽÖ×—GöIgŽéwnh´W,5zu3*R‡,òzôpصxþ浬{(];Tæú¦#Þ¤åû?zPæ…¼¨Î/ €Æ'þÍ™º« =½«¡N…j¾î’‡%x©:\ê*¯³«ì¹žË E¸:°¡ˆ§*’#kÜ›—´jª¿u:Š4g9Ò„ÝJtÔjN0„¡(õ_ð»þ†2üdÿ„Ÿ ài–_ÿbø„lk}y¼1(GöHÕÝr6¶ùl¹Ûæ¯î@‘9ýE[,ÃrÚ¶pð+¯ß<ʪ`uº?m ÔšöŽŸ³æµ_fã%N¾¯Yb3 /%«åOT/Ý<¾J˜µÍuûP¨×²röœ–¥ÌùTy?ŒµOìÿðïIÓ¾-|IÒü+ªkVÆ÷NÒ#Óµÿë/b¬Èš…Îám#Q½Ó´éeŠh¡º»‚Þ¤¶š8ž ¡NxšÕ0ô êT¡iÊŸ$ä|“©¥8Ôqœ%Nj£ƒSŒyá¾-Æã0±Æá°îXY8¨M¸ÓSm9~íT”%>UíTœ©Æ£§)ÓKÖüã_ üCðÆã?x‡JñO…µÛoµé:æuÝÔK#Ã2 # Ãuos ÖóÛJ±Ío=´°OS@éؼ&'^xlU'Bµ;7fœd”¡8J-Â¥*q*´äéÔ¦ãRœœe>RÙJ2/4'S©Mʩԧ5 ”§É(ɤa8¦¯Û÷|a´ÿ…ŸñsOðÖß?Á?.´x»#̲־%\À×þðœêFÉöiãK¨[ ÝÏ‚n`°OW'Ã[›%Þ0ºùJKO.Um¬ÓKE©Èp–æÆM[xSºùJKO.EkZÒM-~¥¯xúP € ( € ( € ( € ( €1¼EáíÅžÖü-â+uMÄzN¡¡ëZmÆñ þ•ªÚKci)•Õ%µžT,Œ¬»²¬ ¼¬yXù·áÖ¡âì|3ñ&§5ÏþNÞ¼×.‚­ÇˆôkËwà/¶Äe—WÐZÙ¯žÒµ½+^³‡)§î_†Ïð5aC‡Âû’Äáë*öåœéÊ1×§,í®¶I=-î|n'K.ÌèN­/i‚ö´êòt•(Í:”ú%¤\wÒ<®ëþ]þRj~x+ö1ñçì£ãOø†þðmüGðÖãáæ½s¨ø®Äßê3ügÿ„–Mè²hBHãñZø‚]MfŠÚÍ^ÔHÑZ¬™—.i§0Ê9h`pÉâÕáAåÅa¨âpµ©©~æ­iΦQ¥Ïõ™æ4éÕIâ«ÆŸ­•`ñ˜>&¯‰Çb!‰£f8éÑ®ª©G8†*­z¸ZTÔ/Q8Ó„(THB9kÀÕmÂŽiýâ?ŠþýŸ>3üø“ñJMSBøwâïÙfËáÕ‡‹lô Ä6Vþ5²Ö|?â;mîÓÚUõÚ\Þéff· kwBG+Ûúc:¹÷åt©Ê¦?˜`1xJQK›Â×£Fî.Uéχ“VTã´ÔªÓ©R•9|–_ƒ©‹á¯‡q—öM\\±JS§MP¡ŠÊò÷ORSœaÏ‚4­wïÉrF…NOœ|aaãˆ_ü}ãÏ[x§Á…ÿo|Cñt?4ψþ&ð‡„ÓÃÖÖx›ZøW©JÖÚìÚ ú–™ª_iRy²X$7Z]0ìóðžË)ÖÅbiÓ¥‡Êóº2ÄÆQ6¾q™MTxˆ9F£*XœÇaùš•HÖ¹óÓ¿ÑEáñyŸ`0ô¾½W–pÝ:]Ia?´¨ÑËò÷S FSPšúäc FhÐúähà ‰…%ˆ© }oÀß|ný¥>x«Mý«üUûMŸ†v¾0¸ÕõMöNѾxsÁÚ_ˆ<7¨iQi>3ñåÞ©¡ßÅo­]1“OÓ,ôíθÑf·µ[W¼¶ô–êØ þ«Ë#Xü²xÖ«‹š§‰šÅákFpU|F¢¥‰µHSt0õjºUà«W§>,áBŽ[C,=<Yc°ØŠ}«Äb¨¿öŒEãÉB‹Ã9á±U~±EÎhÒp­'F‘ÇjŸ<-£þÈ>>ý˜î´¯ÿÂìð7‰õ/Æ>_ kÑZxkC?³ŒõoÝiÐéxzãL¾Ó~ͶòK››NÎ ’9Öáyòê/1Æøo˜ÑýÞ_„èbjTp‹ÃcpPÂàå©7)bªb𓤩ÑöŽ”JµÕ?«b!G¯†ú–uƘšµ#ì3J|MŠÀ8µ)ã)bò¼UnzTã&ãNŒkJujÖtàèÑsƒJØj57~7ë>2øûLü^ñˆÿiKöbо%[x"ëÁ^.“öfÓ¾6i>3Ñô iÚ]÷†m<\,îï´íV°ºšm¢† º…­ðËÝ räò¤ð¬¶TÕLm<ˈ«‡u ×¥V§> FßX§BH`Û©Ëõj‘öt“ö•œÆåÜ?‰¡–,}&WCç_²xÑ©Rupó Ü}Ÿ×g|e:ðOë<²£W“ê’úKöJÔ.~üø‰ñ]gÆ?SÇ¿õ?xmwáf…ðUþ#kž3_ øwÃ7ðN“â-F=;Ã~.ñ3YÍe{wi ¼¿ÚS_K§C 7Sz8Ü3 ƒ)Ž8 Ø =jRÃ:ò­[ž7Uá1”ThÏ 9UöxzujÓ¥BT©Ò•:P§J•‰‡×øƒðó§7VZUgFó¥,EN5ªJ¬¡Fuñ4é*T1U\u0Ê›ÄU«N§°ýøMà9>ø'NÑ5ÈuoßMwâ/ëð£Çˆ|q¯Ìujð¤ <sj2É…«qg§ZXYF8Õ}šp*p§Ë$’ôVÜûšTáB:TãË qQKÉ+o×Ôôª³@ € ( € ( € ( € ( € ùïㇵ½_ð·ÅÿhzŸˆuE/„¼má(gÕüSðë[ºŽrúm¤ÓÀ—ºÿ†¼E–±f¯0?`¹ñ-¥º5ΫN,vëT9ceRš ÷ê¾-lô²gŸ™`¾»‡ä•Zoš é¯Uÿo-:kgud׈|Uñ]÷Äφ~?øuÿ ›ãæ‰ÿ ¿ƒüCáOíð»ûKû/û{KºÓøÓÿá#´ûo‘ö'‘ö›}ûBù‘çt_9_#ÆW…8{°öu°Õ·NÿWÄR¯Ëk¯‹Ùò_^[ß•¥Ê¼¼§Êó?êð¯õJ‘©ìýª‡5ºsrË—åkl´äèü3ñ*ûÃ~ðÿ‡¿áMü|¼þÁÐôícá¯ÙþÕý—aˆ¹ÿÛ²y>oÙÃù~cìÞqÛ”ô±øÇàð˜\/¹?ªÑ¥K›™.ogÛ–î×å¿*nÛ_Dá¹ÿ ŽøÍøùÇ<|;ôéøœAéÛ¦?wÉý“Œ_f:yyzK¦œ½?Øxõö!§÷×—§ámºYraxcö†·ñ†¼=âßüøó}¡x£BÒqÏý:cþ'ÐzvéÝŸÙ8Åöc§÷——§ôºiÊaãר†Ÿß^^Ÿ…¶éeÈÂã¾óD¾>qÏý:cþ'ÐzvéÝŸÙ8Åöc§÷——§ôºiÊaãר†Ÿß^^Ÿ…¶éeÉÁ6ïňÚWŒüEàïx7ÁŸ ­e¹ð†‘ã-: #V×þ"ëöš–“©x’]%nî$‡Mðÿ„®d±°šB‚âãÆz³÷iV[–žuRUe¢³½£d÷]Þë§*Ûeíe9l°^Ò¥t•iZ1³ºŒ,›Õ[Y;][NXíðÇêZõOh( € ( € ( € ( € ( € ( € ùÿöNÿ“Xýšì€|ÿÕuáÊú€ ( € ( € ( € ( € ( € ( € ( Ÿÿdïù5Ù§þÈÁ¿ýW^  ( €<¯ã'Ä-Sá‚ÓÄZ‡tÿëW¾,ðƒ´Uñ Ç…t¹õ/ø×Að]Œú޽gáÝv}>ÆÖç]ŠæW‡I½¥»*FY œkWÆà04#Së/„'Òì¼Coâ/ˆ:ÏÃ?ßø6ûL»×4Yï|ß ßÛ¦ŸªGwkqy%½å­–ØxG«F›”ka1YuÔœcÏ:iС[£6ñ5}­øw†šÃ·Š– Ѝ£Zjj)àœ©ÊXluZ¸xO W«OJ‹Ä*U¨ÚœaõŠ«W (ÖŸµŽ§.…%‰õ+¯Š ôïéŸõ/ˆ¾Óþ!kðÜé^ºñ‡‡íü_©Á<3Ïúg†®/ãÔ¯íÞK¹Hm2[JÈÛntí^­z8ßÔÃ9Ƭ ¹§IÓ¤«ÍU„\7 5¦¥ðÒj£÷‘̧ɇÃb+8R§Š…9SŸ=éTö“öPö5e*°kÒ§8¥í&¹TT½Õ=¯Ä¯‡7¾3¾øqeãÿÝüCÒí~Ý©x×ÅZÇŒôë! ­ÇÛ/¼/ûjV–¿g¾²—Í–Ùeä ²¡i¢Ö"§‡~Þ~eVTýøÒ䨨ËÚ8ÝC–¬£J\ÖµI(;I¤kU<;¡ëØ'ü<Ô$øt·ñ;øníü –yÛxÅ-õ'>X_O¿Y¤-‚€Ø0¾Ú¤z14¶ÃbªÒ¡F­?~jեѣJq¼jU«)Â4©Á¹ÎSŠŠnJôéTŽ&8'NQÆJ.q âÕg¢ÜÕ+s¸¥87%%8»ÚJíÓþ0|$Õl5­WKø£ðëRÒü7­ZøoÄ:–Ÿão ^Xh>"½¼N²Ð5«Ë}MâÒõ©õ ¡¶ŠÆåâžI¥H’2ìœ>¯K¤¾«^5¥Jµ×²©>âëÊO‚q¡…OYŵKiòÓ\ÄS^Ö­Z¿yZ…5V¥8{Ó§JNqIÁ^P§)SšS’QnIÞ.̇ã'Â\|I·ø«ðÞ‡6—dºñô>8ðÄž µ»PØ}–ãÅIª2·\Aoå½Ò·›4qã{¨5Wýaý¿î/øþç¶³¨Ÿ²æ·´³£U{—Ö•Eö%bŠúÄ«Ãûùáoí£Oßtya¯Ú¨ÝÓå§8T|Ö´'¿vI¹uÏ‹¿ ü3ámÇ>$øŸðóÃÞ ñÙ‡¼a®x×ÃzO…µÓk-õˆÑ¼A©Åa©ý¦Ê ®!û5ľdP¼‰¹ë'†Ä,&!{ SR’£SÜ«ËG&©ÊÓ´TàäíeÏ Û™]ÑN½*•¨/mFƒj¥J~ü)µ7I©Ê7ŒZ¨6›MM8|JÆV‹ñ³áψ>*øàÖ•â=.ëÇ>ð—†|iy§C«èSµÖây5!mýŸimªÉ¨M=­žyy¾Ê(¡¶ñF…2Ë"êI·JT*U¡Ž¯¸¬·SˆƒMT£V*%*‘Iû:nuå†Nn2úÖEÁ:-µYÆ…<ª¬§RÎhÖ¯…œZq©NŒÔŒ”½­ªÎ‹¦çÈ•ײ’=b² € ( € ( € ( € ù;àgŒ—À?±ìõâwðÇŒ¼`4ÿÙ÷àÛ`x @›ÄÞ'¾?ð®<>Á4ý bk—ù1þ±@,¹#4l_ÁU¼Mã‹WÁŸ†ÿukÚ¦¦ö ªücÒd‹²I Œ=ÄfÞV ´Ù¯ë·õù~‡i´—e¦ÙZê~ ý õF^êû;üKÓÅåÉù¥’;O ìàÞûb‡t¬‘ª¬“M"I+›_×õóëúþ¿[hÿÃK|<„·øsã¶–Ë´No¿fOÚ4ZZn ¹Õí¾ͦǘ^´JÌà«6ùÇ„þÑ´ÃÍ{áÕ”^.Öµ­âWÁÿ'†§ð/‹<«ë_‚~)xCźìZ4ÿtŸi“ÞG£h÷¬‹>£m‘R6•Å<=g„Írœc¥:´p•1ʪ‡'4#‰É³< 9Ú¤áÍ×ÅRçQnjÒŒ%ÊѼ9%‚Îð²©3Æå˜Ü5'5>_mZ—-8Ë’3”S{¾[-[µø»ñßÀ?ôê·Z÷†>àWÅÏø3¿>$ü%Ñø·Âú‡‡üEñ á_Ž|C{Å?ÙwâÀ§‡áð¾¥ã/èž'»‰¾ø‰c¢øe,ôh|_KþðÖ©ö´’ëUû.Ù}UK‡öµ'OƒÄg"¦•èÃ…ÌfžYˆÃµ‰O‰ÅÇÛ,taN„ñ9ŽÙVËù%ˆñ¥N_ظ\<“–5d¸,½Ÿ/½WZR§‚Ì)V”°•p'zµªáoН‡«%±T0üžíð«Añv‹2x ëá=¶»aañ/â߬þ>Kâ_‡W>Š?ë3Õì|Cá‹;+ûï¿Ä±øµ4ëk­E´H—XÙ­Ü[-¼:§˜èTÅd4²Å/ì¼F‡e“¹^þ×J40íÑö Ï ™W¥ý³Š•gBtñÊx|N%F¤ý Íaó n+žY¥Ç2¡öR…:t#*UcƒÅ{Iß“*…àrÿ«ÇÑÃà\V©Oà÷¿~0xƒá]Ÿ€á;øcTø]û&|Yø§7‰| -‡ÅOø¿Kðf—¤ÿÂúoŠ.®m|%uuàË­VâëÆ6þ¼Ž}SM_²±7ímìT©„Ç㱆"“Â`3L_ ƦQ(ÂPÃa²ìÖž3êºIÒ•«í°l0µ\«á±XÎl-),4¼x`ó :˜™ããC<ÌsifU"”Ý,E Êšç§q«õܦaC…Tð”ë`- ׇÕÜ=WâoÀŸxƒÅþ'mÁ¶w~Ôìbý.Þ Û[\iß¾7øŸÄþ;³{KF)E¾‘á BÊp’F¢å%û=Ú'G‰tÂbcõú¼]G)ÒâlÛ8ç’m¯kÂÔ0x,]¢ŸïkFQKÚBTãV¤#A*‡FŒ!ÃØ"Ž& çLáe¥lJÁ¬6Ÿáp—.&ÒRt`ÜܧRòÈñÿÁoŠÒx›Æ>4ðÅ·‹ôß±~Óv¿´«‡W¿[Ç#ðÍÏìåáß…sj¾‡âÜÞ‹U´ñ3j -¿‰SN™¬¬µ ¬çK†²¼j’ÂáòX·Wš† ˆ°UaKØ·FY—ÔÍ0Õ*:ÖN…L->J Qb`ñŠ2R‚ÅЗ~9RÅβ¥Rœ°yœæ«¨â*e•±Þ×SØÊ2n­„ÅPzxŒ+ÄàptÜ ã ^ Þ øcñáMïÃßÛü3ñ÷Ä‘o¦|r±Ö| y⯲|Dðþ­ñoÇzŽcñ-Ã[ ðþÕ¯†‹}o­i¾Ô&ŽÆãU‚;µÈ>ÕzsvÃáñ8†§‹†'%ËpTçÏ9S£õ,Faˆ©•W©‰æÄORŽ„'J„¨Q§’á0ÐÀý^–¬y牬±Ÿ]­†ÎXÊ´ªB1–2U2Ü&c#4¥F8¬ L-w†uêJ¶*†iŽÅÕÄàñukà*ûà øÃÃ?ïu‹¯†vð‰¾ü'ðÔ)á oÃw¾ðˆ>ë?î/|«bêwKaã=94ëÍ3ßb1é· /ØÈ…%îu—.w„©ˆ©ˆ”³If4q•åÇF¾,ÀÔ„S”ëµ:˜×o p©‡©*Šº–,MG^žEV4œ'Cû^é·kO똌.*Ž"³MÒ”«{*‹¨ÖÄNž.M^µõ§ôíq€P@P@P@P@|ÿû'ɬ~Í?ö@> ÿêºðåz7Ž~|:ø™eŸñÀþñ•­¤‹5ñ‰aªO¦ÜFÁâ»Òîî`iô«Øäã¹´–c`Xf¼¬yXêô½6ßGÓ¬ô»I/e¶±…míßRÔu ^øÅB OU¹¸¼½‘W ç\Ï4ŒÞìy è €9-_À>ñf×¼á=må•ÛWðæ©’õò1¼³“sÉülynù£o+ÞV<æÙ‡öq¸¸ûgü(„V·ÿºRÓ~xWIÕ @U¢ˆêzf—otaVŽ6™¶nŠ6Û˜Ô©·Ë`Ûå±ý›>Ú¦Ýþ$xOh>Zx7ãWÆO Ú#Ÿ=•ÛIÐüwm§]m’æyw6“ǾBå sFß Ûäð[ĶY>ý¡~8x}T³%¥ÝçÃYŸšVH®%ø…ðã\Ԛߟ'R·˜¬<àZFü,…„>ý£4Žt‹¿|QnŒOÙøá/ ØY7|±â{±Ðù€ÛÈ6ò#oÚ/ÂÚ?ÉñÁŸ~:cϸñwíoSðýž1¼ßxïáêø›ÂV1®rdŸ^Ž2fÅM¾A·ÈõoøëÁ^?Ó³à_øcÆzA*?´ü+¯izý€fª5Ö•u~Ìþ ²ñïÄØüFž¼Öí¼â »KÉY/§Éç¹<[‹Ìh'“÷Õ®öÕiÓ]tëmm¤rlÕ«¬d’¾°³ÓMü­~×IÛÚ—ö­øcüxãvœ<²ß³·Ç-WÌ#–]¾ð¢ÐNgXƒnÂ*á4YÆSÿC<*åÞõé«yk%®†o*ÌãoøOÄ|¨Ô”¯SNËö¬ýž.dŽÞûâ·†¼'u+¤QY|EþÐøc$îÛc¶ŽÃâ%Ž‹p÷LqˆfB!pA=”±zêôkBª]a(ÉièÙËR…z–­Ò}£(þi×¢x‡@ñ5’ê~×4i¬ÅPÑ5+-VÉ~ò­Ý„ÒÄXw³[~†_¡±@P@Mã_ ðF­ÿܱx£Å^,°ßKáOøK_ñ¦µ§ÙÜ—[+½yt+í<+ivÑL¶³ë—zlWFÞ³¼Ÿg—ËàÇf™vYÏ0ÆÑÁÆWåöµ#+n¡ù¤×h¦\iÎ\­Ù7éª8ÿøh›aŸø³_¾_ú¦íÛ8ÿ˜¿^ýô3ÐãÊÿ\8e_þpë—}eÿÈïåþL¿«Ö_òíéý_ðøh›aŸø³_¾_ú¦íÛ8ÿ˜¿^ýô3Ðàÿ\8e_þpë—}eÿÈïåþL>¯YË·§õýÀv?á¢m†âÍ|~ùê›·lãþbýx÷ÐÏCƒýpá•øYî]õ—ÿ#¿—ù0ú½eÿ.ÞŸ×õÿØÿ†‰¶ÿ‹5ñûåÿªnݳù‹õàßC=õÆUÿág¹wÖ_üŽþ_äÃêõ—ü»z_×üo*øáâÿ |søMãÏ„Þ(ø1ñði>3Ð.´±t~yÒiZšbïC×-b}`¼Ó5›m>þ%$%¢+|¥À?×Wÿ…œ:åßY}ßþ_äì}^²ÿ—oEý_äíåß±´ZOì·ðÂß áO|n½ñ>n¯YË·§õýÀv?á¢m†âÍ|~ùê›·lãþbýx÷ÐÏCƒýpá•øYî]õ—ÿ#¿—ù0ú½eÿ.ÞŸ×õÿÛ_Cý ¼¨êÚv…®é>øu¨ëéÚ#|Fð6¿á}WÔ®dYé6~,–Ú]kwS2Gk¥OªC}vìVÖÚfG ßÏ2|Æn–2¡‰«ùw ‹Úi»äv—{[¦äÊ•JjòƒŠG¹WªfP†xÛã÷„<-«ÝxSÃú~·ñ/ÇVERÿÂ>‹O¾—A’E ñˆu=BÇBðs24r‹]SR‚úhI–ÎÊè)Ḭ̂9m?iŒÄF‚ ]ÜåÓÝ„S”µÑ´š]ZGf/Æc§É…¡*¼»ËEÿŠr´W’½Ý´LòG[øõã“»Wñ†—ðsGlÐ>A§x«Å/ûÑjß|yá¹l‘dL+C£øRÂ{v2y:¬§Ë–?‰Çq¼Óä˰ª*;Ô¯}õÑSƒVÚñn~±Z¥õ¸>”±Ø—ä£em·œ“¿f”[Kfs#àë˨uiWßõki<è5_Ššî·ñ*êÖàdyúd>3¾Ô-4&!SJ¶±Š8¯˜ÅgùÆ*ê¦:¤"®¹iþé-×,½œbäßNfÿËèðù&W…·³ÁÓ”•½ê‹ÚJêÖiÏ›—o²‘éº~›§i6±ØévZe”,Vv°YZª¡c··#@F`(Ç‘9NMÊrr’º¼›m|Z6Ö²}ô½8Æ0J0ŠŒc²ŠI|’лÓðý1ýjmn–¶š­·Ñé¿gÓ壨:~¦?­·K[MVÛèôß³éòÐØ:~¦?­·K[MVÛèôß³éòÐØŽXbž) ž(æ†Th¥†dY"’7^9#u*êÊH ‚àЯuî¸ìÿ—}ŸgÓÊÚVµ®»]0¿ø'ð²öøêöþ Ó¼7â»GŠ< -÷Ãï"ŽUWÅžºÒuu Ãr{…<€ 5é᳜×o«ã«ACEKÚB;»8TŒ¡wmùzyiç×ÊrÜUý¶”›ÞQ$¿ð8rËOSRÂÛã7‚™fðWÅCÅv£Áÿìl¼M§4 ó‡ô+7ÅZ}ë`b÷W½ñJ(ÈûÜŸIƒãle'ã°ð¯N:9Bôê-þ%¬%-4IS^k§ƒ‹á,âÞ´èOuÚpôVJi_[·7ÒÖµ½@ý¤t›[›]'âï…õ„̱ÚÁ®jšž¿ð¿R½•ÄpÛ鿬¢·‡Ny¥"+x|S¦ø^êæR#·µ•ý¶_že¹•£†¯jÖÖ•DáQ=[\¯IY-\’î|†;'Çå÷xŠ?ºŽÕ ùéôKÞVq½ôSQoµ¥ ) ¬VAÔÞ½sÌ€ ùkölc©|#ðÿ.€“^ø•6§ñÄ×Î7\Þë*¿žõâf¦NÒF—£ZÀ‚ÃD±¶‰c†Ú8ãþcã,elgæ’«&Ö«¡M7xÓ…$à ´²æiÏK.i7»ÓÙÃEF;+]]ú¾ÿ–½xéø~˜þµòö·K[MVÛèôß³éòÓ}ƒ§áúcúÑktµ´Õm¾Mû>Ÿ- ƒ§áúcúÑktµ´Õm¾Mû>Ÿ- ‰¿k{Vøµ«|/ý”ln®í ø»©ßø§âeÖŸ/•u¥|"øxêz˜2€Ö<]7…´ˆÞ7Vk ¢ÈÑ}R• Ù¶|š¦ø[R¾RÙg8ø×Ád×+öWë‹M(§€ƒ“k÷SÒ®+û;J¢‡>#8ÅR˨CU|:•ØxÏÀß4¯´Çe&£â¿…V ܵÄpÎ-c×´›M3RK¥·dÿ‰«lEE7VU)ÔkÏ| ûnxßÄz¿Á­KÆ?³'‹þ|"øëáïøâ~£ãÏ jóOâ¿èí¦Yj> ±¶ŽÿKÐ/.íu$±Õ¯. {ËHmoRÉ>Ùöx=œ_apØœï+¥Äkç™- v*X/ªÕ…ð¸ÞUö˜‹Ê•Ztì?ÓÖ‹[¥­¦«môzoÙôùhlaø›Ãš?‹¼=­x[Äi¢ëúmÞ“©Z?m¥ì/¡ Ã:†ß©‡ŽDI†@FølEl"Ž+7F¾q9u„ ÛIé«Ó®–Ñé²i4âÖ¡‰û%ñãê>!Õ¾xRã^Ô¤dÔõ”Ñí`Õ5Iå=åôSÝÿ€ÜÉÛ“ýw sBµ¹’víu/Èð6ùÉTÈ~*ñî¹ñr{'Áå÷†~Á4Öz‡Œô+©l§ã?|/=—Œ´ÏéÒørëV¶³žóU¿×´©!Ò¬aÓ®íîRfigš{«{4´ #K„ȤñYÆ5Ĭž; ‚ÆÕ9Wn±‘“Œi{Õ«B¶…wuh:ø˜ÔŒpÜ•0«žEàò|f S³Ì>.®•Õ ¯…X « QT\”%<>#:“¯:QÃ×ÁÇ 4êâ¢éyÐýµ¼O†­~#]~Ïž"_„z6¹¨ø{âoÄKOix.ûMñeÇ…®fм3u£Úk^>ÓmÏØ..ollí!‰®.m£iäÓæ5xl“^yu'˜ªsÌ.¾WNXyN¦*xüq£V4¥5…¶"RÂR•Y{Zî›­Jƒ§W íáçåÆ4òyV¯’b±´3GN0¡OVÒ©F¥XSXª²Â§ŠtiÅS¦¥J•LBŸ·ú¿¦x?öŽñ~«ñ[@ø{ã¯^*øg |@Ó¼C¨ü,ñ†±â=V¸ñD^³·Õ®m|Eám&¸ð¥&‹9¹[-Fî[”xÌD®’˜yªäôW›UþУW3ÉèÆ¶7åP©^XY{,duŠœ+NŒ',±¬?Åo|VÐü)àÇ+uu§kžÖž×ân¿©ÿÂEd—þo ^xvÞ×>ÝnážE‚(-•^G¡ŠIS›“«–c©cðÙ¾#‚¥Z²ú*8œ5HÓ®±S¯uB…5VxŠ–n*§³¥;QöÝy~eZ¾;0Ëó,L·€ÂÑǨÆpÄ,F´1ÂÊ>ᮇú¼$Ò­ìiN´*Ô©N!àßÚËÇ·ÿÂ/ˆ¿­¾üDÕ|1¯k~ ð݇ÆÏ‡Þ=¾Ö5-G}m4_Ûh1Esà(µ ŸcÔu;f‚fóvŒ@äo_$ÃË-̱ùFcý§ý“ìÝh¼-\=5 Ö†Q†"|Ô§^JÔ›¢Ÿ2§'Q¸¯f§ÍC:¯ vS…ÌòÿìʼÕ*U"ZÑ”éÖ­NrÁ% C á…ÄÂu”Z¥ˆ…*Šu\©ð?iOˆZÀ;¿|Røwâíg_¾ø•â_ |4²±ñŽ›ã|QñFµãoð½œCkøsOðÌÖ3imsy#[;C{»8¼ˆ¡¶~ŒÏ+ÂիØL§J¾+”à§QÊŒ°”c…¡”`«,ãYÆJ+2ŒåЬ¥VÃV¨¡‰”§7R8àsNÒ©S ?«CìÜh⥉墡ìj3Üüñ߯šïŒ4߆_>ê5oXëð„›Ÿø[âw„¼`4k¼×ô Í_ÃÐÅ“­®–f»‹O»·‘n­lï_ÍF‰#Ÿ–®U‚ú¶+”çÇ×Ë!øŠÃÕÂÖ§†Zt!‰£í.±§ˆ«N–'‘ÆxiVÂÍÆP¬åG¢9¦6•|5,Ó(– ª°Øzñ­ M7‰öUëJŽ)S‚Ž3§J+ :’’ÅÕuhÁFt—´÷?ͯüu›ÁÑßëß â êß CK}yá;$ûú“!imímãËËàæv³’(Ut5Óî#6š¿»ñeJR†4Ÿ5hÃ/Š“ÙF³KÞNßÄø¢þ6ÓnVsÃTçbrØrTܨGá’ݺkìÉ'ÂÖ‘³J2ûA×tèºWˆ¼=¨ÛjÚ·akªi:œže­í…ä+=µÌ/€v¼N§ )ʰ £¦¬šÛ¡ð-[M­ÓÐ֦˲ØÇìïðs¶<¡Ž˜Æ-ºchþCè;,q6œCœì­‹¯è½ùi³»}þziíÐþ >–ŠþºõÓðý1ýkµºZÚj¶ßG¦ýŸO–šì?ÓÖ‹[¥­¦«môzoÙôùhl?ÓÖ‹[¥­¦«môzoÙôùhl~~jÿ±¯…?hŸ‹Ÿ>&~Ôž}r [Ið?ÁOÂe¯i«£ü<ð­¥Ä“ø’Y< âËd7&ñ¯©Þ‹;æóía´€IÍ*Ÿ°Àñ^ÈrÜEŠöž2¶/›Uö1Ÿ%J³Ž€¶"ƒ6„§R­J<Ôç_QF¬Ô=ØÆ:Øœr¡Í|›/Ãa¡†‚¼]lf"”19Ž*k™¿r¬éà)K’„å ¹ã^Œp•å…§~Êz§À|Vð—ìõà‹•ø#ñ¯àoŠ´­[C“Æ&í<ñwDÒõk ]Û7¼Q.¡sgâ};Z’Æg‡ÏKyôËw¹–ÞÕSdfA[ˆr,f=ÅFy¦WÂâ²Ê®„!*Ô1~K†„£õj8èVÄTŠ|Õ(Q‹›f˜:xlyÂùž›§â*aó[6ÔpÔ§ ^.isNTê{|hQGÖöªæ«:ž™â„Ÿo~ ~ɵðÿ™â†;ýŸ5ŸiÿÚº"aé¾Ó#·ñEÇÚäÔ–ÛRûÊWËÓæº’lfÝe×Mlß.|wÄYÌqð›‡F…gN¯¼ó:Ž.›¦ªÅÖ©VœSœ#칯WÙÆ2qùü Gƒ*å5)ræÃe´Õ.h?›å¸ª«IÓ÷(aêÔ¿=¥ÉË)Ê1—Ÿ|Tø}/‰?lÏø*ÂúÊxÿGðÆï‹~I%‘ßüÔµM7Àúü1Â#m?^×õ¯[$ªf Z2¯H¡ðÖ-`ø;ÇU¥(ÔáÌE_ìšÿfž?ˆ°QÄá’z*¸\˜Òä^å|\«ÉB«¥UûÒU0ye;7W=¥[#¯Iò<·Ãg²«(ËÞ„ëâ²úÒ禔3|<©þò““ýéø~˜þµñ·K[MVÛèôß³éòÓ}ƒ§áúcúÑktµ´Õm¾Mû>Ÿ- ƒ§áúcúÑktµ´Õm¾Mû>Ÿ- ƒ§áúcúÑktµ´Õm¾Mû>Ÿ- *ý”xý›¾ Ž˜ø} vÆ1j;`còA_Øt£K¥¡É?·•Š?´–¿|º„¾è÷—‡ÅïÿÂ)©jS½µö—àm/FÔüOã»»Iâ"KYïtMþØ®¡d–ÖçÅÖ·Q0{pG›ãž[–b±PiTŒy)Þßě䋳Nü­ó[ª‹Õn½,£±Ù† /á·Í=>Ä4——2\©ôm6vvš}¥­……­½•…¼6vVvÇokgimÃokmoªAP¢"FŠªªT‰JR”¥)6å&ÛrÕݹ7ÌÚÖMëé~»ÆŒ ”c”RÑ$•’Il’ÒÅ‚8#ØÐñõ¬kÅÊhE{ΊO£q’QwI]ôz[ÊÚRѯ+û8øÄ> ø# ø+ÆšiÒ5«{¯BÁol/Œ6Ú׌kJr¬ðôiáãVß(Â’”¤Ý(8ÆNø|®¾¯ ÆiFž[C;X•FSöTªãç•U§X©*õ#9ÐÄÚZÛ’ò…:tÏ9ÿ…/ñ,~ƾ.øSÿßüWÚŸˆümc ÿlh¾´Õþ3êž,Ó¥þÔþÔþ΋ÎðýÄ7[d¼FMþS…œÄÒÆáiç\ ‹•KaòJ<) dù'û‰e¸l\y9ª:5hTé*Š¢é:‘qgF+ˆ©„ãêP§yçSâ'‚\Ñ^Ùc°•©a5rJŸµœãÞº|—½ND›=×â‚|O­ü`ýž|S¥éŸjÐ| wñOß}³Oƒû)5ï¶‘¤Ÿ³\]Gq{çêE‹Hn ~M‰óW›„«NŒ8¢3—'ö†Nð˜tâß=íL!RmGÝ~Æ…Y©Ï–ï/2“ŒKÆáqpœ9J>ià3\&&ºæŠöt)e™¦s»’Rå­ˆ£X9Móó(¸Ær…ü-ø/ñ+ÃgöVþÙðߨÿá[xƒãÅï?âq \bÚøÌøþ©?Ñ5I´~ÙöûO–ÇíM›þ"ØÛ}ycðžÛ3’­h×ál›-¦ù'®7 ,•â(5Éî¸,&Õ%jRö~åIsBü˱FÔvãÃ5øáþá_ûwÙWø¾××pߺþ4}§½MrTåO‹ÿþ,ø²ãö® ØCüFÒ> Çሮ|Coã½;Á‘\¿Ž|5þ•¨.¡áøõm7ÏÑÅÏØ#j…|ô·i§‡,Åà°˜L‚ž:Œ±4òþ!Ìqج2ÑË _€¥†¨¥(ºnPÄÐuã¹Áá¹>gMKÑÅá1Õó<Æ®¶®/‡(åØ\| «C ŽY†iZNt•YAañ4á*\ÔãˆupîXŠ Éþ|ø›¤üløãÙ7À³ßÃÿ‡©ã]Z¶Ñ<áoxÿQÿ„ƒÂ·ðZø“Äþ)³h§ñ.çØl-­§šÿS‚{‹éä-k*y?GS5Á¬'RÄq |Ïš`iÒ¡…©‡ÂQž‚«NŠVŽ'Öq¯NœiµA¬C§QÓoe˜‹dñÃpýË3JXºµe‰§ˆÅU¥VŽ6„ãJ´šœ(až&UqªU›©|,%% 9Tý™>)xïྩðŸÆ t OÂ_zÿÄ?®±ãч~7øs_ñ?Ž5mSHžÞG¬|?»m'ÄžU¬÷Žö£jÓ¬P‹•‡Ìð˜œ/›S­:˜¬.KC%Ìp¥ËW .]—á©â(U«þÏV­LFŒ$åF•NhªBšõq9~+_‹2Ú§K˜æTóœ¿æçMâ*U«)áqXxòâ!NŽs¡ˆ©Nîo7…|ØjUëZýf ´?‹žñÛþȾýœôÿG©Ý>§«|uñwÆ/øƒPÕ4ËÍ2Æ ÛhÞ-MB‚Ñ&º7óëÖZ‰•/-ã²d\Zú˜ÜóÙåù…õŽ®i,u«Â…<,*¥j´§RXª•¨IΕZjQ£ 3§Z©9TœiÉ'æaòeZOÃôÇõ¢ÖékiªÛ}›ö}>ZOÃôÇõ¢ÖékiªÛ}›ö}>ZOÃôÇõ¢ÖékiªÛ}›ö}>ZOÃôÇõ¢ÖékiªÛ}›ö}>Z]ào‚¿ ~ø£ÇÞ4ðOƒ´ý Å_õ–×üu®E>¡y®ê,ó¼&£yp4ûcssq?ØìVÖÛΞI|Ÿ1Ù}\Ï[.Àå5q3–]–]aè4¹i]4”šŠ•GÞ4IKØÅÊ4ù#)"kEWÆ<}kÔźpʤ›÷hP„)Ó„#~H.Jt£QÂ1•eJ—µ”Ý*|¾£Óðý1ýk‚ÖékiªÛ}›ö}>ZVÁÓðý1ýhµºZÚj¶ßG¦ýŸO–†ÁÓðý1ýhµºZÚj¶ßG¦ýŸO–†ÆTšî‡·má©u*/Þi—šÕž&¡hšÝÖ§ÜÚY_êÖÚSJ.§Óm¯5 > ®’&Š)o­ãwV™k¥F¶"g*iR§V¢„:3®«ºêÍG–+,=wEI§5F«‚~Ê|ŠMSTœß"¯)“–žÒtâ§RïñÊ”g8Æî1jM$Ó~û(ñû7|1ðû@íŒbÔvÀÇä>‚¿®èéF—KB?’< ¼¬r?´$cñ'özñ$Àÿfsâ¤ó¾«â¿oé3J6þèH¾¿³IKæê0Â×+›âú2©’Õ”åÄéͯîór=,örOÉ''k]} Ô<Ú”^žÒ"ŸŸ/2ûùZózu4ú~¦?­~Gktµ´Õm¾Mû>Ÿ-?NØ:~¦?­·K[MVÛèôß³éòÐØ:~¦?­·K[MVÛèôß³éòÐØ:~¦?­·K[MVÛèôß³éòÐØ:~¦?­·K[MVÛèôß³éòÐØ:~¦?­·K[MVÛèôß³éòÐØá|Gñ3À^ÐeË õg^¦B&£MÛN¥ TrP§Vœá9FP’ޱ40ÔñÕ+UŒ[‡ž+·=:Å:³§Ô³ÃÂU`”\ªÂÞÍNé>áHe ¼†¯àŒŽëŠÁ§Ó\®7Ný7Ñé«ÓGþZk Æp„àï %(½V&ž«G³ÔwOÃôÇõ¥ktµ´Õm¾Mû>Ÿ-+`éø~˜þ´ZÝ-m5[o£Ó~ϧËC`éø~˜þ´ZÝ-m5[o£Ó~ϧËC`éø~˜þ´ZÝ-m5[o£Ó~ϧËC`éø~˜þ´ZÝ-m5[o£Ó~ϧËCcð”/ª~Ó¾6ªZ/|øw®J½mŸÇÞ3økeá[IHE|¾ñ”À¹}pi1þ‹À”§y•[5NR£þ({Y4ôWiN?'ò_ ÆS‹ž_M?z«&¼¦é¨ü›„¾î½>̯¿>$ü§ÒDp›²V)Z+›OçjØ<n%ã~iNU²þ_Xžœ9â«ã1sÂáh:Š.TèÆJu*Ô„£R*4Ü%.WF¯¹íaƒË0•ý‚ÄWÇã)eØxNr…:n¦ ‹¯Š›…§'†£„n…%hÕÅT¡©áÕwV×¼eûB~Ο³×Ä]⇊<ñ§ÇÚ·§èÿ ¼Sgá÷ðgü%Oã=_Cð÷†Wâ'…t¿³iÚ,ö(×fŠUÑ/Ìsiv6ŦKæšY<×C'â,ü—S!žiZ\]×–+ASujUÄaëÔ„«Ê¥\ ÕtªÒœiconXiFJxg›bñÕå_+˲úùƒqŒiâ/„ÁÕ¯_ÅN“«N•*œÛ«:•U8(Âq{û]~Îú×Ãoü\øëáoŽ>ñ§Žü!ðïÇž ·øYáï\xïâ§k¢é÷‚¼G¡Oö¿[éž$¼µ¶–=Zk=¤qn—R‰¬}L->Ï+×Èrì›—âžW™TÅέJÕ²ì&#8Ü‹ÃÒXü6¿<¨Oý—¨rNTHO‡,ž[ŠÎ¥*XiåÔèâ±x^¦aêb(SÅÆ†&QxŠ•°Š­°jjœ1 ™âg£"—ãíz¿®j;oŠþ |;ñŠ´‹¯ƒ·¼=#üUÐô/‹š—ƒ&¸×|6× ÔÅ©’ÊÒ MhÖ=ÒæîââkÛ/\[ÃñÌx_#ÅeÓÄc8¯/áûâV"­(e˜œÓ)ÃÔUaJ*[u±cެêJè*ï C (a?ÚzñQ¨ñ\Y…§‰X |=‹Î*ÓÄ{?nêað1–>iÒ¼yhQÂÁa9£)âë¿kZUá:”~¯ê:ÿŒj¿ƒÿ|=Ä‹žñLJ>/øã£§øGCøy¥øjÛáŠü àgñ¦•†5çûV¡ã.'†ksâ¦EY^Í]¶þEhpþ#‡ø¦†ˆ¡™ðΞ:ŽeV­ç×£©F _„¿ÖiV§N—Ö%ÂX›S©,UalN?…qÒ§>4ÍpYn+.çöŠñ¸z•èÔŽ-FªW‡Ô«F´ °ô?}SÙÐ~Ò‹Áyõ·m|ð'íu®übð>¿á3À> ñ·Œ¾EðßBµ¶ñ/ƒ.t›FÖüDÿáû&£g㻽6ðë£NÓì´í*ÖõVÊ%¸µ¶dÔ~§—p~Œqœ,£Î%–ñUT²z¸ŒRÃá¨áðÏÚGC ]RÃU¯‹©:øšu18˜G/«ÒÃùøG˜fyn.® ­:¼% mL7µW†.xZ´Ö.PŒ¾¯Nj•j0úµ)ËØSÃó¸â*Ö¯mñWˆhÏŽÿ<àOßtO€~øA§ø> cÅrü4о%ø§Æ¾.ñ§‡í|Tºré>)½ŠËIðî _X¤D°ÜµÜ’©7¸ûÌàpyNQ•G5Ï0ÍqÜ~?†ÁÇ,54réBŽ"½zԠꚊ®‡ÅÖ©íòÌV5­,-ÆjX¼º®P£‡G(ºXÏí:4e[ZnœáéÓ…:µñSðËöèÔ4_‰? l®l ~ÓV?¼káÏø—áº~Î^%øGyàø¼Yxšt>#ðOŒFi¶ºF±ud“[k»ZëNYÌQ­ë£ÃôSàªXªÌ8O“¼>_šK4ÃâjN¦ V½:xÜ©*q†>åNrÂ7<..xiE¼$1òñ˜ê´0µ³O¬Ò£S T«—Æ%†•Ö¥,WÕñ¦ñ¯„¡ŸRU*8ˆºŸY”jª'²k¾*ý´Æä8:ëRÊU,M½¤èâñÙe*³¤¡:n ªÕ¡‰•iÇ5*õ#N—³ °Õ-h‹ñWâOí—ðâU‡ÅH¼-£ø³öW³ø‡}àØ< êPGáyõÿ‡rø»áô:Íõë^E·®ê6º‚k$½æžºpµ€&«„R†6X¾ZÜ‘ÃÓ<*˜¬NkÃüŒãÄb±¥QBÒœq¨áq9„骿gÂ5—B2wÃB  ×”¢}éû(ñû6üì?á^ø|Ž1Á´R¤  Ž«÷J:Q¥ÒÐäŒöò±èÿ¼¦üKðn­á FæãN7†ÆûIÖ¬–6Ô<;â=PµÖ¼7â=8J 5ö—®XX^Ç€Ç!¶ò¥VŠWV+R§^•Jb¥N¬e Eìã$ÓZYê´hºU'B¥:´ß,éJ2‹í(»§¯f›|7®êwyáZ[hŸ<9onÞ Ò-ÚCa¨ZLòÁeâß K?ϨøGT{yžÚ|´–Ò¤ú}èŠþÆæÿÎrzù>%ÒšrÃÊþÆ­´”u÷dÒ·´WIíÝYZ߬å9¥ÏªBЯ *´úÆ]Õ÷„·‹×³Õ3°éø~˜þµäZÝ-m5[o£Ó~ϧËOS`éø~˜þ´ZÝ-m5[o£Ó~ϧËCcçOÚâ>¥ð»áM׈4¿ˆ ø[5Þ¹£èW9ñ¦›¬x„xzÃU–X¯µ xCDÒu ¼eã(-Ñç²ÒgŠ;6Oq{*ÚÚJ·+ÃÓÅæ˜<%ZuªÓ—µ›¥B0ujº4çRe*Ž:*ÔP§‰ÅJ\ÔiIÆŒ^"¥SÇ9ÑËs+ØBtêS”á/’> þÓ?tücÐþ"ø—Æ<9࿃ÏÆ? x¯Çíþêšå¶…pÖé†4KIe“Wðv©ŽH5]BÆÒégŽdòDq|ßCœexhäUq˜l¯3Ãf¸L®Xxãž5¦5W„cŽQº¡V•ZQ”)Ó¨äéT“©%>XÑùÜ›‰­ŸåX™…\Ç+Î0¸ŠñÅK°´p‹UÕÁVVž&ô±³X˜J“Œ],4ðÒœjÉÕ÷¿ƒúímsªø'â7Ž>0x ÅñƒêÞ+øQ€­¼9mà]7^Ó_UÑ×ÀÞ2ÓRçTñ&§¦Ý¶fÑk¥!’ÖkâóÍr–÷ Îæy$pUÞ/ªP§š{fêˇ—³’«ƒq†á«ËÛ^qöu¡ìðõ#N)Ö i—â3ŒÓ –gt«QÂPÇýZ¿öt¡Í`kCšòÅ.z¯©:ueN êï:°…U‡§OÚ|¿á«¯_ ü%ûlxúŒÛ^ø³u¥ÛYÿ¼𞟻Å×ð¬ÞãÆhu¼A¿Ã:„:7öC[Él¿cûj°¸”íìÂÿgâð^eµrí3 |0õ'íê{¸oõ‡8Âfw£w˜bÕLzª§˜NªÐ~Î’æÌV? œqÖaKË C[N°¦ÿ}ýfU?hîÿá.ay\e w´öؘóAEý#â­[öøÁñgÇ^øGñWGø#á/„–~³×ÿ„ûHºøuâ¿x«à§Åo…ºoƒüg¯ü;Óüy<·4ðþxÓ[Ñáñ¯„¤—pi²éßN!´Ò£»·…ô——^üó4áËÿ 'ÄýCâ@¶ÿ„ã÷æßí£Nßý¥™°\&óa¼O 󅳟ìü;ÿVid4½×"¾±ý‰Âàïí=îž+êÞÒÜ•}‡?%êòs>êøš5«qE^gõ“ûUÛ–ÿVþÓÁÏ ½×¶öþÓj^ÒÜŸ»ÖK£ø÷©Ïã9<5ã³ðãã¶Œ¿ |#ñ€› ¿…&KMa|kðïPðÇ›s«ÂOö,‹·“ì·¾bå6Å´¸ðêpgeyWε ,hf™DðÓ©<\a-:8º„«Íû9{Eá9GÜqRöœÞç#ëË*Ñ–'‡0‰ÎOœåxäáOšU~©K…TaeiUúâš|Ï•Óäq|îPù+áÂÏøËàçÁ_ ø¯Æ_µ/‰gi|ðïÄÇÁ}7àφï-Kð¹´á‘ÓµÍ.ú?éþ9Ñüo¡x§þ9Ÿ­iz®•c%¬-¦L«41K#º+ÀÞfYÁü]”á1°”0ñÅË3Ës:5þµQ–_‡ÇaÝ ÓPN¬10ÇJZ©NJ’4¯5:}õqt*ÔËœã´0t³j5¨Uƒ,] Ú† …ZSJQåŒ!„{s9:©¯fé^\w‚ô/ÚÓÅÚ§ñ_âçíwñ'Á~ÔaÖôxwö}ðÇÂ;OSÓŸf‘Ž<_àÏKÆ~KV›íš5ÂÛÛê7Úk½ÑA%´þ½^Ƭ=yàø7,Ãf¸ŠU(Ï«‡¥ý…„XU?­B^Ùhbñüü¾Î>Íÿµ{.^iµìùù½îHwàñôpyílëYûJ™m_cn[gà°˜>_i­ý·Õ}§ð׳öœ–Ÿ#”¸aðcãO‰¼Iû>ß|¹ø‹ð›VøMðÅ~ øÓÇüàí?Ã~$ð‘øoíŸaðý÷Œ¯üAeâAyáõÔ-"±Òî-¤—É·¹ÖtՋͺûL·†q¸¬ß‹1\A—ážUÄø˜c8º“«†ÄQ©™TÃN5iQ§ÞËûJ¬[“¥ÍËiS”fᡇÈrl¢•y¬VGˆUèb£Æ.5!N–.JöŠKFŒ)FJ¢t#:Ò\Õ¥F®ôçÁÞѼá x#ð=¯‡üáÝÂÚ´æÉo£øM¶ÒtØd—jù²%¤*ϸ‚qÍ~Š•­åýt ¼¬ttçþøsâEœz¡¾ÒuÝIî2ŒðøšQ­FjÎ2_Š{ÆKu$Ô“³M4o‡ÄWÁÕ…|=GF¬6qüšÚIìâÓOª>hÕæø—ð¼´?ü3{ã ÃòÛüKøg êšÐëò¬ž2øu§%î¹áëÌÒ]hÑëú`XÞâ{5[EùægÁxŠ-ÕÊçõŠjÿº¨ã‘Zè¥e›èß$•—źûœ»‹(TJžaa5dªA9S}/(«ÊÑInýÔÏ ø·Âþ3ÓF¯á/hþ"Ó<×·{ÍP¶¿ŠÞê#¶{+£o#;ø_)-´Â9¡ud‘Ôñ•ðÕð“t±'B¤~ÍH8´½îŽ*÷·»%§g¦ŸWF½DJcZíBJJý®›³]SÕuG™ürø?{ñoCðÒxÇ—ÃoxŶ5ðG4í*ÃÄ £ë––wúTË©xwSxíµÝ:ãHÕuÖY¡䉙ž$’ ²Üd²Ü×#J5¡,6+^”Ö•0¸¸ÅV¦¤£zu[¥MÓ¬“tí.T¤Ô©çŽÂQÇà§‚¯ÍƶBpœ¡:8ÜÝL%uÊíRœ¥ØzŠT«ÑJrQ“…J~Cà_ÙSÄúo¼AñâׯýkãF¥ã?†:÷ÂÏiÚ·„4¯ éZ©}e5œ^Óü?©ù>µ‚ÆÞî+›[t¸—:Åñ’ •ý ^kƒ©“ãrlU¶†'…ÆF¬+Ô©ˆ§‹Ã}n.¤êÕŒ½¢p­IaàÔ~­*S©Nq¥G‡ €ÇÒÌòŒ×›K‰ÉÞ&4£ì!J°Ä*qTéI(×úÅÔ­‰—=JÔa‡Ã(Ó9é|:ýœþ'ø/ă\ý§<{âß…^•Á? “Ú…µàÓ¢{éž8ñþ…2ê~=ѬtÉ&°º‚Ò Ùà´šd[}š]ñæ N&¾KByÞ.œéÖÆJu%Fõ£(â+G5*QÆTj3¥Š”çR„ÝZ‰Êµ_kOd“Ã,>˜ÖÁä¸IáçKiá§ °ÃSÅ®ZÑÁûHû?«%ÈðVÁMΚæt¼Kû+kÚå×ÇË/‹“i¾øåw§ëòx6ãÀö‰ð·Œí¤ð˜¿ñ ]vÖóTŠîÏÂÿfs-¬1-â>ç{mÓsà3j8,?Ó«öøžÍ#¡_ÛJ›ú¿×ñ™\©û9E{\F'š8‡Ìé{?vªMæ9U\n/6ÄRÆË G:É«åXªœ*ÁÖž ê\m9^)ýV…ù°êN8‰Ô«)ÔŠT ߈ÿ³Ïµ_^|Kø+ñ¿VøâßhÚ^…ã¿/Á>ø‡áï[èÑhZŒÞñÄéÞ ´¶ciý¡’3ZÇ ‘æg¸Ç™SÂP¯Æ`ã˜e³ÄON„ç:U0Øš*žÆ¼téV…5*Ô#ÕùkÎ\ðV×–ºÏˆÃbeƒÌ°8o¨¬DW<*àý£®¨ÕÃN^Êr¥ˆ”êáë„kâ©)Níé_²Î›¢ø;Â>¶ñ¾·©kzOÆã—Œügâ;}SZñç‹´ëqª‹¨ínlbÒ »Xíím¶}¨Y[YÁ[§V–N‡F†‡Àà —å~a–`°qœß±ÃãpØÚ Õ¯8Êuñ1©Œ©ˆ¯ZP‹ÄÕæÒŠ’ö|$©W.Ìðø¬|ñ9Žq_.Äâñ’¦”}®—â=ž §l6 ¬³Ãá#VPªӔ]F¤ªzÜŸ ·üg¶ø»ýµ·ìß .þÿÂ=ýßiñ5·ˆ¿µÿµ¾Ýò•û7ÙþËö3þgž6ì>nõl¿4Àû>oí NÎݽԨã¨û7GÎêýo™OšÏÙÛ–\×§ébpXÇeÏiÉý•O1‡'-ý¯×þ¡¯72äö?QÛ–~ÓÚïOÐõ-OMÑl.µMcP±Ò´Ëš{ÝGR»‚ÆÂÎûÓ]^]:EoÈËÈê­sBœç%Nœ§'˨¹JúÚ6Q»“éoÓNÉJ4âå9(Â*í¶’Ium»$ŽJñ®¿ñ­¯Á Þx¶ ðÄC©x[áM”,om|Kw§µÏŽP!𥖫o4˜†{ûó'ƒê²ÞÌqn3Å/¨Pµýû:¶wÓÙ¯†]ÝGå{/›ÇñF œ0¯ëu“·»¥5¶®i.œœÉ½9–¶úáÇÁËß¿‹ÏEÓî)nthË<~ðô“ÃÊ¿h½Ô/~ÏluMJüÙÛÒ2ܯ•QöJ|©ÛšoYÍ¥kÊVWòJÑW|©-‚Çæ8¬Æ¯µÄÏ›–üZBš}#›+·y;+¶{=zP@P@gñ£Çqü.øCñ?â,Ž©ÿ?€|Yâˆm>mæ‹¡ÞßXÛª°*ÒMy ¢C4ª;Ñúè~uÁ&þ#ø¢o„¾,øñÏSÑüyðcUÒõ{m']®< ñNÀø×ò\CpLæU¼½ÕeerZ5=:)"U(µ¾Ak|Ö( € ( € ñÿüøYãýM¼A¬øhé¾-1$?ð›x?VÖ¼ ãVŠ~Íowâ¯jn¥ªXÂIJØ_Ü]Yίné#«á_ ‡ÅCÙâhS¯´jB3KÍ)'gæµÑv6£ˆ¯†—>´èMu„œ_£³W^OCË®þüOÐ2ÞøÛ>¯l™1è<¥x¥xâÖÏÄþ ›Âzª©ÚVçSÄ}ðþnå1|î+ƒò|F´¡S -…;®»Æ¢šV¾œ¼ºvѯwÅ­ *J”­eRjßÞ§Èÿð.m_m~mö–ѳö߆Ÿ ü]n™ÛqàÏŠz®ªÎ“áÿ|?°²´wd_øHî;‘v+ÍâUàI+ý_0NÛF¥šï(ÍÝÙïʬץ½j\c¥[â–ò…[ÿä® ÿJ3[Äß­ä!û2üf¶E>[\Yë_u›g”dbÚ'ã\÷ïÅ&šÂßå æ¬NÁ+Ï—f±¿-l,­²ç©{k½è%;éÓ£]Ñâì³Déb#ßܧo•ªßð_-Žzëâö¥§ø‡Ið•ÿÁ_Öž'×tígVÒ4OøEt¹¯tÿÏ£Ûj·Q_iþ+¸Óü›yüC¢$’5â¤M©Â&hÉm¹> Îbì•–‰û]-¯GÛ]íuÑi¦«Š²«^õ£nŽž¿„šû›ó²¹Ð/Šþ&Ï‘aû4|n½)þ°5ïÀÝË!HoüiÓV|àñJWx]ËæÚþ÷ ]¯R¦Úö îüÝ­ÓË7ÅÙdmjX‰zB]ê¯Âû}÷ ²ý£5Ÿù|ð¯†Q¿å§ÄŸ‹vVP!;w‡>ñ¤7S©ËùÚ0#¨Qö”f>_m¯oßãáM®”鹫]ÝsIÓÖÛK—Nݹ*ñ»PÁNIuœÔ==Ø©ßÍs/VnÙüøá¯•ÿ„³â׆<bÜ=‡ÂŸ¦£âó³Æ_.u]9\?á FS¸ùÙÂð^WA©W•\[Ù””!÷SQ›}/ÏòÚÞV#‹3‰Æ„)aWI(¹Í|çxÿä‡wáïÙŸáN¨YëzÖ›¬|Fñ„Ése®|Q×õ?ɧ^Æsþ‰¡ë¾á{åÉÄú‘¦¸Üyä×Ñárü [ …¥CD›„“¶ÜÒ·4¾mž#ŒÅÿ¼âjW³ºR“qOÊ? }H÷êì9B€ ( € ( KÆþ о xv xžØ_hš†‡}©iÍ´Á©E ëšv¿zŽ Í¦ÜÝé–ðÝ@êË=´“ÀÃlăomò>zñ„ô‡?µ'†þ/Oa¥—Æ Ãð£VñE-ŸLñÖ˜í}á;]RLm¹Ó<[¤ÚÇ¥' êxÂV–¤I¬Î—ß Ûåý_Õ¾² € ( € ( € ( ž4I—ÆŸ´ŸŠu»mÒi?¾/ÃHnÕÁ/>)j^ñç´µ™sæK¦øgÁ¿ &aŸ‘¼G"mR­¸Ûä|¡è € ( € ( € ( OÇ> Ð~"xG^ðO‰ š}Ä6etÖ³µ¥ýœªéqcªéWÑ3MÖ´íB [ë+ر-­Ý•½ÄEd…H6 3øMãÝquïƒÿ/mOÅØ‹¨µ4†; OŠ~Žd³Òþ&x~Í\¤rJͦ¹¦BIÒµuš0£O½Òî/¾A·È÷Š( € ( € ( &ø³ñãÀºf™¤øgO·ñÄß]Ë¡|8ðŒ³¼1êšÂÃæÝë:Ô°«Ë§x/A³'RÖ5 äÛB°B%¾¾²¶º?@ý o…¿­¾x6ÃÃk¨M®jò\_kž-ñ=äi¡âïk×Rj~'ñ=úG•ŠkíVâwŽÙ ŠÒÙm¬­ÂÛÚBˆmò ¾G¡Ð@P@P@P@y—Äÿ…Ú?ÄÝ/NŽ{íGÃ^*ðÍÿöç+Ôìõ Qm&Òôí7DÒ›k ×õýVËAðç‡t…Ôo--?´õ=wRÓìak««hîÕçš(‘äLå*ަ ‡¥íñXÚÔðô)ݨóÍ·*•gTt°ØjQ©ŠÆWäŸÕ°t+â&©8½iÓŒ£ˆ«R~ʆˆÅWŸ+—% 5תÔc¬¦ã PÓÚU”)Ý9]xž½ñÏâO€<3ñXø™ðbÛH½ðgÃ|PÑ.<ã[Æž×í¼3 6¡ácÆ÷ÿ ¼>þñ˜•ìäK9´{è.m.e¹°º½m>ú >ª4áZ¥* ¯-Yf™N].d£ ”ól\p”ñx7)F¦&8iª¯Ft°õ(ÿ²sZ8ÈΞ˜<<±xÌzT3^0“JxŒ<ðôáUÇBœ¥JŒkB¢Xz´±XŠU*ÑÅÒ”éºxg‹ö«‰,|S¢x Sñ߃4¿x†Á5-À·þ)Ðí|a«Y4WR›­+Ãw±ê:ª¥…ùó­í]1cpsˆ_lF­l] ?ûDð.^ÙS\îŒb£.j±3¤¹e ^vJ3‹½¤›ó¨WsÀ`s Ðú­|)J››´ê(%J$£’S©vŽ®RŠåNIÛüUø]wãkŸ†–Ÿ<sñÍ]îþÛøÃÃÓxÚÕ"²R‘®|)¢u84ébºböª2$§ä`Æh§‰§Z®{zX~ok:~üirVXyûIFê•åæk–³T¦ÔMëJ8iÑ¥ˆ’¡SãP¨Ô%UÊŒ±Tã+9¹P„«EE6èÆU¸œ“tÿ‹? õo¿‚ô¯‰õ?E§u'„ôÿxr÷ıÚè—×z^³rú¶¤÷©†§§ßÚ]H` o=•Ä2”’U…8:5ñ’t0”iâ+TM{:8z´èÖ¥^¬×»NJXŒ=ZufÔ'N½ÆN5`åU#*©aªÅÑÄWš§J”×%J•%QB•¥)ºp”Ôb›äŒ¥nX¶´%ø…à }:ÓW›ÇƒI¿ðÅï¬5I|M¢Ç§^ø3LO—Qñu¥ëÞˆn|1i­¥<ú¤nÖ‘.¥jÒJ¢â2ûÊ…hV©‡•ƽ ¸z)8ÉT§[Rtp´g¹£WZJXzrJuªBp¦¥(É*…:“qTéÊNU§‡ŠŒ[n½%9T ’ZÖ§U\é/~ œÜ¢”%i<+ãßxí5i<ãO øÊ=T›C×_¾"ÑüBš.µl\i³i—MÕ"VRö·\ª܃5”?yB–*Ÿ¿…¯eZ:Ò©hÂoÙÔW„í ”äù[´jB[J-ä§i*Jqö´ãJ\ñŒÜã J;Æ2tæ¢ÚI¸M+¸»u”â¿>1ÛxcVOx#D¸øñrþÒ;­;ÀºEÀ·¶Ñ,nKGoâoˆ¾"0Íkà?,ŠÇíw‹%åï•,:E†¥t†l¾ü0ºðÅö©ãëxËâÏŠm µñŠc³{/HÒ-äûEŸü ¥O<ïáߨÜ(€Ï5ÍýÑ{ýJyî]>Î~úÁ@P@P@P@P@÷м'áŸh…|a é~%ðæ­·ÔtmfÎû ¨ÕÖHËÁ:0Y¢™#–)“l‘KrÄÉ$jÊ~úü\øMñóÂÞ þÈøQ{Æ xwÄÞ ñÏ…<ãÿ>—ñÃú€|W¤xºÃÃz?Ä]R «ønùôuÓD>)kmRÊÙn?·uAÐn†a–cck`kÔu"âß>„ÄåØÈBÒ‡-g‚Æârnñ*ŒêB¥(Μ•XS¯‚Ìp5cxcðÒ¤Úöu¡:xœ%{E§%‡ÆÐÃW•;¥ZåFMF£k’ñÆÿþÒ^ø×ð‹Bøuð·V»ø-ãÃá·Æ;ßx[ãW|}­X\iú\žðì~-–ÊÛáÅœ 2Kâ+éYoîukAZ[YËq{µQ§ŠÀâªÖR†;ÈëP„#(Ô§„Áfxl^?‹æNÁ„c†ÂáeZ«tq3©Q7†£[³(Ŭ6?-j.‡³Ujbë9*”•NŽ %ˆ«SÚº•1ŠÔ¨S¥J8xQ¥‰ž+<¶÷‰þüO½ø£âëYGÅ}SÁ~:ø©ðÃâe´þ×?g}ᮎ<¦ü<€Âg©xËÁÚÇÅ/éz‡€æžÒ/ E{gséE{¤µÖ¡>œ²ùªUòÅVs‡öFc™ã#V£µ)ÊÇcaºxŠÑÄÐÅ,§‡ÆN”kRu¨Ô¯,¾Q¥%КÊý”¦ïŒÈ°¹]L55ÍS:G†•KR¦8YbŸöœq8Hº˜lN#ˆ§€Äc¨S­†Çá§Ç][ã_€u½gÁšÖ…áOü~ñïŽ/ì4·ýŸ´Ÿ„ߨæ‡ñÃúŒ|o¡XÍñ/Zñž©o¯iWþ$›ÄÚ¦š¯¨k“Úé÷q?³òÉf°o*Ô囀ªªr'„Åby1R£‚£…—°ŽOø!ã-:?„Þo…íìn4_Úö‹ø“⛕¿Ðå’ÏÃ>?±ø÷§xcÄ24:‹Ù/m<[àÈ­©–î»E¹†kqö|ÝË*¥–S”pëýE–H“R䥙W©‘â1_*“q–+¯:±R£)ÂN3nt¹ú±UéKÄ8ŠqU¾µ›d8Ü:µ½¤røå”ëÔNK÷r¥J…zIÍFr‚”`¤ª%/ž¼gà?ŠÚGÀ‹»Oü4Ô|#¥üý†¾9üÕõÝKÄÞÕtÿø‰´Ÿ†1iZ§†ìü3âMGPÿ„oR°ðf­sÚ¥¦—yŒÃucnƸïÅâc›b±ø¹a¡J¿géåø©9(U¥›â§ÃbªáãV—°§S1£‡jRœëÁUª¨Ò´a>ܱÆ9¶ ‡“«J‡fyŠ®—"©„ÅPÎtá/}T‚«Kë4êû?e*ô#BX¸ýfx_±~xoÅ·®¼q¬|4? 4}/á7ƒþÙè“jÞÔäñ߇u]ST]WHOêúŒPø#Mµ¾š;jòXjŽº÷¤iЏ¼š“rÄñ6¦"´žyŽÁÖ§…¬—¶¢ðpÌ|f)ÒL2Æãÿ´hakÇ RºPÉè¹âjÓ–¾?-‹þËá,<"”2|»Ns‡ð'õèe ,*—-gK²ÚÕ¯Co®SPƒŸ·äïüWñãᯅu‰ü+¯wâÿÛæ|?øw¤ê><ñ¥»9u€êú'†mî›ÂörÉ Ô5çÒì£y—Qª1^_Ãúò=]¼­ýt96°øáñ]™5y®ÿgß?ÊúF¡ëßµè ‚Ñj$ÓæÔ¼7ðÚÕ²ñI‰'‰5)„¶ÚÆ‘:b¬Ö| ðëÁ_ t™4ox~ÏC´¹¹kíJáâ÷W×57EŽmcÄšþ£5Ƨâ]ndDêZ¥ÝÝÔ¡Ì™¶ŒÇk@P@P@P@P@P%ãx#â–4_øGÃ~0Ò’Qq ‡‰4m?Y·µºLyw–io/د¢`­Ì9£dWÕ”mäy\>Ë¡É8ø½ñáô Ì:7ü$¶?|6€E²iŸ4\iºhÀ×G¿Ò–%Â@a@¾A·ÈCáÏÚkNýÕ‡Åoƒþ!¶*7‰¾ ø£OÕÓhÇ™q¨øsã 67ŒÊ«”‹G±ÙØ6±Fmò ¾D¶ëûP4Ñ­ÜŸ`¶,D²ÛÃñ êhÔÚc·–{u•·l£àž@ß×õý~ß×Ýýž™Ú¿ÃߎÞ2Ó/ô/üTøYoáÝbÎãMÕ´O | šõï4ëȾÏ}cywñ âW‰t­R ¡óedžÄ;.eŽhgX Ý•9¯vt*S«NKGN­Æ­*{Æ¥*…Js¥ Æ3‹RŠjéÔ©Fj¥)Ê”ãðÊq’ÒÎÍY­NÍhËöxÒub?áb|IøÁñ:5U_ìÝ{ÆÇÂdS‘ ß„~é¾Ñ5‹Uè Õ´ýAp¶çEum¶Ûníõëß}Ûóz™B¥Ó§N4£Å(Æ1Š´c¬’ŠÑ%²I-={Â~ ð€´kø#ÂþðŽƒi“o£xkH°Ñ4ؘ€E³Ó †/5° HT³X’sKo‘[|Ž–€ ( € ( € ( € ( € ( € ( € ( € ( € ( € ( ÿÙterminate_disable.jpg000066400000000000000000002155311160020716200357630ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.errorhandlingÿØÿàJFIF``ÿþLEAD Technologies Inc. V1.01ÿÛ„ÿÄ¢  }!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÀÛÿÚ ?ýü € ( € ( € ( € ( € ( € (  ÍyiÜsß\ÛÝ^[Ù´Ñ­Ôö–2ÙÃ{s ·Éj $Š¥Q¯`V Ê€,Ð@Âøóâ?…~XY^ø’çPiµK¶ÓôMAÑ5ø—^¾H^æ[mÞ±¼Ôu ¬RO<±[˜­¡æ¹’(UœDç Qs©5G¬šKËVEJ”èÁάãNÞRi%ÑjÏ)ÿ†’Ó¿èü{ÿÃrùq\¿Ú/ú ‡ÞÿÈâþÕË¿è.ŸÞÿÈ?ᤴïú#ÿÿðÜŸþ\Qý¡‚ÿ ˜}ïüƒûW.ÿ º{ÿ ÿ†’Ó¿èü{ÿÃrùqGö† þ‚a÷¿òí\»þ‚éýïüƒþKNÿ¢?ñïÿ ÉÿåÅÚ/ú ‡ÞÿÈ?µrïú §÷¿òøi-;þˆÿÇ¿ü7'ÿ—h`¿è&{ÿ þÕË¿è.ŸÞÿÈ?ᤴïú#ÿÿðÜŸþ\Qý¡‚ÿ ˜}ïüƒûW.ÿ º{ÿ ÿ†’Ó¿èü{ÿÃrùqGö† þ‚a÷¿òí\»þ‚éýïüƒþKNÿ¢?ñïÿ ÉÿåÅÚ/ú ‡ÞÿÈ?µrïú §÷¿òøi-;þˆÿÇ¿ü7'ÿ—h`¿è&{ÿ þÕË¿è.ŸÞÿÈ?ᤴïú#ÿÿðÜŸþ\Qý¡‚ÿ ˜}ïüƒûW.ÿ º{ÿ#Ôüñ+Âìïî<5s©Gu£ÜÅg®h>!е¿ øŸB¹ž/>Ú=cÃ^$°²Ôlb¹ƒ2Û\½¿Ùî£V–ÖY£«ª)ÔŠ•)©Ç£‹M}ë±ÙN­:°S¥R5 ö”ZkO5ØïjÍ€ ( € ( € ( € ( € ( € ( € ( € ( € ( € ( € üløßûSMáø*7ÀÏCw*ø7žÿ…_âЬE´:ÿƳ¦^+ÜN?wooÿü*9eiÚmö±_16 Ù:( €>[ñQ3þÓÚ:Jw®—ðWknE«ktuÕšü&é|?£ =³¢Æ0ság­ªNw§¤]¾ë³æø•µ‡ÃFöN£vóQi}×fW‹>:xÁŸüð‹Z×´;/x÷L×5M:ÚÿÄZ.5ºisi¶z]“i÷w‹yq©kš†¡,dA‹££jž[³Ù˜ßæiB­zYÅZ¥Udø)âæ¢›ö“„©ÉáãËrÊgW^OZ4)Â~ÎTêJ¥/šžµ<±f²\˜g¡ƒ¼”¢¹jÐÅÕxÉ®YS¡WC WT£W†‹’”áæüý þü`Ð|)-Ÿ‰<¦x÷ÄÓüY¨ü/¶ñ®‰­ø¿ÃÖwÖ¶·éºTFÛQ6Éí›ýª]6Ù.á} J›»q”/*JUèFެêÆÙÁÖ¥Fr„¤œ£J¥eA·%y¤šŒ¥Ê¯4Ëëå8ü~¼*F–0Çà(Ö©NT£ŠúŽ/…Ui)]?j°•*òBu9gyªr‘èvþjšõ÷…´Ïx3Qñ>—e¨êZ—‡,è%ŽRyDó$Q¤ÓˆÄ"iU’Q³ƒ8-°3Î2q@Ð@|µâ_ù: oû ÿ« ¼,÷ø4?Æÿô“渗øoúù/ý$òߊ:Γ ~Ò_³Ö·©Xèöš§„¾8x_MºÔµ¾ñ&±/¹´}ÖâåÒ9µ‹èôëómf¬fŸìrˆ‘Ê>Vœ\èq.jÕ¸}N5¬êC Ž…\L©Á{ÓŽ”£R»Šj9)Ô勹ãmÃ5å´hqOR£éNŸöWÑS›Ú0ujÒ¤¥+GÚT§ óN)üëðÏCÑô¯‚ðOI´Í2ÊÂoøYºEá’ÎíÜÝxáOÅ«ízáÚ ¥æÔ/¦¸fÉ•Î_5ôujÔ|KB.rå|1‰¤ãwog›Z0¶Üªµ8UKoiÏâW=,ã÷¸ý«öŽÍZÉËVªQ㜌îõ½,%Z˜jzû´eìãh$’kžÖµÙö…³ð…š÷Sý¨¾%êÞ(µ´ðýï‰çÖ<3¥~Ðq%׆t½BÆóÅ6çÁšMÌW:EµÜ3jV’ØÆÛ®7ZixkˆÅV†­J•Rt(òbó)aê×¼¢£‡£xzõê·l=8Kì©9GZ®+‰3¸FÿZ¯`pøWŠ•Gˆ«Á\)R£VQ’¥ˆ¬ç::Ž-QÆV¥Y§ÊÓÕÓÁüaâÍ[Vøýðãâv–>xÛÁ9ÒÿfŸ„>0ŽI|âY-ZÅ|Iâ} âGÄKuñ&˜l5¶Ð<:öÑj“ië_b³¸‰®Ð鈧,8•|."… M|¾´«â%JTcŽÁb*J–*‹«…öxÊ”éÔ<|c*ô)áªa+fªÊ|JøœNX"Âb09“Äà#‹«u°ðUpþÊ_Sž R§ÔªT­R4à±8j4éU§ˆÛŠ×ü~ºßþ)øGNñ·ÁoÚDÐdoŒbÃâÏß éº?Œ~[Úh¶6þñíÆ“âsL·ŸÅ6¢Îæ;]6 ‰n<|ë£,¿â_9¥<]\&qŒÆÐž¼ñ™µ«J¤¾¥™b§®ñ¨Âs«Rk %õº3úÞ:x©F¥XK†ž'Ñá¼%ð5*4ñ(¬T)ÓË1¼Î¾”eFPÅAJ• ÁaãË—×u°ð­'[iMWè¼%©[ß|Ð>Y[è^*ŸöEý¡|/àÄÒV-7ì·Qx{á ðí…£D›-ã‡R™—ÈáÆÌ+;•JÙ—ˆ°š©ˆ¥*8I×¥Êu¨ÐÏ¥ Ó„SMÔú¥LM *.2J´©ÂQR<þ­††MÃX¼ÆJTèq.GVuj»òK“çõqUªJNíU«‡¡[)99ºJSæw½­#Ä¿ ¼o¯þÈ^ø-.‘{¯ü1Öïź7†mã²Ôþxßáˆü?â¯|@Òb·KŸ½çŠ›ÃvCÖRÂâîÿLR–ÓI¥Ë%§¥QÔ–{Ÿfq©d¸¬·nš–O[ S$¡‡š¼*Μ©ÇB•7Ï„ÃañÑ¥(KÈ¡J¶ †±xÒJY•\NXèÑ«uˆþÑÃb¤ñøëIóT¥ ³L>#jU*fT)ûyKF5ø¯jZ?„¾"xWÇÿn¬´Ÿ†øÝûiØMâqÒמ ø‰®üR‚Ûšψµ{¹ÒÇÃíw Áã ÇS¾òã[Y¬RtŸVŠ;Ž ¦P†Q€¥~Ln/†°t°mÉGÚS§›ãëfXZ-¿z½hGˆö1µJÔ0UÜyáB¤WÐçô爎c‡ÂÁÕ«OÂñ4a:µ0Ðà¼*cÞN†V‹®¹d•ZØJòPXwR9ºÇÂMiþ7øãEñÞŸðŸCÑ¿k]Ç^ø{ás©|7O\üð¥­Ïˆ|SâÛiMàOÿlëæ nãVÐa½—_Óî´bÍBÂ[iÇËøNŠ–24süšÞÀ-ZÚÓ›Bx|¿*ö”ëà§Qcd°UçÌèÃëø•ON*½•<Â+ëj¥ ’œç]:Ô+PÄVùüÆ£˜ºQ¬ñ¸< ›Ýl39·—Ö–±sÃ[ÚÁG‘F†*ŒeF•EQ?Cð×üÏýDÿÕ…^¶Cüÿã_úIôü5ü Oý|þ’}K^éô¡@P@P@P@P@P@Páo¿| ÑWâŽŸã¯ø'÷Å¿Þ#‹ã÷LJºø™á/ÙOÁß4MV >)øí,`ñž±t—WÒéöå-$…Ô w¢_•r妸cƒÔ0ò¡(äØU9ºj ¼¹ë5VZÕŒ`áAÍê¥FT¶¦³Î'ûOŽäœ«Nt°£•æ9œD¬ã ."“Äcp´¢êÖ¥õŠXwMhU\´Žˆ3О9\°XŠî4éÂxØË”á1ÇšPUñ5p5å„ÀΤᧇ…W*¥NU5o‹¶Õ—üð/MпfCâÆ³ð®ûâGмK$í~øj?â š ‘Ù/ö¬šî²fÐ'Òíà´hlݵ în^xìí¼—¬#¡ŒÌ³qU(å9*Èe‹«.Gˆ¨ó yšÆPÂÒRåu}®°u*Ê4a†Ââa‰n¾/ ¨•½® ‚­WÙÏšVÍðøZ4ä쥂§”ÖÂÖÄT’R…J¾6ž.T¨Öœ1Œ¶¢éÓÄT­>§ñ§öÈøâŸˆgöið7À5øyð³Å:·Ãûíoã©ã¸µß‰~1ð° âÅð-—…;]K´ÕV]&)5™¥ŽY‘gF?:+N:ª¼ ,ò®UrÜoÖk`°*Sþѯ‚Âb«Ð…o¬Tÿd„³%E¬*BœèJ–.œa:gEjj–!äþÕSÌð”0RÆc'M¼¾Ž#„£‹…Q§9bæðt«R­‹÷“’ÄS¡K÷´jÉÕÖ¿k‹^3ðçìäÿ¾øBßÇn~)x_Uðߎm´¿‡~6øieq¹µ¬øjHg¸ÐôoI×gƒOkJ,ÒÙ,¥»ÝMJU*æÑÂ嵩b2¼FAO?ÃcjÆT›ÂUÅe—´¢¥){JØl|ð~ÂO˜Ô¥V¥Ya0Ø…S?«àñUsrÃcrÜò.' R©9T«†Í}”¨ÉTöm{|>RJ¥NL±ã ¡,R‡³ûÏ‹â•ðÏ‡×ÆòhxÉt};þ™<)£má–×þËö±ðü½Ä÷Ñèâ÷ÎâîW›Êd!É|WÕV"·Ô}¯ÕŸ²öüžÛ‘hEOÜŒžî1rQ¿*”íÌóÃýcØÃëJœk»¹*NNœ}æãÊj2—,ybæãy'%& ·ëœØ( € ( € ( €>ñü?Á¿û ´·þ¬_Ù:€>€ € (æïŠº‰ üx¹°Ôm-¯ì®áïÉqiw \[L™ÕÁØðÈŒ2 Gö65}˜iýõþAþ¯æ+ìÓÓûëü‹ð·µú"ÿðÞþ\QýþXàküƒý_Ì–Ÿþ¿È?áojôDþ=ÿá½ü¸£ûü°ÿÀ×ùú¿˜ÿ-?ü ÂÞÔ?è‰ü{ÿÃz?ùqGö67ùaÿ¯òõ1þZøÿ ÿ…½¨Ñø÷ÿ†ôòâìloòÃÿ_äêþcü´ÿð5þGMð¯Cñ/ˆ~$ëßµÏ k~Ò[ÀúW€¼/¡x iÐx›SXõíGÄïˆu-7LÔ/SFÓ™äÑí,m®¦Žùš×Q–æÚÚÔÏîe˜:˜:3V¹ç+Ú.é$’JöZï~‡Òdø ¸ #YÇÚT—5¢î’I$¯e®÷¶›JW¤zá@ wHѤ‘•#Egwv ˆŠ 331T($“À€<¯ÄþxMóÂŒø¢ûTum‘xe°9Â+1è8mäÿô3Ã/ûOÿ’ì|ÕÌ»§ý:Ÿù¯ígðdß¿Å}=IõÙÓö‰Ñ­w‘‹½Wá]¼R2DbMìˆ)Æ‹6Êž‘̰²k¤q›û”Ù›Ë3(­rüLRêèUKïqE¸ÿkÙØÿÇÏÅ- H “ÄVºÏ†düPüC¦Y2Ý'!íÈÆAŠAÇL18jŸÃÄSž—÷g§G£9ç‡ÄSÒt*BÚ{Ð’ÕtÕ†ñëàoŠÙ#ð·Æo…$‘Ø"G üDð†¯#9B#XôýbVßæ°M¸Îââ·ºÛ·C[ÈõXÝ%D–'I#‘ã’6ŽŽ#£©!‘”‚$r(ôP@P@P@~høCáwü7á#xÏß o?cßk¾%xïB—Ç×î|W¯‡:Žk«‹q©ËxóÂ(Å(ÝFÔèÁÉsOßs´œZKÖnþþÓŸ¼!ðâ/—íð’G<ö‹ÿ nŸu7Œ¤¿¸Ô‚DE½“B-³/ë?ñ¶—Z_ˆz¿æõn©FŽtqƒ”¾n¤¥ÿ€#Ü¡Â9]+{WV»[©MF?t#/ü ˜²üøC{"ÍâYxÞá8»ø•¬üO½2) &{߈z–³<“ï þcH\º«–Ü "¶œ×wžcZ?õî^Ëð¤ RŽI”ÐV§€¢ÒþxûOÆ£›;íÁþðÐQáß xs@¨T.‰¦iA!Œ*‹X¶¨Œ•ÀÇËÇJójb1¿‹^¥_ñÎRÿÒ›= t(Q·²£ VÛ’—ÙHèë#P € ( €9ÝkÂñ"²ø‹Âþו”£®µ¢éº¢²1a}m(+å’˜Ëñ§ÈÍ«_øç@Çü!Ÿþ/hiÜÓüC«è4É€éìÿ´ s\’×u¶¹g1*31RÊþ¾3z6UUJ[¹ÁÂ_'NQŠÿÀ¡å×ᮥý“«‡ke©G榥'ÿ#§²ø›ûDx`íá—Å9ú ë üR/ñCa«Þø·F×u ¾¥á¸’àÄFßA„ãœF£ŒÂTÃl¹¡%V>mé %ä£'ÓÌðñ<Ц›Ââ¡^ßfiÒ—’ZÎ-ù¹EáÚ'À$Õl|1®Å¯|2ñž£2ÛiÞø‘§C Ýj÷œXøkÄVw·ÞñöVBmt sSQ<lj#tgúÌe€ÇÇ›Š…~]\S´âºsBVœíè£æqy~7.\Vt/¢m^/ü3W„­äÙïÜq…P@P@P@]ÏÄ?YxÕ¾]ëpÚøº/\øþ]6âÖþ(!ð…ž¦š=Öµ6±%¨Óa†-EÖ6…îÖp¹—Êò”¸ÍV¥ìó*¾Ò0£“¬3ÆNrTáB8¸b燔å>X¸ÎT¥(¹F’¤ý«‡49›Œ£<.YJ¦i¹†²’´u-OÆj=&‘«éZþ—§kš§§ëZ&±ck©éÆ‘{m¨éz¦›}\Ùjv¡g$^ØÜ[I±O ‰"º1VôV£[ V¥ ô§B½8NHÊ„âí(ÎJQ”Z³‹I§£Fpœ*Gš”ã8^Jñi«ÆN2WWWŒ“Œ—I&ž¨Ð¬Ë ( Å>&ÐüáŸxÇÄ÷é¥xkÂZ¯âoê ÍÂiºƒ§ÜjšµûÛÙÃ5Äéoaiq)Ž¥‘„{cFb¦ÔSzÚ*ú&Þ’»oÉ+¾€»ÿ cðƒþ|þ6â/~ÓŸüè+æÿ×Nÿ¢³&ÿæ ÿ—¿Ù¹‡ýb?ðE_þD?á¬~ÏŸÆÏüEïÚsÿë§ÑY“áÓÿËÃû70ÿ  Gþ«ÿȇü5ÂùóøÙÿˆ½ûNó £ýtàïú+2oü:`¿ùxfæôˆÿÁùÿ†±øAÿ>?ñ¿iÏþt®œÿEfMÿ‡Lÿ/ìÜÃþ€1ø"¯ÿ"ðÖ??çÏãgþ"÷í9ÿ΂õÓƒ¿è¬É¿ðé‚ÿåáý›˜Ð#ÿUÿäCþÇáüùülÿÄ^ý§?ùÐQþºpwý™7þ0_ü¼?³súÄàŠ¿üˆÃXü ÿŸ?Ÿø‹ß´çÿ: ?×Nÿ¢³&ÿæ ÿ—‡önaÿ@üWÿ‘øk„óçñ³ÿ{öœÿçAGúéÁßôVdßøtÁòðþÍÌ?èÿ‚*ÿò'ë_´GÃë¿¿ ?ñ¿iÏþt®œÿEfMÿ‡Lÿ/ìÜÃþ€1ø"¯ÿ"ðÖ??çÏãgþ"÷í9ÿ΂õÓƒ¿è¬É¿ðé‚ÿåáý›˜Ð#ÿUÿäCþÇáüùülÿÄ^ý§?ùÐQþºpwý™7þ0_ü¼?³súÄàŠ¿üˆÃXü ÿŸ?Ÿø‹ß´çÿ: ?×Nÿ¢³&ÿæ ÿ—‡önaÿ@üWÿ‘øk„óçñ³ÿ{öœÿçAGúéÁßôVdßøtÁòðþÍÌ?èÿ‚*ÿò!ÿ cðƒþ|þ6â/~ÓŸüè(ÿ]8;þŠÌ›ÿ˜/þ^Ù¹‡ýb?ðE_þD?á¬~ÏŸÆÏüEïÚsÿë§ÑY“áÓÿËÃû70ÿ  Gþ«ÿÈžíáè~3ðχ|aá‹ôÕ<7â½ Hñ/‡µH⸷QÐõÝ>ßTÒoã‚î§….,.­åÍR(E`T})Äyí)ûÿ†hÃæo|Nøá#ù–¾%øÓà#U±Ç£ÝjHXà“‚p¾P@5]2ÓXÓo´›ï´ Kûim'k;ÛÍ2ò4• y¶Z–<zuäd‡†êÒxg†DIa‘$Eeü:øÁûrüqý…þ27Ã_øŸÁ´ïÂ˱-ç‡ï'×ôM;ã'†4¸&íáï_xv'HµËêÖ³¡HÚºF³Ew ¢òomò>²Ð¿j«?Ú¯Lð&àmâ_ÃOø»Ã¾,ñOŠî¼G¤ÜøO]ñ&•á‹ÿ hmá¿øŠÆâHï¼=u©x«v¡¯èw©s ZlHÖ“jr5¯Îq>iˆÊ²øÔ®ZÕê*Q›WTïIÊÍ4åhÚ)é}Zj6~ÿe´3s§ˆw£B£‚vs´£«5Êòk[h¬Ý׳hš‰á*ÓCðö“§hz5„^M–—¥ÙÁcckI+µº"&æ,ÌB噋1$’¯9âeRx‰:ò«~wQó¹]Y©s^êÚYém6?T¥JF•F•8iÁ(¥è•’>>ñ7ÀOiûB|.ÒSà¿ÂeÒõO‡?5OM_‡>]?QÔ4ýgáŠX_ßYÉ»¼¶MBýašTwŒ_\e>ï¢Ës,Çû/‰×ñ7ÂÇ&T_·«z*¥\Ê5'Íûµ8Ó§¨[™B ÝF6ó³L ¥LžµL ÖÅæxŸoRT©¹Ö¾]‰ªý¬œ\ª^ªU;•ê%?‰\ÅŸ´›á/xÃៃzUªR†!âiªu*J…HEÂzâqXê+‹¡F•\.YœV˪aå)Bµ|:Î+å±Ä®zxYƼðj¤>­Œö”•|D=œªG C¢â—Œ‹´oxïDøyâxcöˆðï¿á#°ðÎ¥a§¶™â„׎ôßxoEÕ¼K¬\øWÅvñLúcÌu]E ]ì .ÊCÏ„Âa1 ŒÁË„†'Ä ¤%V«ÙlãHÖ…*Jx\U”]jN”eÍÏOÆ1“+ÕÆa¡™áñ~éC ÅP”)Î:”s 뀔kPZÏÛa1X|MZUxa+{8ºrSµão‹týSö‚½ðµ¿Ãx|-ðÛLÕþÉ®èþ$ÔuïÚ·ÃÝ#Ç:Æ„—ö>*Ó­|+us^G°ÖzÊ?Û­ã}0 %Ô9pt2ØåÙN;õ‰¼Ã2­‚œ0ò§OØÑ¥ŒÃáþ±T…_i5 üÞÂÐS”?MI%ÛZÚù„2¼¹Ñ§ˆ­—añTêâ#*úÍ|Nk†§‡téΓöue‚¡ÍYÔ‹Ã~ñûxŠ ÿüLø¡es¢êrèzWƒ|ci¨øE´‚;ÛÖuëÄÚn¡ª]Åm¥Øn{0Ù<#‹«GK¥C2xDð¶£OJzTeˆÄâkÒ©†öµÕe<>ÎüÂRúÍLVc 6ÊþÓ«ˆÂ`kЫ†ËÞ?+¡Ž¢± ¦&¥lF&UéÓÂRÂQt1…Ò¢êb¨}gÚÇW—Kû>´«ÏÄ/ø_ã7¾#jºö–ÿ¼+û2è&ð‚è:›jé§5÷¯e±°Ö¥ñ¢éÖºôÚ–­>¢to.æÖ=>É­â{·OV£‚Êóü £,Fc û—S«±§Nu¹jÒÂÞ.…Z‘ÃÆ5ªÆT•IKÛV–&ŠæÂÔÞZ™n ÇBµ, €ÍqU•Zr«*492*ع:±«F6„eB¤$éZ•<=xÉUxŠs¯€iïío|7Ñu‰üoÅ;‹: |)օk-¡_ø—N³×æ>3Ö?á3ÑŶu¤Ýkhþ0ß›9>ÃäÞ¼v˜ŽT¥šáiáñ±©•ÐjxÚ´œ0˜ïªÔ…&Õµ[MÏÃÖ^#gOøŽ]NúX ´þËð¤:ÍÔm,°«\¥¬!Õæ\øùž;:ËðÕè}k AÔÇbè8{E_ —ÇëÂÊ×7ø•©UŠàÈa€¡›br\6Œ°ˆRÌ0Ò¥5Wêô§ÑÌ©TŒŠ©KF¾?– ts:„”Ηâ£ûGŸ‚_TêRÃÔ¥V¥L,k5W V­xÖ§Tè¥N–' >V•iÕ¥ °±£Œµá¿ˆw>½Öfñ½Ÿ„u6ð7ìÃá/ˆ:Ï‹<3á;½Ä•…¾­ã–]~Ûâ-boì‹]?G‰áµ{©Û¯/®CF—b;3¸ÆU8š¶5c8çôpúÑöUñ5èM{YÚ”e,Cä£))<>~Ês¬âêËÎáºu%—ðVµJrŽ//ÇMTTŸ6B9Œ`IsIÑÄ/­Ê<‹S Bp¥AES:-#â?ÅUøSqñßÀWÞøÅ«6…eaàÍ/Ä:~«ðïY¾ðÞ¯âíËS×5jþ>²–ÃG»Ó®/íô¯ ´w) ÄvrÃpñZML·±Y¦SJ­oí « Zº¯7C< éÓÇÓ†CÚaUªK…”ñŽjteJ¬aR¤$£˜cêåøíѤ²üul,e…Šœ±L6c7 "x—8Ò¯*U§ƒÂâéG F.xÉW¥[— ¨â¸Ù~5|c¶Ó¼Mãéìþÿ á/Ž—¿ §ðä:GˆÛÅzî€>&Ûü=ƒÄ°x™üR¶§i&§hï§>‡ªÇxt¹ä[›6 €Ë«ÿ«zÓÄ}k‰0Ч<8ÒÂ×g“wn:^-ëºÖ×S×ÒŸ>P@PÎ?µ¿üað·öwø“ãß]¥Œ<;a£ÜhsËm§]Fnn P­Ì¨Ô§‹Ì0øz”ªÊšuaN¤*8N¥V„[•)F¢‹[Ò¥J¥ ×ÛV–42¬ßñ<°õ0Ùf/Knñ©*iª¥5(Tpä© ÂR‹ø—ö„øÿñ‹öbо|>øûOx[EñÆ}{ÅÞ%¾øÛð>MOGøAའÏÃäx3ÀŸ|e©IãcûgUXmu?É*½¨¹k³ÆŽç:U1Ô²z8™Ð§“ཾ+8FX¼Ò½L]Jx(,2‹Âa!Z–ªÆ¨J>ÆœðÕeVT¨‘EÉàjg3ÂEÿjW§G—*¯ØåÔýƒ­Œ­[e_¼±±Ónlï.µM?RÒÙd öøï$/%·“ÓŒú̸{:Æà²ÿgÈÞS¨¥,MmbÄÞ´ð±”1ÅeÕ¨òÕÃP”iã°µpk 8bã‹k<(G<Èp¸Ü×,ÎqR£‰rŒiÕËåAÅÑ’§ì§„©†§‹¯*µ§ÍðT%ìåI{<6…;((Ë“žjU%9ËÞËhRÄqœ²š±æËã_‡à©]¯w•e˜œRç‹U?{_Zwç¼9ùi¸B1Œ~]ñ-"ëVzͯŒÿáñߊ¿àšðßøÇþÝWÆ¡}â]X×äÿ„zD¶Óÿâc Ô-vÆ¥·ÛüØPk¯pÔ0o¨Q§Ë—eµrWS Í/öŒ:øm'*´~µ‡„°ÿY‹•j<þÚÓŠ¿›ÂتØÙxUˆÄOŸŒ¯ŸÆ5­ì±Uhðå:¯gOêÕåOì:ÞÏÙNМ™õÇì/¡øÃBý•~ GãÂu6¥àë^Ÿþ/ÃðŒøKRð®‰6à¯+K–EÖ±­A·þ×¹Ûsy»Ì™†+ìx¡8gxì=Wíñ¸ZøšX¼U¹>»ˆXªóxŸaÝá¯Nt©{MÁ{.{óT•¼œš3öªœÿ¸­‹ÄJ…/öxBJ•J~Óâ­íq4ñ¾i¤áõŸaÓ£þ¶¯ž=€ €>ý¬äÖ?ioû ?õ]xŽ€0küÔ?f"$xfŽ|‰š))ö,¾LŒ…c—ÊbMŒCm<`õ¡í¦¡t¥T§*”ý­8Ê.PæpçŠiÊ<ËXó+®eª½ÖÇæï‹¼)ûcøWâÂÿÃhý¿þuçŒ-?µáœþÚÿaÿÂ)áÇñ™ö´Ký¥ö­ŸgÛö‹_+>fdÆÊý›+Çøu˜å¼G˜Ä6öêþ ‰öëg?oõŒu '7,}—'·öœÜµ9¹y9cÍξ_ ß ¾ÛÓëÙ…¾©F>ÏÚá1دkö¹¹~¥ìù=Ûû^nuÉË?ªSÆþÎß ãÖiÚo‰§°¿¹ŽëÇÚ‡„ôïK«½ìóO§húgƒ|*oÿP‚ÍD:tW7Gi4íXädøJ¸8ñn{ 'ðÅLµ§\ |Wð·‰z½„]hsQU9©9ª”êF<}‡í“û4ê7š•—Å>FÒ-óR¼}Ŷú=œQxzïÅ2Å.»q &›öÔÑl/$kAtnhÐÄ/1ôqqžŒ+×ÈçTœéÂ*¾U§*xÜ>_'N„+ʼàñx¼58T…9S«ЭNS ý©ÍG<Ê«ÔÁÒ¥‹NXÚxZ´¹¡V SÆa*c°ó­)Â1ÃFxJ5«Iâ/d¨Õ^IÓœc~Ú²úx/‰MñoFŸ]—ÃQ]døœêí­A \Ígÿ Ðμ[K Í1ÓD"9¢É²D-OÃ~7Žm ‘ä¿´gAâT\3¥ì¹Þ)VxXûË—–U”ùš-åî–q–ÖÃâ±4ñQö8)S…W(ÎŒ«+ÒQ„ãÔö‰MÅÒŒÓTq ?özþ϶›â/‡üEâúŸ…~)Z[øsâ~'Ô4} ÇÃ'Z¶ø¡coá†Ôaìj7*Yxvõ¯ì&DƒV¸²‘ÒKi‘ZËi'ô£á¯K_¯,&œ+Jq©‡nt§Bž&3¡MVu1+ÙUþ¯ ®5èI*ôªÓƒÅg9fU!ŠÅÆ„èW«†©)Þ•J½…_j”_²¥‰¿¬Tå¡*I×IPN¢èþ-~Ô¿þjú~ñCâ%‡†õÍNÍõ m"'Ä~"ÔRÉcK«ûO èúŒš\;0ïVÜ\yùgÙåòø8{‚x§Šhâ1QÑ£øLºÓþß§Ím{¬ÞOo©&ÀÁ~Á9þÏñ"÷ã/ÆÝÂ^'ñ –|ð£ÃšLwÁ¯…þÓ˜®‰¡Xè©il"|,Ñ|}¤é6ñ]\ø[_ð¬¯wà¯hpÛ-žÓìRÛ-”Ñ›]OÃ×v-ït{”6÷E /‘wigwgÉÁa±øyáqTÕJRé³Mm(µ¬dº5é±Ó„Å×À׆# ?gRs]c%³Oª™óV«¨|KøxÍÄŸjzƕڿþišŸŒ5ð­î‡£Ïg¨Ü¬þ-¿ð•Óɩɢ'Юì_ÂþSÙ]Yy¬×ß9… Û/Î¥ŠÊðù®ƒ©JY§ÔR•E*~ÏêU1SºN-TU>³k©ECÙÞóæ´~ÕÃf1Ëå†ÄÓ©&¦%¸IO›Úajá½›I§MÇÚóÝÝéËʯ̫ë ÓÆ¹¤i6ú›â_ Gcã ¶‹ª¶kgowëkw?Ùv-¬É¿Ï‹Ã¬<»B­|.µZ´'‡¯ >&ŠÄµ,M(Õ­‡ÆQ•)U^ÞŒg†“£^¥yIÕ¥V4iÖ"ic(ã°ÕaJ´pðÂÖ…jr«B½*ªÖÃÊP§WVi¼F"”çö«BTaÉ aá7Ñh?.´ÜxêûÅwþ!¼ºøkះ×GTÒô»mFöëž"Ö¥ñíÖ‰Žž.o_ÄÎÏH²†#lZ?–QXb1ë`3l,40”ó<\11TåRPèa'…T£³©R¢÷ùùçZúrÙß™:t*Çû*Uñ2ÄVËiãá9ʃ­,tòé¹rÓP…(Ñú‡,b£7(Ô\Óæ¦åW’Ñ>ÿcx/à_ƒÿá(ûGü)oé:ÿöö'“ÿ /ö_‡ÞÓ C íyù5åö>ÓÙò«óró«s7SφÌðüü¿Ú9Œ±üÖþóÚyß²µ×5¹>­í/ý·&žÉ¥ÿÀ϶øþçÇ?ð”y^ÅŸ |QþËþÄß³þ…·_ °¾Ûý®»¾ÓöŸí¶ýœy[>Íöy3猰9‡Ô°øzÇÚ{ YÕ.nn[ÿkûmË+}_Ùmwíy·¥mL^ëN³çö~Û ”á¶½¿²óª¹Ç>êþßÚý_—OeËí¹ª_Ù--[àçöŸíiÿ ‘ÿ ÓOk3û#Ìÿ„[wÛy»?µûoaû~ÜØ­ò3òùÍÊëÿÂ~]åÿ‘~6¾3žÿÄöØšgËow—ØrsóJüÜÜ«—•öaçõ|Û š[›êølÙ^ÜßTÆcñ|üúÛÚ}{Ùòò>_eÍÍ.~Xyæ¹û7xŠÿNø—ámâ}¶…àÏ‹ºFŸeãXSÀ£Pñª^YxJð4ÏáŸ\x±ltïMдÓ-…ibêBÎöÖk¸®,½LFmKêàùªá1ØÌv*ª4aSŒþÐŒqÔ£IO8©M©Ó­ƒ«VŒhaêTthF2ñ°Yu\Ã{R´r¼W‰nœ¹åOB¶Ûàæ«%‚­*¹¡xâiRÅGë^ΤêUŒúFø¨_êÜøƒÅÚ^¯¤k_í> |FÑãð•ÞœÞ%ÓìF¶Öú߆õ¼_#ø:é§×ḭ̈Oº?-"’MQ‰Ìéמw*t*á¿´³®P®½® BR´œÝE5J΄¡ZœêU¦åEé—àñ9u>§KJ£áêX¬<ý¦¸âð؈à"¡(*ñöU#ýETŸ5ZUcR¼}…>h:}/ƒü ñ_B¿Ð-uÿŒïƒü1i5¦—¦ü9³Ñ|SâXb,tøO|[¨ø›Z¶Ô¤·´S4òxwBð£Ý^¬sî‚ÔIa<â±øT±X©e¼˜ü]ܹ+Ê8*U*INµ\>SUá.xÛ ¸êôhÒ©V)b&èÕ¡ž/Äà¨á°T1öÀ`çKšŠž-á©)Æ–®!ÏØÍ(:p­Z8HW©ì£(N”§RRèo~i|RÐþ#êZ·Ú­¼+á=W@ð¿†þÂR3Wñí¼ž ñ<·ízëu>•§éúmº%¥»[@Úˆó¦]A’L6+ê¸LÏ'W2–«tœ0ØWV«ÃÅr¹Z¾&¥*õß:„Þ½’•i.¼V8¬FSZsq§•OZ4¬š©ŠÄR†–"Rѧ…¼]Q´šXìKæJN/˜øƒðKIñÿŒtïÜêFÂÚãÀ~4øaã­";“þ_øºÙZ--µoí¤Òo´­f1}ivb½‹Ëø–k¿> ‹xl&gƒiÊŽ?ê•©òÉFXlÃ]TÂã©óBq”£FxŒ=Jrª©Ðrš†ÙUÖ­',NO¤ãO“â+T§)EÎp¸ºP§ŒÁU‚”¥ˆž[â´ja)· ‰´°£øAñ#QðŽ©ðûÅßìµÜxÄ^³‡Eøsi øŽú×YÑ%ðõ†©ã=vÿÅž³¨iöÀÐtÏ Eqy™eO³±ŽŒÃ†ÆË‹ú±Í15iWsö²––"¡‰©R†F5Ò©Z *luxSÃT­M)V•N—(Ââ²|FUÕ<¯(¨¥N„¨¯­U¥I8apÕñnnœ©R§+Ô,EjôpÕ=¼)G‡Æ[ÐþN×:ÏüG¥ø½uïƒz?ÁÍ~ÇLðµÏ†4íGLÒµ?ܾ¦\ø£Y–ÖK­7Äik%¸ž@²Ù½ÄrªÜ-½³Ìs XÈæÐ¡B¦ûS1£™){u9áëÓ éÉR’£Nö¯'^„𿢔)ÍÖ”]YN¾[K §:ðľ£‹ÃÁûN5èâZ©ª°öÓ÷¡K.P¬ã% C­)FxÅSphüTº¿Ãù¼ñ"߯šÂk»›ÿé¶> O j×:—ö5ÿ†t½_â´ž$ÔmüO©éþÔo"ŒèúW…ídºº–îkGÄÚïS7¥*™†6ž QÍ3L;Ã׬ª^…5^tê㧄øsО2¥('í1ˆÑ¡*´)(ûNxòQÊjQÃ`²Ï®¹e~"•z4;bg'´X >'¨V¡…U!RJj5qœ.µJª0¯KÍøÓÀþ ð‡Ãø?Æü?áh¼_ñr‰–zžµ •”Æ{¯ŠšÄxü3§iêM¬Ý´–CKIm¤ódy„ÉhX vœº®*X®©…ÀÔňéR¤ãO™ûgõŸyÉBJ‚Xêª(ònù½Þ¼|°Ð‡¼F*ž9î®9¸¯cí2\>OΓ’öÎ>Ãë‹‘¾ocuËí_¶iZ¯Äˆ ü3ø{ªØi“¿ð°¾*iÚŸ‚|/kc7zW„¯ã·ñw‹$XÈš×MÑ´ëÅ(#ÖáWóSÜ˸+]Æxù¬.°‹SªÖšixBëfÜš{Àð1ü]ƒ ¥ *¢ÚRN“×½§+=ÒQMm3é† 4χzœ¿Ú7¾$ñg‰&µ»ñoŒ5T‚-G\¹±ŠH,- ´µU·Ñ|=§C4ñXi6Š!·H×××·—¿¤`p8l» .š§J6ä÷”›ÕÉ÷},•’Høf3¯,F&§=IiÙE-£´Š]—›wm³Ók¬å ( € (É>:ü,ÿ…Õð§Å¿ ·áÿ„¢2í¿ìÏퟰgkzn±»û7ûBÇí>gö“µE·Îß–Ùµ¡BØÜ›ùf™neÉÿ?³ñ”q~Ç›þ]ûoeìý§,ýŸ7?³¹]s³æ4-þÿ—æ8où÷õü#ímö½—·öœ—?/'<9¹—+ñËàMïÅTðˆ|ñ^øAñgáÔÚœÞø“ éz_ˆO‡]³‡O×ô_xO\ÃÅ~Ô-ííd“N¸’·:u•ÂL¾C$ÙJjxçÁ×úµz”e„¯ GÚÑÄa*U§VTªÒr„eRœ ç„¬îðµ¤ëÆšIUJ帪?Y¡NtkÒ’”©U£‹ÃÒ«JzS3Š”jΖ&“N8œ4êaæã̧[áŸì÷ñ;FÆwÿ¿iï‰ß¼O⯠Þx*ÂÿAµµø+á¿x~é|éxoÁ^¿kˆI}$ò/‹e’KØáŽÒÚÝ`ŽçN"j娬 W [éN®.5TñjÐöÑ¥, 7 -.J”|;z8šÔ#R¼gNs æZÔ±˜§$ï4³Dã“l"X|uÛJ•l× O©U£ªaé×ÅÑ–½Xá)IÃØªu*J†ÉÒ¥Uaç/kΧ=zRxð^©ã¨¿g#à׃ ÝÄ0ê¶^º×­e¨ø‹Äú|P}¹-Žw ­¦­»ûBÜÝ,?OÅ4iäY]‘Ôá7UÇgùf6Ž |C[6ÆN4}½ c¨á½•jpÓr–­o­Ñ©V­AЭ1.<ŽKÄÜ=ˆŽhó:¸ Ô„¥ h{=j”ÛÃÖÄËÙËÙU¯Uéaãí¢êÒUN U¨½ŸMðþ†,?àšúAÒ¬[L¶õ(,^Ú9-ÓQ²ø«ëv·â7R ìZÌ1_,ç/ö„nó>jòñ¸¬JÏüsÄÆ¼ã^8LmÎ2q”iO‰²¬©E«rÓxYËÈ­Eºi(èy9t!WxgÚÂ2UóL–µDâ¹eVªÇâ*MÆÜ·•i:ŽÉ.g¢G°ü5ðþ„jïÚƒZ:>šÚ³økྜú‹YÀ׆Æ÷úԗ֞yB —°°3¨8›û>ÔI¸[Eåü†m‹Ä¯ øKíê,+Íx‚n—3önTÖ^é·Ùºoˆtïð:õÜlêÔrú¯þ2Ì-]\&C…•‰%RœªæÙ¬&ã5i&ã…ÃÇuRŠ•ïó§Àè ´ƒöµµ†+kkoþÓÐ[ÛÁC¼§ŒcŠbŒŠ$UU¡@_gĵ*U©âmZ³•Jµ8c„ç9ÎNS”äò)JM·)I¶å&Ûm¶ÝÏÒ§Bœhѧ4hñöcBP„!ÄñŒ!¥Æ1IF)$’I$‘A|;¡Çÿéñ;Ç¥Y$³x‡Ä~&–dRy;0U›fµ!”ðüþµJ5òo¬áéU£ŠÂFž6¼×µ«RU‚ÃÒ{ã±r£ŠË/ý“–¬¶Œg:K,Z¯óÆÐ§QBµ\½åµ§Fs±•IûU‹¥ïb(Î3ð»Æ:߃°‡Žücs©hþðwÅ?‹þñF©¥êwWz±¬éŸü=§ØëvvVrÝC|ú¬‚v²Hí„BÃÛÏ2üVwÆ~$e9\hâ±Ùç äòÀS£V”hâc Ü3Šo Vs'KØÑœ©Ë+$®™äª°Ápæm‰­õµG*⺘ÜSÅBUq´p‘Åf5e_JruÔ18oÉIâ+F’N´ãMòºÿ‰|Sð7âÆ Æÿµuïìï?Œ¾%ø¿ÅVEÿ쫦|Q±ø…á}vò[½^Ó¼yܺý”zeÜz[ÙÞ´cO–Òk5@ˆÔe˜ðï ,³€cÆrÊrÌ> ¼)ñ,òʸm/Ý×¥S/u)ÂÅUƒÄS¯ Ë FsvŒôs ÖÁg™–aý¨òº•Z°˜¨á–"(S¡IR¡°R©NYbjŒ¨%Ê”¡‹§Í<]K~~ÈžÔ|û?øAÔŸÅ>lgÄ:¼3ðv—ðûÄ6vZ׉u}^ÒÒïÁz?ˆu»_ À‘^ƒo`—ÀÁnðÆöÖl¦Òßòó ã±С¡)`ñÕ³*3ž‡ åõìF WU*jêÊœ¹ëFröØ‹ûiôðýÐÂb])9PÄbñé?«CMª³ç©R†– ÕÝ\D?wGŸÚº‘¤£(Ê7xwãwÂOÙ«ÅÿüñâÏUð÷Œ0Ò5|âAñÁ~#¼+g£j:N{âé¶2 ôÛÙmí­gw…[2]~›Ã9ïä[„Õ<Ç ’åpÀâ°QÅá°Õ2ìÂjŸZ¯V•jÔ¿äc.\Mw‰›Xÿ ¼¨h—_°æ•âÏ ÝxrHükûDø¯Bðn¹o,z‡‚ô_Nñ7ˆ|!¢^Ùܨ{=CKÒ5 öyP5¤¨±…I-—g§œæT«Öñ6® 1§˜U¡Ã|9Äæy©ÓÆâhb2Œ>½*±º:õ!Z›«lE7)7(Õ•ü¹A,Ã,»/Ì8Íâ0ø*”¡FT0ê†y‰¢9S£Ï‰ ±°T寴Œ¥iΤéõ~}€PŒi_¼ ézn‡¡x‹ã~‰¢hÖzV£i´¿í¦i:F—§[Çi§éš^›cñV+}?Nµ´† ¶·Ž8¢Š$Ž4T@ékÅÿVŸëßõ–óâÿ«ùBÿ˜K[þžÖÿ凿ÅøÛðßöîðƒÞ/ñ¼Ãâm–¯à×ñ§Ž¼uñÛÁZÏŒ4[á׌~$ÅŽÖÚÞÕ?¥<(â\ÇŠx]ã³l_Öó 6.¶¬ýIò(V§.JéÁ?e^vŠMSNÜÜò—Æç¸*8o²ÃÓöteN3м¥½âÕääþ(7óíkCÚeáÍIÐ4Ñ8°Ñ4Û-*ÌÝ\KwtÖÖÑÚÂ÷Ws³KwtÉ´“ÊÌò;3¹,ÄŸÓ6ù.ß#Æ>7øî[m&ëáOæSøÁñFÔ4 hÖ’ eðÆŸ©Dú]ÿÄ¿¬R+hþðüw-x÷4&úæÞßK±2ßßAö x~ÃÂ~ð÷…t¤òô¿ èzO‡ôØñ–5…¾f˜ÉÆÛ{hÆ2zQ·È6ù”P@kム>$O 玾xGÄÚ¢yvZÞ§¡ØÉâ5@*?²¼D®¥¥8€ö—P°àÔÊœ\g(½i5nÍ= Œ¥œ$âãªi´Ó]šØò«ŸÙoB²çÀß~4x o1ZÁãuø…¦‚9µ§Æ]/ÆCb[ `²¸²òãýݳۀ¥<|G丟âeô¢×ZiÑ~¯Ù8]úÞýnz´3Üß ¥—gë¸ËŸ—hLþE^ÊfÛ§SC²Œã(¯”á)?ü ¥./Ì餧N…[nå Eÿ䓌WþÌ™<%ûOiÙூ~%…x3é¿|iá»çÁÚ­‘©|"Ôm‚±Ã°meLc!|âï6|¿e™¸¥²• þ*¬mÿ€ýÇ|8Õ«{L½7ÕÆµ¿N_™žóüx³æëöw×/F mðïÄŸ…÷®>òñˆô%ûCõjÆOß–!ÍqOqñþ2„½UHúm]×3Á}¼%hÛ³„¿9GúêŠÍ⟉p—¿³_ÆÛ9¾òÄ·?µPc<+ý§Ãÿõ eË[N² ¹d È[Àù¼v­…—¥JŸ­n¸Ã+òëttéþ•Y\øÿÄjv¿ÀÿŽªËÃ(ð,aÃ(’mã“#tnêz«A8ÿ©™Úûtÿ§«ü‘ªâÌ£ùª¯/dÿFð°èÿàÕþAþ¶eÏWÿ?óãÿøñÔ±áTøòOo—ZTN‰ÙTu$šgÉEÜUþAþ¶e íUÓ§²æX_üK˜ì²ý›>6ÝÌ9òZãྔþÓ¯üb°¶8%FÁ9ç*„+Ýp>nÿåî6ïR§éE™>0ÊÒÒ–%Û¢§Oõª‹)?Ç‹®mgmzÀ`>©ñ[Æ^!¿¬Ï£i¬m™W;Ô.´Lv7’[zöÓà$­ís6×Uû›«/ý$㟽}ž^£mœ«_ðT׿jÁðOãÆ¢Göׯoøzݾõ¯‚þê7œ=ÈOx»â>£i6P ðìXÉ ]|¯J—e4Úu*â+Ûu)Â1û¡ÉàLà«ÆœÓTéУ٨I¿üšn/ÿFå¯ì·¢Þs㊟XÿŸŸÜä—¯Ó ùã/üœoÁû"´þ§_²Ý~ãïü‘ÙoýŽpÿú…˜ŸMŸò1­ÿ`óÿÓ´MÚþD?@ ( € ( € ( € ( € (æoè>5·ý¬¾xËá·üã?YüøÇ„^:ñޱá ]>ßJñÇÁë+BÂïHð^¼Ój±ÙxßP±†ÞQk°ëú„sYÇ£ý?ôzÄJX>(Âs7°5Tmî§Z˜6Ÿ3mµ‡Šk•YF-J\ÍGâx¶ TÀÎÖrXßü. inœÝú½µô]SÅßµDóËÅMÅ¿¼#–[Könðo…þ%k"òL’ëzß‹õϼ2Ǹ¡Ñ~GxŠÌc»‚àDôgè|è{×Àx~&­MðkRÓµ›‹F)|u«]jºžµñûÄ+D“âU÷Šf—Äßð `A¯˜æ†© QÀ¼P@P@ wHѤ‘•#Egwv ˆŠ 331T($“À€<¯ÄþxMóÂŒø¢ûTum‘xe°9Â+1è8mäÿô3Ã/ûOÿ’ì|ÕÌ»§ý:Ÿù¯ígðdß¿Å}=IõÙÓö‰Ñ­w‘‹½Wá]¼R2DbMìˆ)Æ‹6Êž‘̰²k¤q›û”Ù›Ë3(­rüLRêèUKïqE¸ÿkÙØÿÇÏÅ- H “ÄVºÏ†düPüC¦Y2Ý'!íÈÆAŠAÇL18jŸÃÄSž—÷g§G£9ç‡ÄSÒt*BÚ{Ð’ÕtÕ†ñëàoŠÙ#ð·Æo…$‘Ø"G üDð†¯#9B#XôýbVßæ°M¸Îââ·ºÛ·C[ÈõXÝ%D–'I#‘ã’6ŽŽ#£©!‘”‚$r(ôP@P@PæÕ¯ÁO|Qý²¿hŸøßJ½ñUÇÂhþx»áï‡$Ö5?B°ñÕ¿„5{«O]éº^£m¹©Ä4ë;ktÔ£º‚åºÄDܱ_?Z¾Uqy—ÅË7ÃçYõ,,¥ïª1|?ûhP¦ÓŒgŒ”èªõ•Ká0ŽŒ¨Ê”¥=qÔðøÜÓ"ÉñRöv3%ÁK$ìëBŸgÃ9É%R0Á®;÷qš¥^8Ú±ÄBq„üÖðçƒ>(|Wøw©þкÏìâ¯üO½ÄÞ ÚÉÿo/ ü<Õ¼­iW7Ãíz_…®/¬ô߇úW„%·{h´MVßu…½‹A<ªª­LÉòü¿“â©åµka0µ©fU]l3•©Â“ÅcyœpøÊXï÷,V.“–›/œã‰…JƵ/™f¸Ü.?õøá1õ¨G,7Oû=a«¹ÑÂa£Jq­…šŽ2Ž*q¬«âåý£Î…xS>Ýð7ÂÏ |Fý®¿f¿Šô #Tø©«~ȺwÅms[Ðü_>££ßüPð¦¹ðÿDÒüK£ÜøKÄsh­„zn¥ª£Ó^ëJ¹ŠìNVçdSN® –ç^(Ã'£<*¡O(«BŒáWÚÐþÚ§Å9~gNT±ö¾ö€Á¿kéJŒgER­^¤ªxÕá<_p] ¯ÖÝ Óƒu%Ruhå†c€YÑq‹­c–.³+YÎXª1Xx`Üø«Ã–_ðKZ ­kNµ¸kÞK[‹˜áºÚùÿ°ÖB%}T@pmÂñ½ÁB™Ç_ÁŇœk}mø}:Œ£V<>U,T©É7,:ÂbU[7É:)»N.'¡Z£‰ñUT´>­>8•VÚQ¦±XlÆXny_–.¿Öð±¥ï:•éRIÕšƒöí à€~,~Ú|IñÂ÷Ä+ð·þçÅ>ÐäÖ5› Iñ’xKSž/Ýéš^¡o¹©ÛŧÚÁnš”wPCÝb&7,W·ý‹*â ΃qǬÿ=ÃR©&¤°ôjdY q1¡œa ñŽ¥âøäx×Ū<)¥Z|v¿Ó?á Ð|?¶šNŸá¹´û­TËv~kÜëw÷]³˜GVU(åuü,ú´\–>Ÿa±ÞÒ\òÇPÍp8 -Z8‰I?ÜÑ¡Œ†•*jœ^ G Sž2¯*½¢YO(b%8PÂâx¿ƒ7<+.§ŠÄSÄáùi¨ûj˜ÜÅÔ©Vj©ÖŸ%HΖ¥·ãæƒã¿Ÿµ7Æo x—öYÖ?j |-·ð-—‚¼ßµ—ð+@ðF™â iÚÍߊm¼.¬õwTÖµk­JÞMy®%·ò´È¬ï±<쪌*áó,Â¥_O5Æ`刕HÎx:yc†ÁS¥K OB<|å[›ëu–‘aë©õbñŠÉð¬¨á«åX|w±„V2½Z•c_:­7Uàj9eô¨ÂKê‘U*ÕRxú-.‰¬|F¾ø áO‚¿õíKá§Ã]öÁ\ø^ï\‡à׊þ*ø'V™¬Œ¾)Š? µý‘ ® RÆÖÅRj8§‚”*c±ø âi}[Q—Ý|‡ ÄõrÊ2ʾ£þ¯Ë (óäX\N/ ‡ÆbðTùcS †ÂSÃÒ©ƒxÔ†8êµkUÄá°õïÞøðƒö|ýµþø àíÅî£\ü*øÝâ-Cá”Þ-Ö|QeáÛ»×ðuœ~*±Äºž£ªhͯ meF»û%Ãx]Þæ†íçÏ(ÄV­ŠâÊ3Ÿ·£‚É00§&“xoiaªÏ¤Ÿ³»XÈÑ“r£SV­ÔqQEæXz8|Õ§†©ÏëNªŒeld°ù>”q2»pL4%3œTeˆ§*4æä°PäýE¬‡i/ø/À¾ë^:ñw†<£Oð‹öŠÒíõoëúW‡4ɵ;~Ì×piÐßëvðI}%­…ôÉn®dhìçuR±9_Ç|mÊó,×…2ü6U—bs,D3j%K B®"¤i¬:.£…NJ S„\šåR”Uï%¡áªôpøê³¯Z èJ*S”`¯í)4““JöMÛ{'Øæcý¤¿gi]"‹ãçÁi$‘Ö8ãâŸÝÜ…DD]t–vbIÀ¯å·ÁœaÛáLâ**í¼³’Kvß°Ñ#îc—ì±ø%í©ÿòGµWÍ¡@x‡í-«jºì÷ñ«ZÐõ=CFÖt¯†>3¿Òõm&òçNÔôÛë] ök[Û û9#žÎîQ^9¡tte ¬½þ£GÅ\1†ÄR…|=|ß,¥V•HÆtêS©¡ Ó© 'Âpn3„“Œ¢ÜZi´L>`öpÀf3‹ëÓÀâ' Åô”'Ê2ZÆII4ÒgÎzwì›ãXü+¥ø§Á?µ·íMkã¯ì]7\пá5ø™|5§´·½K}wÂ:†…ZÎ$ŒðµµÄî¡d ë8C¿w˜qþ_„̱øg‡¼-ˆÊðøŒE °Ãå²ÂbêaéÎtÚ¥‹¥_Ÿ]Á{µéAN÷©òK–QùŒ§,þÐËò¼V'7ÌhOC ˆ”©âeÉN¬¡N´eìíz´aVΦsåÄQRÃÔŸ%I3¹ø{ñ’Ëâ]§ì·âŸÏã ø»ÇQ|@€økÂ÷±Yx÷Ä~Ðoì|Yoã}>úãíwºUµÎ™ys£Æ‚i ¸hšb6³W™œpãÈñ|{ËÖ •å¸<»F2.¦.ŽŠÀÖÂOVœU8bùq4¨âªµNL?·PKš14¡Œ­,_ Îs§ŽÂgÕrªÒ¸Â5±¸(gy{M\^%\K¥)*ßSÓ÷så-?mo†wž#³ÓãðWÆx¼ â¼3cñ†ڄ®µ;›ïì[#‹þÖn ω hÑÝ4Cö¹³­¨k•ˆxgËí?´²Šy»Ã}j9óC;•/gõ‹,‡*«õ;ã}”«F§ÕÓ\¿XµÙÎpؘåVŽ"¦+©:X¼U*Nxl4éTTq ­K¦¾­]ºZŒ—µ‹/h¥>£âwíIá_‡0¹ð™ðóã7ÅÏé:Štσ>›ÆÍà»}^36‚¾)µtëRÚ+©í`ç‘¢³’IV%xLþvGÁ8ìç-þ×­›e<=–N­J8|FsŽXxÊ”-õ˜á?wRUVš’¯&£ʬaNq«}Xìl0ÂÒ•ØŠøªR¯ Xzn¤ÕTtUY+Æ*«”ãiJJTåÏFTO/ø¡ûDxp_þÉß¼;âo¯ÃŸø§ÇÿLÑ`ÖÆ¡â—ÿ…uâ[MÂWž°~¹¯Âd–V6ºTδÖÞJ÷²NÆÑ­âãp+ç~MF¦ÉÑœ)?í|𤱴1- 4³ªV­SåIRÀÊ´«Ê%Y.,^aN¾M†ÆÓœð –u‚¡ŠöÊTkaU˜C†ÄÂ<ÓNJ…j0öЬéGÙ*צåÙiÿ´§‡¾)x㕤hþ|CðoÃÏkïቾºðŽ-ô©´+ÿìŸéE}r²igSŠ[xî`»Ãqg™#‰e¶’ãÇÌø/TɱÓÇå™îQÇPÃy–­<µýK U.:ž*›úÆ]OÙ*Øì?³„åæ‘…J)IÎ¥ :¯WNU*RÃóò-|E›R±°Ó¼+/’qt5 =Fý´?%NŸý“4q¾ ò^z|I_p~ˆ1|7—pÆjóá0Ù” šà,ELe_©óOšY~)aé¼r•ªýoê·—ÕTiòœðÖ‡Ìkã]L%JØü."~ÚxHJQy~)Õ\ª‚ÅÚµ*XYGÚÖ…)âÓg÷~^}P@x´Ÿ´ìí ’E/Ç¿‚ÑK´rÅ'Å/$‘ÈŒUã‘]XT€Aú_õ/Œè“Îð×ÿåö–]ÿAøüKÿ’ð§âO/›áÿ¼ã•Ѿüx»x;Å:‰†”uˆŸ³AÓ†¤tKûŸ°›¡a}䉶y¿bŸfï%öÿAø’ç?úÓý­”ã2¿¬f{/­ákὯ³þÐçö~Úçäç‡?-ùyã{s+ü—bpø¨ý^½:üžÛ›ÙÎ3忲µù[µìí}ìû •ý|™áß¾Câk;Ÿx.(¼=ñ«ÂºMÝÇ|i§Gö}BêîÊ3yiáýžHOŠ<ªÝA­ö‹~òC²ssjmu {[ËS`Øí¾xÿDø…ðïŸôˈ"ÑüM᫱i”.˜g³Yµ->ùŸiµ½ÓnÖêÎî„r[Ïez¿æõn©FŽtqƒ”¾n¤¥ÿ€#Ü¡Â9]+{WV»[©MF?t#/ü ˜²üøC{"ÍâYxÞá8»ø•¬üO½2) &{߈z–³<“ï þcH\º«–Ü "¶œ×wžcZ?õî^Ëð¤ RŽI”ÐV§€¢ÒþxûOÆ£›;íÁþðÐQáß xs@¨T.‰¦iA!Œ*‹X¶¨Œ•ÀÇËÇJójb1¿‹^¥_ñÎRÿÒ›= t(Q·²£ VÛ’—ÙHèë#P € ( €9ÝkÂñ"²ø‹Âþו”£®µ¢éº¢²1a}m(+å’˜Ëñ§ÈÍ«_øç@Çü!Ÿþ/hiÜÓüC«è4É€éìÿ´ s\’×u¶¹g1*31RÊþ¾3z6UUJ[¹ÁÂ_'NQŠÿÀ¡å×ᮥý“«‡ke©G榥'ÿ#§²ø›ûDx`íá—Å9ú ë üR/ñCa«Þø·F×u ¾¥á¸’àÄFßA„ãœF£ŒÂTÃl¹¡%V>mé %ä£'ÓÌðñ<Ц›Ââ¡^ßfiÒ—’ZÎ-ù¹EáÚ'À$Õl|1®Å¯|2ñž£2ÛiÞø‘§C Ýj÷œXøkÄVw·ÞñöVBmt sSQ<lj#tgúÌe€ÇÇ›Š…~]\S´âºsBVœíè£æqy~7.\Vt/¢m^/ü3W„­äÙïÜq…P@Èið¦âÏøçIÒ¾ÉâŸGáø|Wª}»RŸûV? Y\iú ýŠæòKK²ÙÝOlíí̾f錌ªÁQKB¦—¹B¶*®6qÞøªôp¸zµy乨àðÐäMS³æŒ§RRU«^Ž"¢æ­C 9mˇ†#Š;+EÚ¾*¼ùÚs÷ù\¹#Çç?þÁŸ²'Ž~ ÍñCÅ<5©xÊëU¶×/î—Pñ.Ÿ¢jº­µÂݵæµàí3\·ðö·%ÕÊ™/…þ•pºƒK)¾[:Mó‚§O/æú­8ÂçJœâ«R‚/bãJeR•ÆÓ(B4ªþú’…oÞâ«UÆÅ,MIMÆš¥Î›…WÛ\Õ©òÕ”¢Ÿ,jJn¤iÆã%N8ÇÖüiðáÄ|5ñÏŠük⿃÷­ðçW´ÔµÍ_ NÒXËåÇo êvVú•’¾›fRÏQ†îÙ<· ‰¥oF­L>aˆÍiNK0ÅP©†­ZMÎUhÕ†"#QT挜£ŠÄ/hâêEÖœ£5'sž­U²èe5)Aåôkañè¨Æ \,¡:£8(Ô¢£*T¤áJP§QÑ¡í#?cK“Ëïa¯ÙGPñ_|ouðkAo|BóÛÅ:¤:§Š-MÌ×WöšíÞ—gi®ÇiáBîöÎ9.nôX4ùî|륞IöågË–]KCûŠxLVE-]:ØJÆacJòXj8ˆÓ©þ¦ÕåAÓÃÑ…:ÅÆ8ê³­‹^Þ¥J8œ<Ü´R†/ <"RŒmW©‡©Râñ1•ZµaV5jNrúGð„¼?â¯xÛHÒ~ÉâÃáëêoÔçþՇ¶7v€Ÿb¹¼’ÒÇì¶WSÇ›8-̾f錎ªÁF†¾*ØlN*¾2¬5÷±8šl5jœÏÞ=‘’§gÍÆsœ¤8:˜j­~ó …† “»÷0Ôë×Ä•¶—-lMyóÉ:Ÿ•ÍÂ0Œy?øQ? ¿áVMðWþoø¶sµÃMá¯íÏüæçÄâ™ÏöÏö¿öªîפ{¯–øc>PÄ F)+K(’ÑäO-xÿ>N¨G.ÿ¯¿WXj ÷ÞÓÛr~ÿÚ¹OšÚ÷³I}¬áæÿçóÍ#Z8ý6§í㈬¿uÉì¹ÿsìÜcËÇüký’g_Ú"óGÔ~0ü0Ò|[ªèVÍe¦ë1ê^!ðÖ·gtÓ®u¯ ë]ö£¦Å,“K¥åÄðC%ÄòE<ò3à°ôV&x¨ÅƽDÔÜe(Æ¥ù5JqjœêES„!Vpu!éÂQ„¥¬kT†žJøZ-Jœ$”½›Qqýܤœé©'ûÈÂJ5\iÊ¢œ©Óqê ýžþ Zü"€Ð|6ðÄäÒN/‚E›>ksµÍô×m)¾›Ä&í÷ûqî›Sûr-ÿÚþÚ¢qÑÚR„±‰KÙOž’‚T#B\ó©þÏ œpÑæ©UòPTáj•#ËËRiÆrËjʶ û*“›G$ªªÍ¨©F¼j©Æ½9B1¦éVS¦èÆ4\=”cÉ|)ý‘?gOú†‰«|-øieá=SÃßð’ÿeê0k¾+ÔïTxº &Û^×:Þ½y&®³[èzdq-û\‹EŘ·óæóuŽ"¬E rª¸e„šQŠR¢±Ki$¬ê:ðƒ•v½¼©Ò¥BU T©CaKTâåþÕ b攤ã^ž¶ ›‹m¸SŽ],ý¬äÖ?ioû ?õ]xŽ€0küÔ?f (Ä?im'U×g¿Z.‡¦jƳª|1ñ†—¤é6w:†§¨ß]hW°ÚÙXXYÇ$÷—sJʑà ;»0URHïðj8n*áŒF"¬(aðù¾YV­Z’Œ)Ò§OBs©Rrj0„ œ§95Å6ÚI°îù„z˘Â+«œð8ˆB]e9Ê1ŒV²“QI¶‘ó¶—ûWøÚo ižðGì“ûQÜxít+ Cÿ„ãὯ|u›{­„úç‹õO<:>’’ùÓÂö$DÄeßÜæ<—b3,v;â á²¼F&½j³Ãf3Æc)áêTœÛ¥ƒ¡‡çÄVŒd­F”ܤî äìŸÌå‹À`2¼#)Ì+TÂaðÔ%aÚ…J´éÂ’µ“N•ÔIO(Z…'*ÓƒPq4¼7ð{ÄŸ µØÃà e}¯?€âø§/Ž|C§[jwÚ%Ÿˆe—å˜l·^T©U«‡Áæy},=N-©Ö† •¡IO•F¤µ„n ‹Ž%ž*Ÿûv'‰µ1Ñ HÑž3 ŸWÄI%d¨Ð­‹§AOݧÌé&Ôª+ü¨ø/ÆÞñ.µ¥üøKûf| ø³uâ±ªÙøSÂÚί~ÇSø™oí¤¼×µk-me¬h:—‡­Q¤C 0KäiñÙm´[Vý.Í2ìn+«ÅøàƵªé_µëkÑ/¢øŸyáíOL»ÐõH|}¡#êÍÏ•e,3Ëdöv–‚o›áiepá¬^θk‡³ªÜ]L~;>£F¦s„PÄßW)Ž"z5£ýÈ¥F•8Eâ£ЯR´é÷cÞ6–#,Áb*eqÁQ„ã”)εlL©V†m uìªÊ“•JRËÕ*´á^‚TdÕHc!>gÀzWÄ_‡¿ bXá'‹õ/|5ñŸÆí[Ä߄־#³ðîŸcã-;TÔ¬Eì^MÖÛmwM:UÄÓ[Újwºžh—¶« £ÕÎq¹.kÄž#b¿·ðÑʳ®ɰÔ3(´éËV®C:TeM8Î=¦»ÆáÔeŠÃ`èc«,=g…•yø|z=| ÂbaÅ_Z¡ƒu]H,?¶Ì1ãT“U0ô–"†X÷|^o”Àeø¬>Y‘ã*ÃEK)Ëð•èá[¥‹Ãbp©Ó ÅNxz”ù«][êØ©âDÞ.Ÿ/Üß²·€u¯ü)ñÞ«w¥ü]е/ø—]ñ¥Š|[ñf—ñâ½å¼þÒôÝ\ñžáý"=Ä·Vše«¿‡nnu;›i!Ž›ñ!h-+ñ5¡˜f9N|¢¼r\Ôêaàê`òÊ5ž/^½ %Iâkýr„j֜ᥠ5*ά§N‹þ-O¨áÜ:Y…l]Hb,M\%%,δcR­<:ä½XF–”TÝçR¤*JQ§ jŸ´õ/Ù«ÁZg€þ øH°Óµ» «ÍÛ^ñ ¾*ðâxSÆ:¯‰õ¸Òû[Õüe¡CP’ÃÄ÷r´Ã6¡|𘒴H&<ž:Ìjfu0•êagW?Ìc9Rœ©Êq†OÃŽ›ƒ‹’ƒœÜSº‹œš·3¿ƒ‹£GÄôébiCJ—`§UŒjB–sŸFRŒfšŒ¤¡)$›QŠnÉ[ñ­Â-gãÃÏxFÕ¼£7ìíã øCÄö’ë^ð•ßÄŠsøCXÒ<;¤I*.‘£ÚÍáø5Ý+O‚hítÝD»ÙÛÇn‹úTÍ)pæ#^¢ÆÇ>Äå+Ë‹ž–W‚ÆÑ›Äk*˜œ,±5(,EER«ÃN“j6,Z†YŠÍ0øJéà«p®aš<4cˆúÖY¥±tTãCJã(RV•:õ䥉ÅâkO¿ñÇÆŸi_Üø¹íaiáãýAʾ8ʸ~¾ Tj3¶c˜ÒT¨Ö”"ãí0õê<5z”àâçJ¤éÁ§1•ZÑÁ`ñ󧇯•ñÕñu Ÿ°öt2ö»ÆBœ§N”ðs†-Ñ©9N‚”¨Ê¥GOÚÏ£ðí=ý­ã†ú.±ñ#àãø§qs§Cáo…:нñwÃMe´+ÿéÖzüÇÆzÇü&z8¶Ó®´›­b-ÂÆóg'Ø|›×ŽÃ«Ãꔳ\-<>652º­OV“†õZ§ŠŒ)ªMa\éÍã0œØÌJ¨¹:®”§äPÏZ tëàãK^eñ¨ž; lšÂNUT±(TöX|ua(¸N¿·§?g‡œ*wŸµwtß|0»ñV™àËߊºî™ðÊÇÄÚ¶«i¢YøzËÄléâË©ßKŸÙ~‡Yº¥–k”µ„:¼ËŸ#ÂSÇgY~½­a(:˜ì]h«á2øýbxYSºçŽ>´he²ŠævÆó{9ÂG³šc«eyN?…”iãaxlçnHc±³Xl5i^Q÷0\õ3ŠêôpU4/Ï-øñá瀼!ñëÂñ.…ãümkÇ^—Á¾"Ó¼KkqðÓÄ:v¡âý/@±Ô,'šÖ;­#XƒÄÚùßèÐÙéû•!–"þ–qC2Åàr\Ë„«ÓR9>"5iJƒ­‹£R v¹[tñXØ8Ê´iÉχÆÿµ*±\ 03lNK‚ÆÑ– Y†T¦ªý^”á9•*‘ƒqU)c¨×ÇòÁÁNŽc‡P‚’™ÒüBÔhóðKâ‰õ-áV‘o¨|ñ—ˆZßAðߎ4ÿøù|?ý«i¦Økã‰"ñ…àÓŽ¥cý®¶þ6W°ÚjQØ^FM8ü>O…ÄÏ/šÄâÞ…ÃʲÑÆ¥‰X|D^Ò¨ð´jI¬/_ÏF50• eŠ£épî#4Çâ2|}7†ÃQÇÊJXz”ªÔ©…fªá*Õ¯Ô㊩ÒÄáa‡Â*Ò­:´±´4q–¼7ñçÀwºÌÞ7³ðަÞý˜|%ñYñg†|'w¡øƒR°·Õ¼rË /Û|E¬Mý‘k§èñ<6¯u ûuåõÈhÒìAfwʧVÂÆ¬gþŽwZ>ʾ&½ ¯k;R‚Œ¥ˆ|”e%'‡ÃOÙNuœ]YyÜ7N¤²þ ÃÖ©NQÅåøéªŠ“æÃaèG#qŒ©.i:8…õ¹G‘bªa¨N¨(ªgC¥|Hø³áýOá]×Ä{_xã¨ú•‡ƒ4¯éú§ÃÍfûÃZ¿‹´ -S\ÖìÊù£Ô2µ­Fñ—y¢x‡IÓuÍþ#ö•«Ù[j:uä$‚c¹³»ŽH¦L€pèp@#*éU©Bq«F¤¨Ôƒ¼e 8Ê/É«4EJtêÂTªÂ5)ÉYÆIJ-y§tÍOÞ#Ö4oø›àåÞ¡¨ëú‰áÆÞÔukËSYÐtÍSWÖ4¿꺵ä’\ê–0Ýi s¥ÝßK=ÛC5ý¬²É›Wì-šâ3LåŠ÷«aê{7Q+*‹•I6•’’½¤’¶ÏKÙ~WÄym ·a½ÚUáΡ{¸>g“wn:^-ëºÖ×S×ÒŸ>P@ñíûbx+öyø»ð'á׉õ­'K±ø‹©ksxÊæÿÃþ.Õïô ¦‹«Zx^÷E“Ãö²@.ï¼{—§H%Žù£·’iÞØ]ÀeRŽeŸUÈé'*ËÍIEòIæxŒ~_C-ÂÊS^ÏÙbp²ÍªÎwŒiTÂQUkRö§]frŽYÃõ󺯒10M´å©aéʶk[–©Ï…¥<,©Å{Õ=¬•*uåFOÅŸÛcö[øâäðÄ/‡¼\a·žãCµÒ|Qâ[-.Â5ªë²xSBÔáðôòÁ,7 §-¤†Þhîy,ž­,f!ápõ#*‘œi¹Iû:œ§*|¯S“9ÂJ²uÙôuýš”[×F® Mjr…)Æs‚Iʬ¡M&ç æ­(Êö¥(Ój´ã8Rs9Æ?Ki¾“â +M×tOOÖ´MbÂÓTÒ5}&òßPÒõM2þ¹±Ô4ëûI$‚òÊâÚXåŠx]ÒD‘YX«zkQ­…«Sˆ¥:èIÂ¥:‘pœ'iFQ’N2‹Vi¤Ó9éU§Z ¥)©ÁÝ&»Å¸É>ÒŒ“Œ¢ìã$âÒi£ç/ˆÿ¶oìÃð⯈Ÿü=á¯_6”¤Mg¯_[iM¬Ì°éÃÄÚö•¤]i.¯ÃÿmßéþM¤ðÞOåÚMÏ|^i‰x<ûF"3•%ÔTêÁ6èÓœùaVµâéÆ9J¤«Ûºò7щ£W†§‹ÄAÓ£V3”ÅRP‚‹usVöræµ:žÏ’¬£R4¥9Rª¡Ò|mý§¾þΖš߯_ˆºgƒWÄ“K‡gýŸ®øƒVÔVÞ6–{¸4O iZ– 4È€T’ýíVÕ%šZa-ÄI';¯J8—ƒæÿi?k*iI¸CŸ’.£K–Ÿ<”Õ%7UöU½š’£W‘Bœ§†Ž2–rQ…E(òÔn*»Öõ`ã)Ê Q‚©KÇÚÓæòïþѺ_Š< ðâ'ÀoéúÇ„þ"þÐ? <¨ë~Ÿmp/ü9­j:…¯ˆt ËéŸlÐuò#IRKkB؃l·M*©ñ`q¶2ÃçåâãZlƒ4Æá¥m¯cŒÂÓsŒ&œjÑ©†®¯ÔŽ:øšO#â^íYbÀÂ-¦¥F­Lï*ÂUR§4¯í0¸ªœŽpq*Ôñ[R£TÔøcñÖ-;Ãß´‡Œþ3xãIÑü#ð·ãÏ|%a­ëI¤èÖ:„´[_Hó,m }NìÝê2Ãn$[»û¹îâ ò¼Q×U\9Ãù–.oëèfžÒQŒ§R´ðÙîq„£T)FRHàðt ©Ð¦ç5IÔq•GRríöëñm—aaÍG K(8^1%‰É2ìf&¥J³iB›ÄW«Vu+TTèÆMsS¥£Ö|ý­?goÚ*óWÓ>|NÒ|]«hVË{©h¯¦ø‡ÃZäzyxâmJÛEñn¥ßj:\SÏo ×–vóÁ·VñM"Iq¿¡,=h`çp¾ŒÝ:•"Ô½”Ô9âªF-Ο´Š“¢çÆ»§YQs• Ê¿X¤«¬+“gJ*Q”c>khÓ©(ªujEQœªS§)T¥IÕŒ!Rœ§sáÏíGðâ׌î>|9ñì>)ñu—‡¦ñMþ“eáÿÀºn‹oª Iµ=FÿB‚ÇM¼þÐhÑtû«˜¯9¢-Ú RFÏ ÁÔÇáy‚£¥Vê1¶a…†3 ÉÍÊêJ¦jR…5)Pœ+Q®©W¡Z=1ŽK ˆýÖ"µ\mSió9åø¬F ¢½¡G…­KÚ»R©js¥9Ó¯BU=þ¤  Câ‚´¯‰ñ¿Ã­vkûmǾñ/‚µ›*X-õK}+Å:5ͦÏums 7ég}3C$ÖóƲ*ŠEÁÿáš­:õé:ø¹NuhÛÙIW•wˆ‡%­Ó«ÚU­R¢–Íób)âž%ûj1q„¹)¤£-×"‚ƒ¿VâÞ‹ùU¿¡}à-ÏŠ4-ÄÞý«¾.ÒVÔ´ BâÝ­nc’ÞåßWЯ­ÊäݫAt‘Äêa»´³»³äÆà°Øü<ð¸ªj¥)tÙ¦¶”ZÖ2]ôØéÂbëàkÆŸ³©¹®±’Ù§Õ?Ìù›UÔ>%ü8†yüâ¿ø‘mÅ{ªÙÞÜéÓ¡ÚöÚœ2™ôË´•íTo•ÑXb¾GƒÅ`åÉŠÃÔÃË¢© Bþ¤¤¼ÕÑõ1XlLy°Õé׊ߒJVõIÝ?'fyv¡ðÃâM‡Ä¿|BðÄ/èqøßJð†›©hÞ/ø_¯xÅí_Âú¥½­Åާ¢üZð¸EuiŒ‘Ëi)Sm~»º0¸¬=,¾y~+R½5¯Ž„©V FXŒ_„9©ÐÄ)¤²øN2\:’‹Nɜ؜iæTó,-xP«áV”ªÁ†3‹HòV á&ñÒ„“sV§¬ÛF}ßÀuox {ÆoªxëâмâøÀx~+M9aø}âM\Ðü/á¿ Å«3hÞ¶´Ñæ´·ŠçUÔ®ÒMVêòîòúw`ûÑÌéá19$°¸WK’âgŒöR«Ï[‰­EQÄWÄb=œcíjFiÇÙЧJŽBŒ(Þ3©4ð5*Ã6ž*´*c3L²¾RªS£ì©a°µ(ã)Ò*N¥J’䫎¯Š­íqzõjFÃá–†Ôø£ð¯Ç_ì¼Yá/øXÚ¯Ã鋤kÞ×>C¯ø‡H²¸¶[-Q|â›hÖº\³B‚îÚm{Cñ<–šƒ½Â¼¶Ë ¾~'„©„­ŠÁTÅWÀbébèΖ&Xg9P­KB•{SªÜ)Ö¤—6á+º2pöªºŽ&=8˜b¥í>§^žVÃUÃT…j K÷”êÒ•XCÚQ|ò…[T§Zuðóté¥Fu¡W‘ñOìé®ë|Vðöñ& øã%•¼.±> :׎m'¶ðn›à–OxÚóÅQÙØé7V‰¦ ­oü9ªN¢mHÚ^ZO{ÅŽ¯3\5b°Ê¶'ŠÄã0“Œ£F‚­ˆÅ,wûf<[œãì«á*J‚¡…YPÃÆ2ç¡€–½:˜:î•—a2ÚÑš”ë{%*øhÕÂÖU)¬.#êõ¯:UéC‹tg:µa=Aðkâ>™â}ÆÞø«áí;Ķ_ ¼-ð¿VƒXøeu­xWZOjZΩ/ˆ¿±­>"iš†Ÿ¨Iq©Æ¶°G­É ª Åœ_}ªaµl× ]ç”çœpùÎcý ¹q WÂÍQ% ueBT¦¯RMº˜i&¹cÊ¥w–.«…ÁdXhâT«d8|VGIû:ðÄ<¶)W¢ª)Z²õÍìkRœëÎ5!R•TÃWl_³?†þËá}*û^Ôõ#Kð·ÆOø©u(cm_Æwß/4½GÅšõÆ©e5´z=Ïö…¦¡,p[Y6“Ì~Æ:3 v,N/ê>Ç4ÄÕ¥]ÏÚÊX:XˆV†&¥JU×J¥h(ªu±ÕáO Rµ4¥ZTq8~\£ ŠÉñThcTò¼¢¢•:¢¾µV•$á…ÃWŹºr¥Jœ¯Rt°tq«ÑÃTöð¥VoCø!;\êw>?ñ—âõ×¾ èÿ5û3Â×>Óµ3JÔüSrúšAsâf[Y.´ß¥¬–âyËf÷Ê«p¶öÏ1Ì)c#›B… ˜OíLÆŽd¥íÔ燯Nƒ§%JJ;Ú¼zkšŠP§7ZQude8Jùm,‚œëÃø~Ž/ì]8×£ˆyj¦ªÃÛOÞ…,¹B³Œ”1´¥aãM×Ð~ x«ûWÀ2øÿâM¿4…W7ÞÓl|žÕ®u#£_øgKÕþ ëIâMFßÅžŸáýFò8Î¥xZÖK«©næ´|A ­bó:XˆæÕéàÕ Ó9ÂTÂW®ªsФ±2…LuL&ÁNŒñu)Á?i‰¯T%V…%iÏZMJ|[õÇ<£.ÄQ¯F‹§lLãƒö‹‡Äâ£5 Ô0ª¤*IC F®#…ÂV©UFèâl蟱¼ð/Áÿð”}£þ·ˆôûGûÉÿ„—û/Þ'ðÿÙ>Éý®ÿØþgü$~›ç_mû—±¼ÝñÍ9óJ¹—°åö¹u\³çÛÚa(a}¯?&¼¾ÇÚ{>U~n^ungèÔÃóá³·.à¬uwãæ°tºÂ-N«Zi¥á ­›riïåñü]ƒ ¥ *¢ÚRN“×½§+=ÒQMm3é† 4χzœ¿Ú7¾$ñg‰&µ»ñoŒ5T‚-G\¹±ŠH,- ´µU·Ñ|=§C4ñXi6Š!·H×××·—¿¤`p8l» .š§J6ä÷”›ÕÉ÷},•’Høf3¯,F&§=IiÙE-£´Š]—›wm³Ók¬å ( € øCö½ñ·‡>|Uý>&øâòãFð/†þ*xëH×|Bšn¥©ÛiWþ/øQâ ÃÑ]C¥Z\Ü(»Ô¤†XX(ŽGr©2¬¥9q],Wï³~ͲÜ*vQ©¯p¦"…'hÁÕ§ƒ¯Ë)¸Ár79B)ÉVdùxW5­Ë)SËsŸ0ÄrFS•,ã~±ˆp‚”Ü):´¢ùbå*•iR„eV­8KÄ<)ûAüý”¼aûG|>ý£4ýgÃ~<ø‹ñ{ƾ8ѯäð‰ü[oñÛÀž.g—Á–š©¢èwöº‚iúdãÃ¥ßÏmkipÒ[«‚÷b/²Åð¶_ÃÔ°2Çæ8*Yž“Fœ|v7ÅÍâ”$ãF²Ï¡:P£^µHÖ¬èºx¨Ò(_loû6{‹â^ž ,Æa²z˜\ÕÕŒháheÙn_ Rtœ«ÐyN&–#Qºqr£¥¥í&LúËö'ðŸˆüû7xGñ7‡u/]O}ã]{KðF³öú·‚¼1âoøÄ>ð¦£kr«-•æ›áíON‚KIZÙ”Û•SÑïcTéÒɰµ±0ÆãrüŸ'Áã10Ÿ´…|^-ÃQ¯%Wþ^òNµÞ«¥í^³<Ú.•Lfw‰Ãa%€Àã3\}|.T¡AÒ£:ò\ÞÆ“•*KV5qq95(âIZ¤çò/‡þ8ü ýž5¯Ú+àÇí ájïâ/Å_<[£x(|*Ö¼usûDxCÇ:ˆ“À¾6š%Þâ?>‡MÕo­`‚öÆkGh¶ÌSÇÊ¡nAd¸lÄãò¯¬SÆà}(Íca˜×ÆO5—´”h:u0î†3ë•*F²¥ƒçšŒ(aå?[J¥ ç1Î*WŽ-ÌèåñÃãåRn,>$À`±Y|åMN­'ƒ¯ O¶ ©¸Nž6§yã«¥Köªø»¦xã÷ÇŸ5_Ù áÞ©ð2ÎÒßâ†þè~3øŸã˜µMfûþoƒÚwÄÛ ø¢O†“øZ8ü=¨%¾‘m{w¤·M!wÓeZsRÅñv˜U¯7ˆ£á°ujPži„Ä8æëÕ:•,\Þ¬éTtå%NxyʵU9VþÅáªØ¯Ùa©Nx™ÕÅF•JyN!ýRò¹eФ©Ñ¯‹ÁB´å‰µZ~¬ðéU† µ*Þ%ðâÚO„·‚ˆs´ðS¿ \nøº²¯Å)lõTÒµ]&ÿÇæhÐÍâ{Ý2îÖêîu%šyO3ø_¶_»kão„Z„z¤¸û¡µÿ|GÒìà=wáÙsòí ƒ¿È«ÁLÛtêb(vQœeòœ%'ÿ#Ô¥Åù4”éЫmÜ¡(¿ü’qŠÿÀY“'„¿ií;!üðOݯ}7â¯<7|ø;U£Ò5/„Z°V8v ¬©Œd/œ@ÝæÏ€£wì³7¶R¡ÅU¿ð¸ï‡µoi—¦ú¸Ö·àéËó3Þ|Ý~ÎúåèÁm¾ø“ð¾õÂ'ÞB¾ ñ„¿haþ­C˜ÉûòÄ9®)ð.>?ÃÆP—ª©M£/ë£:áÆx/·„­vp—ç(ÿ]QY¼Sñ.²÷ökøÛg7ÞX–çඪ g…´øã¡l¹`ÃËiÖA·,Y `ø7ŽÕ°²ô©Sõ¢×eoþ]bcnŽ?Ò«+ŸøN×øñÕYxe‚@¬8eC­¼r`änÝOUb'õ3;_bŽŸôõ’5\Y”5UåìŸèÃþˆèˆ|uÿ ùoKýMÎÿçÝü¿È?ÖÌ£ùêÿà§þ`<â#€¿þ:–<*ŸCIà òëJ‰Ïñ;*ޤ€3BàÌïù(¯ûŠ¿È?ÖÌ¡}ªºtöOüË âŸ‰s–_³gÆÛ¹‡>K\|Ò€AÃ?ÚuÿŒVǨØ'2åP…b»®Íßü½ÂÆÝêTý(³'ÆZZRÄ»tTéþµQe'øñuͯìí¯X Ljþ$|-±p÷c+áïkª.”}ôb“H0Nðà\ÛÆP…—ERZüã<íòF2ã<ø0•¥êá>R—ÝøšxOö¿ÀÁ|3 p'Õ>+xËÄ7ñóµ™ôm/á³*çz…Ö‰.ÆòKo^Ú|•½®fÚê£Bßsueÿ¤œsãW¯³ËÔm³•kþ šüÍX> üxÔHþÚøÍà[·Þµð_Â=FãS‡¹ â|GÔm&Á >‹9!‹¯•éRàŒ¦›N¥\E{n¥8F?t!/ü œxÃ3šj:{5 7ÿ“MÅÿà(ܵý–ô[Î|qñSãGŽÃs%œž4ƒáÞ›ž¦·ø7¤xBâ[0r<›Ë»ÂéòNóÛ½|?d¸_áåô¤×Z—«ó^ÕÎÏÒÖéc˯Ÿfø'Ž©ºSµ/—îÔn½~w=OÁ>ü7¸’ûÀßü#á½Ztòîõë Èx’ý í?Ú~$ž)5MMŠ’ ]]ÌH''šö!SŠ„"¡«%’K²KcÊ”¥6å99IêÛm¿›g¦ÕP@P@P@P@P@P@P@?øþNŸàßýÚ[ÿV/ì@@P@P@P@P@P@P@P@P@P@P@P@xçŠ>?ü$ðޱuá»ï¶µâ«£Pð€¼?â‰Þ3Ó ‡ÔüðßE×5­6¡›Ì¹±‰£1mªHåÅc°X*˜Üe 6ì¥Z¬)Fý¹§(«üûw*1”´Œ\­Ñ&ÿ#š?´f•'Ícð£ãåü<|&×´¯œuO²ø…´ë¾Ó¿ìûì%X/>/áŠO–YÞ¿îÔS_|9—Ê÷4XzßóêKåoÌOøh›oú#ðÜþ\T®\/ÿC¬?þ/þD>¯[þ}°ÿ†‰¶ÿ¢7ñ÷ÿ ÁÿåÅë— ÿÐëÿKÿ‘«ÖÿŸl?á¢m¿èü}ÿÃpùqGúåÂÿô:ÃÿàRÿäCêõ¿çÛøh›oú#ðÜþ\Qþ¹p¿ý°ÿø¿ùú½oùöÃþ&ÛþˆßÇßü7ÿ—®\/ÿC¬?þ/þD>¯[þ}°ÿ†‰¶ÿ¢7ñ÷ÿ ÁÿåÅë— ÿÐëÿKÿ‘«ÖÿŸl?á¢m¿èü}ÿÃpùqGúåÂÿô:ÃÿàRÿäCêõ¿çÛøh›oú#ðÜþ\Qþ¹p¿ý°ÿø¿ùú½oùöÃþ&ÛþˆßÇßü7ÿ—®\/ÿC¬?þ/þD>¯[þ}°ÿ†‰¶ÿ¢7ñ÷ÿ ÁÿåÅë— ÿÐëÿKÿ‘«ÖÿŸl?á¢m¿èü}ÿÃpùqGúåÂÿô:ÃÿàRÿäCêõ¿çÛøh›oú#ðÜþ\Qþ¹p¿ý°ÿø¿ùú½oùöÃþ&ÛþˆßÇßü7ÿ—®\/ÿC¬?þ/þD>¯[þ}°ÿ†‰¶ÿ¢7ñ÷ÿ ÁÿåÅë— ÿÐëÿKÿ‘«ÖÿŸlñ{ãżŸ´‡Â[þ?ÆØÅÁÚ N:tž)ª]SÇŸ³5ÊÞYÙÿjŸ?Oµ;Es6õò¤ÔlWk}£)¬x³‡˜ˆæô S§Ns¼­ÕIS‹÷w”hÕkÊ ^²j>ÍÞͥ䬟Ýt{wü4M·ý¿¿ønÿ.+/õË…ÿèu‡ÿÀ¥ÿÈêõ¿çÛøh›oú#ðÜþ\Qþ¹p¿ý°ÿø¿ùú½oùöÃþ&ÛþˆßÇßü7ÿ—®\/ÿC¬?þ/þD>¯[þ}°ÿ†‰¶ÿ¢7ñ÷ÿ ÁÿåÅë— ÿÐëÿKÿ‘«ÖÿŸl?á¢m¿èü}ÿÃpùqGúåÂÿô:ÃÿàRÿäCêõ¿çÛøh›oú#ðÜþ\Qþ¹p¿ý°ÿø¿ùú½oùöÃþ&ÛþˆßÇßü7ÿ—®\/ÿC¬?þ/þD>¯[þ}°ÿ†‰¶ÿ¢7ñ÷ÿ ÁÿåÅë— ÿÐëÿKÿ‘«ÖÿŸl?á¢m¿èü}ÿÃpùqGúåÂÿô:ÃÿàRÿäCêõ¿çÛøh›oú#ðÜþ\Qþ¹p¿ý°ÿø¿ùú½oùöÃþ&ÛþˆßÇßü7ÿ—®\/ÿC¬?þ/þD>¯[þ}°ÿ†‰¶ÿ¢7ñ÷ÿ ÁÿåÅë— ÿÐëÿKÿ‘«ÖÿŸl?á¢m¿èü}ÿÃpùqGúåÂÿô:ÃÿàRÿäCêõ¿çÛøh›oú#ðÜþ\Qþ¹p¿ý°ÿø¿ùú½oùöÅ´f—7¿ þ>XÂ8óÏÂoSÃÿ }›@’þëž~³ìù™r3Pâþ›åŽw…OûÕ9žsQ_+Ü>¯YË©}ßät^ý ¾ø§X³ð寊fðÿ‰õ<­+Ÿü5âÏ…~-ÖŒ¿4-VÖcä~òÆÎtÿj½œ&?Ž‹žC»9P«N¬SìÝ9I'äg(JJ.>M5ùžÍ]d…P@P@P@P@P@P@ wHѤ‘•#Egwv ˆŠ 331T($“À€>hž÷Vøêe–ÓUÕ|7ðYex´éü?©êZŠ>,,'cjÑøƒK¸¶½ðçÃWIöOìÙ¡½×’8îÅݾ‹*C¯~MÆœ<¾­L§#œ~·Iò×ÅZ3-éR‹N2¨¶©)'zÂÎ|ÞÏ» …æJu£Ò;_Íùvï鿦øoÂþðn‘káÿ è:?†t; E®“¡éÖš^Ÿl-lâŽ?5Øny –vË1,I¯ÄñœF.¬«â«ÔÄV—Å:³”æû^RmÙt[.‡¥¨+E(¥ÑhnÖ ( € ( € ( € (Á¼Cÿ'?ðþÈ/íÿ« öV¯j‡ü“Ù§ýŒr¿ýFÎ ßñaþ þtÏy¯Ð( € ( € ( € (  Oxkþ.Ò.ü?â­ Hñ&‡~ž]î®iÖš®›t„öW±I„g •ÊžAf¶Ãâ1:°¯…­<5jnñ9ʤ¢Ó_xœSVi5Ùž]ίðRïûGVñ/Ád‘Wƒ\Ôõ=wÄÿ í¼¶×,5­J[«ï|;·fG¾³Ô.$ºÐí–{»[™´Ëoìý?ö® ñ¦6µ§<šúÍWËCîÁT“øiVI(Æmû°œRSmA¥;9ùØŒ*‚u)h£¼{y¯.ë§åô¼RÅ®ÖY[S N½ãg^’¼à£ÍíV’SpTç*ua ÊtªF ³Xjøl5WìëâðóÅQƒÞxzuUTÒê)T”W,œfÔ£5 )<¯‹ß~|ðÔ~-ø¹ã]/Áš÷qXÙËyýþ¡©^I$iöm#BѬï5=bX„©,ÂÊÎ"óÍåÃÈ«-ËqÙ¶2ž_–᥊ÅÔŒæ¡$¡M^u*Nn4éS‹q‡=IB¥JT“u*Ó„­ÆQ£W×- sm$¥6Ô ¯ñNV”•8Þn©S—’IGžø/ûMüý¡SUÿ…=ñHñ}Έßñ4ÒŦ³ k¶m‹öð÷‰ôÝ;S“I2]ÁÔ#´{S34"c4n‹èæÜ1žä4©VÍ2éá¨Wj1ª§Jµ.wÏËNu(N¤)Õ’¥RQ¥RQ©(BU#ÌqÃ…©ˆú¤+/¬{7V4Úq”©ÆQ„ç$¹ãNS§®ÞÉÕ¤ªrûZ|Þáuukcks{{s•œ]]ÝÝM½­­­¼m,÷73ÊËE;¼ŽÊªªYˆšð%(Â.Rj1Šm¶ì’Z¶ÛÑ$·}ØBu' T¡)Ôœ”a¦å)7hÆ1WnM´’Jíè’4/ÛãöAñ'Ž øw£üpðÕlj®µ[­ÓÎÓ|O§øróQµ3©†ÏÆúŽ…†î⸒ŽÒâ-Yá¾’X#³’y.aY~²<ÅoñË%­ì#Ny©,O,åE,¨±n¢s5AÖ§9Î…:’&+…Ásýb¼# j.SŒ•JP‹IóJ­>zq„S½I¹(ÒJ^ÑÖVúú¾Pè ðoÿÉÏüÿ² ûGÿêÂý•«Ú¡ÿ$öiÿc¯ÿQ³ƒ7üX‚3ÞkÅ4 ( € (/F×tOØÿiø{YÒµÝ7íz…‡ö†¨Zj–?nÒ/ît­VËív3KÚìµ;;»;ˆwï†{Y¡‘VH™WZ´+aÝ8×£:­*U ªBPs£^œkP«$¹©V£8U¥Q^)Î3ƒq’m])Õ¥{TÃÎTªÃíR©sS©á8ÝsBII]]jjVC ( € ( tGFÕYJ::†FFYYHÁR 1Bvµ´k`<£à5Ãøjü™Ù­¾êº;x$Jŧ ¼c§>§àËWÉÿ}U°ñ…-q’Ö^ ´yæyXÿQðnq<ï Áâ«IKGš…v¿çå'ʤÿ½R•´NvZ."Ÿ²«(­#ºôäô>‡¯©0 ( € ( € ( € ( € ( € (æÏ¶~Ô>Wÿ™wà¶yÇü&_ü/6zȇa»¦q]¼~Wâ½WŸ,£ÒxÎüF¤Wþœgv~òokFߊÿ#Ù+ðsÓ ( € ( €9?xËEøuàŸxóÄW k¡ø;ÃÚ¿‰5I]Õ1g£ØÍ},q–ûÓȰùq žI` ÉZ£…-/oН8Q¡IhêW«8Ò£NîÉsÕ”!vÔc{ɤ›]X,7Öñx|3¨¨B¬ãÕ•”(Ó½êV›“ŒcN5*•%)F1„e)J1M¯Á¿†ßµwÀOëÿ~2Û|Qµ½ø×≾9¸ý¢´áiVçÂ_/쥾³›Äz¦ƒg£ÞZøOø"8 _´2E£\Én»J ýÝðžuR¶/…pø[‡±p¹~ ÏAΦm–OŽÃc#B5}µ7™f9†mN¬ •£K7ªÕ—Íãñ‘Åas,Ú¬ Ë šQÇà°éγ†[B…<ž®[NT©òÕ”òšT±´á ã¨5)ƶ'V·êOí ðçâž©ñ7áoÅÿz‡ÂmWâWÃÿ øëK·ðÅŸíA§k^ñ¾}g\ð–¡ ÍöÍÄðOa¦éIw$bÈÅâ]·W&"¼ü»‡³_‡â m†ÇUÊsHeôñSËåJž*\%l]|5*ëØrb¯ˆj¤¢§„S:ŽŸ=WN†c‚Ë©SÄÓ¡‹Âb+âòúõ!íð’•|=,-Z•éÓ”kT£‡Œè×RÂÍTnJ×µ„— ðóâ“x“öðl´ì­«üøå©ø;ÄšWŸGã⇼Yḑõ_ø:÷Åžû „ºÝ¬Zlº•¶‹¨[jOm Ý]Æö-{Ô}Z™U*w>âˆgN…\Û,-\%XÓU°´°øÊ4±ÑÎ ½Z41Š>ůÜQ”ëÆ3†Ÿ_–Yõü°Ær`«Æ¢ªðøê˜\Z© Dað”kPýÞU*J–79B•|4&ûßÛiRûá¼)©]Kiàÿüvø7àˆEé ß‚5ßÚ¦­¥^ÝÛ -ÁO=⬪¶?4ÍóÂ<¹ÊYd0ðÁΜqUñ£Fœèâ2s§C J>Áa›”¡Bp„gÇl>9^M–F2¥O-£Š©‰uç^Tcõ¬^ ƒ¦¤ç휩à«ÖÅ×­VuaRzkß–"ܯÇÏÚ[VÕþü_x?Fø»iñ£âoÀÏxÂÚÞøK^¶Ð¾'<9ñ2×ÃסÔaÐõ MQ´[í2ÞçU±{ie¶Ó®|ˆ:¿±2,\jçT(VÂdØîÄgÂûWZ¶_Áq]”âptkK“ÛÒW_ †Äâ!SØaqÐÄÕ£‹ÄàùjÍybr¸b©Uœqõ²ÜÓ!T§/Üýw.Íð8ÉÓŽ1S‚޲ÄÂ5q0ÂEþï 8|U7ˆZ~qfŸµ×Š?j{¯€oûGhzoþ|$ø‰¯i#ø5á«ßx[Çšßìù©Ýx7Pøl÷©¢h7v¶™§íÖ`{Ö’ÖFO#Ï-"uί SàçÄ”¸vk _6x*™bÌ«¨K—áq•!ˆ–.Tg[ÙÔ£…áMSq«I+8FO¯±žK S±Æà¨âï,=ªà©ÔÅâ0²ö*aKå<º§$k;¥V³”£Í‡T=N×ã×íão~ÆãÂ^ ð~ñâ÷‰~%ø'Ç·×ú,‡…o&ðO†ü_iuâˆìÁo[[ŸÉâ }6Æ}*;˸!ÓçšÞÆy<¾Jù@³Î%¦©â)d´xs a¹]ñ89cq<9Vœ))T”*N4ó:Ù|&xŠta]bêÃW Ôç¡W‚ÉñÌòn ¥“ºœÜ”ñ~ǘ៶ä§MBž&xjÄÎ…U#Qá!‡s8AâoŽ_´‡ì³yã|Sñ¯†¿hMw[ø{~ øÒoé¦o\xÛÁß fðwŒ¼9ákøì—ÃÖÚÏŒô=R;¸.æH?´c{°Ïo ‹Âe9'C ²\º\9ŠÂæ¹vMâëbèÕÀãécñ/•©Î¥<]åø¬:£NŒí„Ÿ³»ÄIôMO/•~2»Äe2Ág«BÎOiB¥CØá°ÞÏý¢¾&kÔxyã³ünA‚®°q•,ž4±-{IÑÆc²º5gIBtÜ#CÚÖ¡Š•iÇ5,EHS¦©áÖ§=ñûößÔ,oþø2/Þý—“Æ?ü!ñ‹Äÿnþkÿµ‰¯¼[£Kðg„¼'k§ju½Š=–£5õö­ ”FöKi'™ë?­—p]8æ\Wllú‡fõòœ.8ªX7]Ѽªâ1x‰{7S£Wé¬=§,G2”Ý?/˜J¶CÃøÊ´any…xšóR’£ƒ§H^„çZ®# E*qªý,%*µ*Z¼ðéãøWöÖñ߉gßÚm<ñcÃÿ|uðKMð>¥àº?Û¯GâûêñÙ,%øyâí-l´¯é÷Ö:œíioö ­o¬dƒmÄÌûcø><ׂ+O&–IC>Ρ•âòÊøß®PýÜð¼µèâðóúÊÃã(â-Zœ¥NCèËêõ0©V½:XœÇ ŠÇ“¯ÕŽ € ( € ( € ( € ( € ( €>kÕ?äèâÿ²ßú±+òoä]”ÿØEOý4wà>:ž‹ó=–¿ =  € ( € (ƾ:|!OŽ ±ð¡â ´? ]x·ÂÚǬmìî_øWÃÚ¤zÅÑ¥ht›mVòÒÂ;‹Í·ŸèÑ\Aöv7"H}\‹3þÃÎ0YÄh,E|±V«…‹’Œiã] ”°˜©óB¢œpuj,Ti%:Ô¨µZšƒRšêUrüÏN¤ðÕ3 :¬E9NhR©^‹Å:R§(N5k`ãˆÂB¤jGÙkžøûâO~Ðÿ <ÃË_Ž?…4ûË?øM.¢’]Ç µ½fòÇÄ–F(¼ø£¸Õ‹R#Qc+G ö/‹),Ó;­ý‘N¦EÄ5iâ1¹MZ¼ÐúÕ:sK†¯ TÞíªTj­*)Ç RX4¹U:”ü¼&ØdøL¢½W]euê×ÀU=)aUJ‘Š¥oiQÕ§õ:t0µyçÍYЄï u1zÝ/Ã٫ƺOt_Š?~<øƒö€ñǃ-u{‡/ƒ<7ðÏ ƒ^³:¾§oàï I4ŸŠ®,ä½³:½ÕÉ+gyä7C«†/ˆpÀã°CK#†kTñÕ^&¾2½j*½<4*W²¡A×§JµhS5Z”hÞqŒgަ½yᣉÆJ¦ WëðЄiÂxžIÒlK½‰Ta'õJU?w†«*µãUœ%Kß~&ü7ð§ÅÏxá×lå½ð牬~Çz¶Óµ¥õ¤±MÞŸªi—ˆ Yj¶…½­å´á[ËžÖ6*Ê ·Íá1Xœ/ ŽÁWž€­ ô+S|³§R›ºiö’¼'œjS”éÍJ”_£J§²ö‘•8W£^J5¨ÕNT«P­Nµ±N-Â¥9J2å”f¯Í BqŒ—ÆÒþÇ¿|CcÿÄ_Û_â/ŒþÊLÕ< ÃßxsǾ ð¥¸iÞñÆ‹ ÙuÍPÍYÛë¯j²jöÿn†D·ûqh>ÅqFE‘Ì`ãÓp­ ÑÄ׆_ Zq笲¨ÅQT’ö’ÃÐX¼5gF¼*Ê¥ç¨âpЫK-ÇUÀÂNJœí¸Š4ÝNuì«Í.J°K–#N1ýß±xw*·ñçì©â¨¼`¾:ý›~8j_³nµ¨ø[ÃÞ ñv›aà üHð‰t_Z®ŸáÇ…üQso•¯éºbǧ.¥²³Y[Cn±Åû÷¹áÁñ5éc0¼C—Ljp˜¬m|Ê*¥z˜jôqØ•‰©GE7 —V¾0Œ*â¯6å%_TÂC—S¡Gêõòœ3ÀáªÂs²À:’¯õZ´e'N³¥ˆ”ëaëË÷ô]|\êGjvüû!é~Õ>ë–¾>×µý{áÿÄOˆüsâiöÚ†½ñKÆŸ|¨x3W¿¼¼´»³‡Ã¶öÉwjÖ°Gm¨­4»k2Ìû®ÚëñOµxúrÚx<¶yÈpJUfãÂ,ß›F¤êÔSž.¼ª`êýb¤½“¯[|N·þÅþÌû7öü ž*ýšôÿÚ?Úÿiý»ûOÍÇÙm<#ffß¹1XßkÀ8œ—ÙòýS=Ž/Ûs_›ûCˆ¥ìýŸ*åö?Qæçç~ÓÚÛ–—žõ—´Ì0د‡ÙeÔ°\½ý†;‹ö·ÒÜßÚÏ’Ï—Øóó¿iË ø—ðPð…ïìIðcHø“®èúÆñCãn­¢üFðæ›m¤êšV³qà¯øïIº%õÞ¥kao¨Ooiy¦ÝË5¶§gյ¤7®‰ìåÃÅã8›3Žœ^ƒpøOc[÷ôkC áL¦¯´-7jôUJåq«…©8T¡YW¡N²XÊt©åy½jÑu¨æÜW„ÆNœdéΔsNk]Ó¥Ys8ÖÃû[QÄ(iR«ì­û³Ùô?ØÃþ ˆ÷_´gÅß|zñÏÄ_ÅðïþÿøG4‡þ ðm®£m¯Y[ø#Âþ7v:6º¾(²Óµ‰u7k5΋¦±¶QÇÛ¼ÜOÓÃÒÁPᜪ<7O ˜aóZ’†&¾.¾#„Œ©a¥R½W à G:´c…¥È¥õ¬dªTŸ·Œh”!^8º8Œehã°øZ¼-,$éºxg‡Ì)ÆŽ:8Šp¨½µlM%<;įe^ž£ÃÓšŠR#ð§ì™ñ>çÅ>Ô¾:þÔ~-øßàÿ†æ›âŸø_‡þð%ªx›AW‡uëš<÷—Þ=ŸMŒ%ÄFìÛH×ñ-䒶顟yñV]F¼NWÃ8l¯:Çáñ8jØØb+Ε:8êr§X< å¡„•hÉÒ¥(¹¬6u¨S‹öŠpå©€“ ²ÊXª´òUìT¨JN¦&¬0•èÕÂÑÄcœ•Jô-IÇF¥7|:•\.Yû&ƒð/ûÂü/ÿ OÚáwø·âŠ~Ýý‰äÂ1ÿ æg¡ý‡ìßÚòm}‡ìžæØyþfÏ.»ÏÍc±ß]Ëò ²ö_ØxG…çææö×ÌqxÿiËËgþõì¹yªÚs{Ü‘õpu~§ŸUÎù}§´«–Uöå·öv‚åö–wößTö—ökÙûNKO“š^iâ/ÙSÅé? õ„µÏ„¾|4Ð>^ø÷OðfâÝƾÐà¶òí|IðóÄ·RYËu£ÅÞŸrš‡›`uKØ÷\¬Êb÷çÅ4ëæÜAŠÆå4ñ¹Oãêf²ú•êFTqUeN¦IBTêÆ5#FµObý½q§ËM9_ÍÀ`aƒÉò¼®¤½½lšŽÒœ=²¥ D'Ošq©‡­0›ÃÊVŽ"qŸ57É'ì·ã=wàÿį|Gý ügñ#Ç_[EþÚñÞ»¢ÛØø[BƒÃº¥­Þ—gàŸ„š.±m¢øNÙì¬ãŽõ¬î„÷÷rIys3†ÚÞÖL7áÜvWÃô2Ücèãã‡U]l^&¤gF¥hb3*”yÒ•JRú­9S”0Tê:p…GÍ9èèשO2…|KŸ×rÜn[MBœiS£ f†u¥N–"¼e_žU*IJTéÂŒ%Jõ*OÛ<_ð³þ¯‰þ ÿnýƒþ%Çn?²?³>Õý¿ÿ ††ö}¿ûB쯲gíû5çþ¯¬¯˜ýF–}KØû_í¼ 0Wçåö<™†í-Ë/iªû.KÓ·´çæ|¼’+aý®çåú–? çµùþ«ƒÇá=—-×/?×½§?4¹}—/$¹ù¡ÉþÏß¼Eð2ÛÇ>¸ø—?¼ ¬øË^ñG€<3uá=;Cºøwgâ_k¾$ÖtW×í5‹¬ú–µæ}ªî+S[·•$Þ\}9¦o‡Ì°ìõC0ÊpX| |b¯9ýr† …ÁàÓø¨Pt)aÚ¼g9TU›jœ *Ó”ó|Ó2…W ¤¡^xi(ÉSÆ>gНNªQ—³®Ü#Œ•ti¥9Ô•jµ¾‡¯ Ô( € ( € ñ­/þNŽ_û Kÿ«¿sð›þEÙ·ý„RÿÓG›Žøéú?ÌúR¿Y8€ ( € ( € ( € ( € ( € ù¯Tÿ“£‹þÈêįɼYÿ‘vSÿa?ôÑ߀øêz/ÌöZü0ô‚€ ( € ( € ( € ( ñüœÿÁÿû ¿´þ¬/ÙZ½ªòOfŸö1Êÿõ83Ňø'ùÓ=æ¼S@ € ( € ( € ( € (Æ´¿ù:9ì/þ¬JýÏÂoùfßöKÿMn;ã§èÿ3éJýdà ( € ( € ( € ( € ( € (æ½SþNŽ/û Mÿ«¿&ñgþEÙOý„TÿÓG~ã©è¿3ÙkðÃÒ ( € ( € ( € Æ×§â]{Fðî›bú†¹ªXéHnb÷wóÅ…^NX`V´hWÄMSÃÑ©^£Ú4á)ËÿŠoðj;µ÷;sûQ~ÏÐÉ$6?<1âi¡vŠH< 5ßÄ)ã–6)$/­5itepѕ޾\™Ëm¾¼8k=¯•× žÎ¼V[£¾!ÓVìöÛº?xíJ.«]!?ý%2‹~Ô äÿn‡ñ“WEûÓÙüøÓkk´ÿª’ÞïXð-Œ:„2Åe²{”‚̢HÌ›®Í—ÇõJ]”±ø&üÓP¯7º©¨¾×³¶ñÂcÂĴºû ©yY¸$þW0.>;ü.ºñ.“ã þ|lèZˆ|5¤êGà¿ÅEk=ÅwþÕÍ—ÁõJ–é~ ?$”ëÁɾŠ<ÏËUqá1‘߉Š]}…V´îÔ­çbí¿íIû>»$z‡Å? øZGeD‹Ç{ðîV‘ŽÔˆEã»=!¼Ö%6¦77‰£ß„øk>§ðåu«¨ÿÐ:X•÷áÝM}•ŸgnyÞ“µXÊ“í8ÊúRG°h'ð׊¬†£áè~$ÓÈB·ú­a¬Y"­:âh°Ê 7 dW“[ˆÂÏÙâ(TÃÍ}š•9iýÙ$ôôiìÓ·cr±P@P@P@PiòtrÿÙ_ýX•ûŸ„ßò.Í¿ì"—þš<ÜwÇOÑþgÒ•úÉÀP@P@P@P@P@PÍz§ü_ö@›ÿV%~MâÏü‹²Ÿû©ÿ¦ŽüÇSÑ~g²×ᇤP@P@Pãoˆ~ øs§Á©øÓÄz~ƒäæÓL·¥¸Õu«åC'öw‡ô;§Ô|CªyAœYi¶·W˜FUI˜<3QÒÁaç^qW—*´iÇnj““P¥ éÏRQô¸-ÔRnRvŒRnMöI]·ä“ ñω²ß~3xûVŠC™tÜCðÃy,¦ðk'‹Ä-Àhï¼c¨ .?™ëQ£–á-õLª„eªbSÅÔùƵð×]ᆇà­îPá¬;}b­\C[¤ý”>JúùÕc4Ÿ‚_ô[ѪÚ|<ð­Æ¶¥Iñ³¥Aâ/9S¹|ïkâ÷T›kr<˶ÁäWT³ l¡ì¾³R–Ôá/gIzS§Ëò‰êÑË2ü=½–”e¤à¥?üIËñ=>8ã†8âŠ4Š(‘cŠ(ÕR8ãE ‘ÆŠDU¹wó;RI$•’Ù a@5Ñ$FŽEWÕ‘ÑÔ2:0*ÊÊÀ†R¤‚Á…¦Ú[a[§Nǘë>k—ŸÚwÿü$ºÒ–)â 7F´Ñ1¿ƒìú¯Ž|Wzúç‹uKù­huK… ¥i>~dGÒaÓôËrqme €£Ý•i{(áéÆ|,áB”U:QvµùV³´u*9Õ—Úœž§ÙàòÜ&6ÃÒ´Ú´ªKÞ©/Y=–—å,Ú(îk¸( € ( € ( #Ä¿¼=âkëMqÖÿBñn™ ƒHñ·…¯çðÿ‹´¨‹‰~˳bUït¦™QåÒu½Ón¶»³ž<¡Úå r¡8¾zÎXª”¤ö¿$¾¥¤jAƤw„âõ8q™vW¤œâ­‘÷jGÒK[uåw‹ëih¿¼MàNøÉ-–¥áÉ —Åý"ÄéÖVc!#O‰Þƒ|^b»KøOs¢»‰ä»·Ð"Gqáãx~•têäêJ¢»– ræŸöZŽÎ²íFkÛ¥e b“_˜døŒê'íð«þ^%iAÓØ­—÷ãîéï(]'ôÚ::+ÆÊÈÊ®Ž„220YYN AqŠù­¥¬×CÉ€ ( € ( €”¯ÖN € ( € ( € ( € ( € ( €>kÕ?äèâÿ²ßú±+òoä]”ÿØEOý4wà>:ž‹ó=–¿ =  € ( € (åëÏñ£RÔ´KI¤_ƒº-íæª˜\Æ>*ëšuÓÙêÚkÈ¿3|5Óo ¸²¸J~î ˜$ ¡Û2øíò¬¹e”ébëÅ<ʬc:QkýÒœ—4'm¾³4Ôá¿Õàã%ûù~ãè2\¡b­ŠÄÆøh¿ÝÁíVQvn_ôî-[—í´ïî+O´DH‘"‰8ãUHãEˆˆ¢"(UT0+µ¿¼ûT­¢Ñ-ô©””"äôQM¿E«Èhž=🈼ÿ öªý¯ÂBÓV¾þÖû¥o‹]âö×T—ìVq^~â}:ñvýŸsù9Œ:ºÓ `!Ï‹^Æ+G{©³×ÃÓÅÒ©hs?{R9>8órJ1šqYàêC9SÂ?k8bñ8¬álVWˆ¥y¨¯Ýâ¨U¥ÎŸ³Ÿ/<'*rŒÞήé^&ÐôohW_nÑuý.ÃYÒ/|‹›oµéº¬W¶7?g¼†)àó-¦‰ü¹¢ŽE݇E`@Û„Ä`1Xœ*Ÿ±Å`êÎXsF\•)IÂq惔%Ë$Õã)EÚéµ©Ž †Ì0˜lv§¶Ââ鯭)òÊК¼eË8Æqºé(¦º¤k×9ÔP@P@¾#ñáë~)ñ çö~ƒáÝ*ÿ[Öo¾Ïuuö=3L¶’òúçì¶0Mqqå[C#ùpE,·ŒÄT©Î­j)®j¸š´¨RÒæ«^¤hÒÝ”yªN1æ“Qï&¢›UJo– í);h´Šr{öI¿ËSRÞx®`†æßñG°¯‡>x( € ( € ñ­/þNŽ_û Kÿ«¿sð›þEÙ·ý„RÿÓG›Žøéú?ÌúR¿Y8€ ( € ( € ( € ( € ( € ù¯Tÿ“£‹þÈêįɼYÿ‘vSÿa?ôÑ߀øêz/ÌöZü0ô‚€ ( € (Â>?x—T°ðÞ…à_Üé~'ø«â(|aªXÊÐ_hZ°¾×|qâ;„!¬õ ?iÄV7@+TÔ4£ó½þÁÓÄãgˆ¯<6]Mâ' +Ƥԣ ä¶”eZpu#Ö”j-7:0˜w‹ÅPÂÅòûYZMhÔ"œ¦×Ÿ"j?ÞhÏÒt­7AÒôíG²·ÓtÆÓLÓ4ëHÖ+[ >ƶ³´·‰xŽmâŽ5QÐ ôóœêNU*IÊsnR“ÝÉ»¶ßvÏÒáR„)ÓŠ„)¥Åh£«$—D’²4*KŽö"³«*U#w(É%æÓHyüš /ØûQû\ööë¥xgã5¾¤òÏ Åa>›âOèEw.ý5´°Ê²‡aå˜Ø66šïâÈʦ’§ Iâ8{$T£Ë.jޝà#J0‹\Ò•IJ1„R攚ŠNNÇÅÃ0ÅÒiÆ¥>+âh¿Š*|O˜Ö§uºS¥RX_â§8N7Œ¢ß ðãÂz§Œ5¿ø'[ñ‡Ä_x{Eý‘>jŸðøKÇ>(ðLIâ›Ûßiƒ[žïš®Ÿ|—Ö¶–B.’Þç‹èn~Ãj-¾‰q1ÃÖñ B•¸ºø‹ãÏ |5Ô¼3ñ/áî‡ð§E‡À~ ¼Ñü?áÿ|?Ö>2é0ø‚Òõ¬]õ«Í{Â÷ú”ɬÊÖ1Ço¦›Ë‡Ãã³xŠ5jTÅSÅÔšÄRÃ×§„Ĭ£…ÿgÂýVt] eV²©UÖ\ñP©W0Ï0ŠõO/t°xáq£õySÀa±q•aSEãgˆÄ×úì£úÅ:Ø ´0µŠœ³iZ6©ñ“âÆx³â„¿á_Ëàï øcBðÄx0xnë\ð‹âÍSÄ—£Ã7ö¶ž.ÕdÖu© ·þÝ‹XÓ’8ÒËd÷nä‹£–å¸LnØâêbóÆ?X¯†§^ÃåØ˜QÃPX|]:”©*°æÄb¥íj,Ta*Ü´©Ò¡¬¡[ŠÃa3ÔÃÆ–M€ÄWÃañ5ðÜØ¬}ltqRx¬jX—?S†‡±Å%JT±iµV«œd]Sø™ñã™â/üFðý¿Â¨|3៷†ñ/à 9å¹M_ŒqO£ü7¿Ó4+9¥6úVŸ­j¾/ø{­­š[­.¯p±…I_AŽÈðøÜV7!ÀÑž_S ›a¥Rq’©‰Âe9ÎÛ✥+V’áߨf'Z´¦¡ FœššP——̪åñÂçXÜCÎ08li†­8Â<./ÃØ¬Dð5*8ž&ÃÕ(ÇØª5'—ÇØÇšJ„´m£ø…ªx§â€/¬?hßÿ¡Òü à øƒá¯Å xRk=bãáö¯êž5ñzxŸã†¯ ñvZ¬.šÐË¥És}¥ÝG<1]Åv¶­&;€ÀåÜUŽÉ¨Q¯JŽc`刢±†•Jµ\,~µM9{:„)âeNá:R¯‡• רå݇¡Å.Áf˜Š˜iUYßÖg G:ÿUÄäÔ0˜šóÁÔ|Ÿ¸ÄU¯:jûÔ¯8òµÅyÃ]wãWŒ<-ðã⦅àߎz— ê~Õu¸m¼M Ú|9oŒ“àéºw…d¸K ‹Zk©£ÛË{,óÜ_‹ßR¾,˱ôòÊøœrÈaUüô+ÔÆºÕpj¬s x¨`êJSúô©âaJ–&9à¥<,)Ò¥*jŸR®?O6ÅÐÁã£™ÒÆã>¥â0ðÂÐú–6¦u|;ÅÒ¥8¼5a1•ªÑ©]c%SJ¬ªÂœËt»ÿˆŸiŸ‰Z÷|m£øƒD½øÙáJ°ñޝ¦ø?Þð-î·á{/ ßøÛVÿ„s[›XÓlešîÿXÓ¯57Äb[;‹V´ÓþÇÅ€œ0ާG C³J™3:”cVu«cqô©Ò©8ʦ`_&”ps¥ûì,§]וlLjûq§,NiÄ*xš¸8åjxl+WNžrº8¿¯T…9ƈâjb'Œ’ÆsÇêU(áÜiF×èƒÿ -þÁ:wþ‘Ã^cÿ# wý„VÿÓ’2É?äK”ØÿLS5«Œõ :–›a¬i×ú>«go¨iz¥•Ö›©i÷q$ö—ÖÐIkygu€¬Öó[Ë$nŒev`ÕBr¥8Ô§' ÓjQ’ÑÆQwM>5tLáÂTç(I8Ê-]8µfšêšÑ¢Ïìÿâ-FãAñÃí~úçQñ 6§}3Ü_k~º±µ×<®^\HYï/ŸÃ…ž›{u#¸Ôô Rf $¾gˆ°tðøÊxªTðù?mEZ4ê©8b)Å+(ÅU‹œ"•£J¥8­Í1˜g‚Å×Âî¨ËÜo­9.h;õj-E¿æ‹=ò¾|æ ( € ( Òÿäèåÿ²¿ú±+÷? ¿ä]›ØE/ý4y¸ïŽŸ£üÏ¥+õ“€( € ( € ( € ( € ( € ( šõOù:8¿ì7þ¬Jü›ÅŸùe?öSÿMøާ¢üÏe¯ÃH( € ( €>Wø’æ÷ö‰øwk.LÁï‰Z¬Oþ¬ßëÞ0øi§›È“£\ÛØè÷0yœ´qêÒ"•[—öœ= £1šøªâð°o¯-:X™[ÒRšvêàž¼ªÞïE<Ƥ¿çÞvõu)«¯DšùùzÜ…ãz·À…zÖ¥ªj7ú¨`×u3¬ø‡ÃV~3ñÆ—àj’I ·wÞ&øm¥ø’ßž#¸½–^õµ-ëíÍkÏ<ó]ø\σ†jGýŽßV•J4kÔÂrIÔ§õJµ©Ô©„ö[¯‡ú´©}[þ±CÙ×ýáňÀa±5*Ô©uYÑ­[õ… p ¾²°õ),Mðôéá'íÕOiƒ§O>l58R¡EáOÁâ{¯ŧˆüG{áý?·:‚ÜÞ}J¿Ôµ=?O?hû$Bí_P“ÎŽ™¾Ñ±ädŽ5N'9Ë ‰Á9_ Œª«VƒÞucJTùþ5jR”m(»ó4åftªTÓÂrÁGê­N‚Šå(bÕŒcFÒúžɧȩÚªSRÂоxÃ'ÁGDоÄ~hš¿‡<ÿ=bçûF׳?µlÿÒõ ´<ÿì};÷×ßi•>Íû·O2Mý3ÇbªORuo»å‚祅qt!e£ìÜ#ïAFR·¿)]ÝJ9+8Ý,mlÇwþùˆúßµ­¿Ûúþ/÷µ÷aJ|œ÷ˆþ|-ñV¯©kÖ¨»ë—6Wž$ÑôÿøÓCð‡‹®ôó‚çÆžÐüEiáÏÎðÚÚ[Núæ•~×VÖvö·&kkx¢M0¹ž3N•*ƒ†s©AU£CðÕ'/hêae^Iaf«´ÂXwJTñmâé¸â[ªðÄ`pت•+UŒãVµáêÊ•jØyV£Μi×t*SöñTªJŠö¼ïØ5BþÆ1‚·â¿‚¿|e©¶±¬i:µ®£>“¨Ïáø×Àé®èVÍ1´Ñ|Omà¯éPx«I·7i ž±ô0Ç}uh±ÝL²E ~+ªÆ2…zuªªó¥‰£GFUÒQuU:Ô½¬ãB­E:ЧJ\áJšŠ¯—ákÆ„yg‡–Œ°ôjakVÁW£Bn2öT±J”+Ó§ ÅT¥TJ…G*”T*Nrqx—àoÂÿ]ZÝê~¸³’×@ƒÂrCáx«Á6:¯„íK}ž$Ó<­évž*ð½²Iq:F³õœ1_^E íÂMT³,mâ*{e^X¼D1u–&<\jb©¶ãŠ”1P­¬ëi×QUj(ÁTœ•:j*Yv“N•'ƒYm†ÂËR¦ ¦ ÜÃÑ«„ ”èBTã:T¡5NŒï:Q„å)=ýoá—€¼C?gÕ¼1¦Îÿ µk}sÀq³X[xkQ³Ó¦Òm$°³Óå‚o„Æ8­&Š[xÚy!-¬/RÇc(â±8èb'õÌe V½i¿iR­c‹ÅFr©ÌÛ¬á:ŸÄzÚkšWu2Ü\-–”p øUá›ýÝ5jjѼ,m‘ãƒ?¼u©M¬kº~»iªÝéØšž¡á?xëÀzS—âY¼âM¼M§Ûý¢ì[Ûê¦ò;ax-Ö1y8”ÂãkàáR5J®­EVt18z¼3¨¢©º ЧZ‡<é¨Ò­/gzô©Ò¥YÎ*q޵ðÔ±0õçÏ F2…*ÔjÕÃׄ'8ÔtÕj§UÓU"ªB››…:Žu)Æ3©RRètO‡þ ðΫ³áïXh—¶þÒ<jšX–ÇN³ð¦y¨_èú-–o*éöVÖ·Z¥ó#Ak˜˜#;GjŠ®7Yb•lDë}wUyT|󫈅7F5%9^wTÛ*’‹ÝÅ´˜¨á0Øzx:ThÆ•<¾Št#¥N8©açˆëïʬð´%)ÔæŸ4”“©QϾ®»»ÿíñ6Úùñ]¿‡ž3‡Öþ&/%Áñ¿Â÷ñ ð|ÈÔ&—Q‰¡¬ÃQ‘µ âýÁÚŽkŽÃÑ¥F•X¯aIУVThÏBœ,>.tåŠÃÓK Ñ­ $§ƒ‚ŽR¢ò¯–àñ515*Òoë“LE8Ô« Š‘tß># Æ…yJT©Ô«*´æëUŠ«Wž¥äáñwìõðÇWzí׉¼1yyŠc âÏÅž3Ñ}BÓtç†å$ÓmØÁæ˜ìhG YGê•]l<§J•Yáj:ЬÞu©ÎxUR¢”ꄩ¬ªâHËëý¦µ°˜zõ利íjR…®38×¥K™S§‰…9F¨Â2tⱫjJ¿…B>ÇoV°Ckì‚Þ(à…73lŠ$Xã]ÎK6@ËN9$×J“«R¥Zš¥IJrvJò“m»$’»{$’è(Q¥†£G F<”hBéÆíòÂQм›“´RWm·Õ¶MPjÆ|=seûGxÆÞ¬^ ø/àËËÔN#7^ñ·Œílî%^Ÿh{oÏa-X•‚0œA,›7½ exǽªÑ£&½¤º7u»¿Äq$Tqôd´ç “ÿ·*NÏÿ&·ËÉUWÅP@P@xÖ—ÿ'G/ý%ÿÕ‰_¹øMÿ"ìÛþÂ)é£ÍÇ|týæ})_¬œ@P@P@P@P@P@|תÉÑÅÿd ¿õbWäÞ,ÿÈ»)ÿ°ŠŸúhïÀ|u=æ{-~zA@P@óÆ«fо)|ñÓºuü^7øG«KŒCmqãH4øföåÇúµþØørúD%¾V¸ñ\1ýùP®ášªx\×öíCÕûR•H¥ÕòbUG×–‹{&zùeC3¥Í¢¯ Ñ¿Dß,ã÷º|«ÎGO^±÷á@PY–5gbK3€ª£$“Ø3Q9Æ”'Ro–âå'®‘Š»vWz%Ñ\q‹“QŠ»“I%½Þ‰#æM3ö„Õ¯tï xþïÀÖÝM§ •añ?êå¯:xÎ$…” èÞ…U¥Š¿Ök*¾Ò2†' È£GYK Qby£V?T{â1sÃWÏ#õw,'á*bkÕæJ­YSÉég–…œgûºÔèsÕ­G÷œíEÆ>÷c{ñ;â:k:7€ôŸ‡ž Õ>&É Üx·Åš[|QÕ,¼ á/ ¾§y¤ès7Œà u[WÕ®­eöqxFS쑚ò5¶¶mGž8LÖ?K^Ynaé:²ÂÂ5ëc+ÁÔú­ *6§NZ“­WI*Wn xgK:˜¬e€£<5ŽÌ%ˆ:QÄ7J–  µzõÊ2uñ4(R¥Fi'V|ñ…7ÌÛþÑLjçø{£øáÜz‡‰ülßtýKIñw‹‡…¬|℺Ƒ¢ø¯K×5mÃ^$k»Su}z–·º}ÒÎñX~é!¿’}?²–O†uqS«˜rå”0Y~eOJ‡´©ˆÁf(:xyÕ¢£Š£7ÖÃÕ¯FqÄÇë¡OÛ̱õ©á䞬ʖjòz¸wRÔaˆ†Œ•u‰äæž®«áj¬?µ­G†u(aêJ­*[šÆx»_דÂ_4oÂñýßÃï܉VÖtËÝ*ö7WÖ_À7žM2"e:„ÞxºËP¼ÒwÖö-=Õ½Œüôòü4p¹~#Œžf˜z¸šXwWÅWötëÖ…U8וJQ¡^ 8•…¯US«/Ý×tê¾/N¶+ ‡ÂÓÄârå…úÍ/¬*u±¡YýMJ—%jP¡]ºu±3À½\>"?r4kVú¼“Ò ( € å¾ Û6»ñoãPgLÐôï|%Ó%÷sê~Msƾ+¹†CþµoèZkìÊÇqáû¨‹D‹ÊâZª–+Á}¹:ø¹®ÑªáFŠk£µ “WÕÆ¤]¬ÓŸVU³*Š:¬58Rÿ·½ê’û¹Ô_g}A_ xá@P@ãZ_ü¿ö@—ÿV%~çá7ü‹³oû¥ÿ¦7ñÓô™ô¥~²pP@P@P@P@P@ó^©ÿ'Gý&ÿÕ‰_“x³ÿ"ì§þÂ*飿ñÔô_™ìµøaéP@PñÁ:_Ä?ë~Õ¥¹´·Õ …­µ+‰¨èšÆwoªh!ÒÞTt‹VÒuË-?RµwGU¸°„²²‚§¯Œ«—âèbè¤çB_ ¯Ë84áRœígÉRœ¥Ni4ùdìÓÔi¸´âÜe¥·Œ¢ï»8´šóGø3^ÕocÔ<7âë{}7â„e‡Nñnn¯¥ÓIç.—âÍ %fi¼)¯Û[I{c yL$]é×5 *ú>òNHSÄádå„Ä.jmüPjÜôj[j´[åš²ºå©éÔ„Ÿèy^a ~3Ò5éÚ5`¾Ì¿™-ù'nh½zÆüÑ•»jƒÒ ( åŠ9â– T4SFñH‡£G"”u>ÅIjQ­J­ÝB¬% [{J..×M^ÏK§èU:“£RZo–t¥E­Ô¢Ó‹ù4™ð÷ÿeÇð,¾ðÝ—ÁßÙoTÒ|+­ZKÅíwÂQß|K¼ðþp÷Ö?hðm§ì OFÖÃþøN]<Ës¬‘ÿ²Ç×TÏÞ*QÅ×Ì3&%QŠ©…ÂO“W ~ËÚÒ®ëÅàéÕšŽ2t– ìß> qœq´¾n¦KKG—eÕðøŒEZ˜z˜šW–Ž"·¶–¦R’ÅC ÕÂáÚÅa½¥açQAÆ¥9ú5çÁO\|0ñ·‚£¿ðúêž$øáwñ.ÆvºÔFŸ…?Æm3â"Z]ʺQš=Xh–RÀbŽ aûS" Ì$ξ^GŠàúÓŒÜ8zx…ÎTþ·Ìè§$¤Ÿ·…¹Ý7¤®••ý|U Ö\R Ô¶ðupô/uÉ:œ=…ÊbêÙ>X¬M M¸{Gìd¢ê7Mu¾-ðgŽ´Ï‰üRøkeàýsSÔü#oàoøoƾ ×<'is¦iZž¡­ø{XѼG¢xcÄg}g{ªj°\XÍ¢Éä:ŒR »W° {̓¯Jž1Ëñ2<>2¥]*”á’£‹¡NXwÏJS£í¨ÖÃÍ)%^”©T¡MÇU¨¢±ÔkÔ­–b𼎾_] Sªå u°ØÏ«Õ|µ!Ê•jŒ%7éUZUëF^ÎTéIò^øâ?ø£álj5 {HÖ.´oø^:ߎ.bŽúÃí~)øÅâ/xÅá½>D¹Û¡XM§^Úyz“˜¡µ‰$šU‡ºy†4ñØL5*ÁÇ+ËrÌ7+ªÖíêWÄÙ¨Æx™J¥g ^Ò4§SØÅ¸AT–+ ‰¨½¾&pxÌFuý©ZmÑ£B9f?-ÃàèMÆ3«õJ°XuZtèýaP­‰tðî¤0±Éñ×ÁoøïÇ:^µ{áƒZUþãkÚ_Ç?]ëzGÅû ø{VƒT_ øBçí2]éK{áË©¤ñȱšßRžüéjÒ©åü.\©V•l\gb^'MS–^®¾ ¯'V›…Nt*Nœ°ØªÑú¼hÒÄF~ˇË7ÀÕÇÃB0Óö´èÓÃbê¹Ã—(W¥]΃…9º•hÕjÔ'N¶u”jÒpo¬}k^ë…P@_Œ¼C©ipXè~´ƒVñ—Lðn‹9[=âˆÅæ½­4?=§…4KyÒÿRºGkoæ_ßÙ[Ý\=8ÔÄb¦éa0뚬•¯×–4ôujµÉN=ï)Zœ'(ùÙ–>~ÔÒU¥xÒ‡óO»KìF÷›ÒËEïJ)û·Ã¯éÿ<£xCN¹¸¿lwWޝx±­þ¿¯ê×·:¿ˆüG©€Oí[^¾Ôu Ä`"ËzëTUQð™†6¦aŒ­‹ª”V¹a†8EB(ß^ZtãFúÚ*úÜüí¹7)JNS“r”žîMÞMù¶Ûgk\b ( € ( Òÿäèåÿ²¿ú±+÷? ¿ä]›ØE/ý4y¸ïŽŸ£üÏ¥+õ“€( € ( € ( € ( € ( € ( šõ^?j8;nø&ÜñŸ~=vïLã¦õÏQ_“x²¿á;)ì±5?ôÑÝ€Òsé¢üÏe¯ÃL( € ( € òÿˆ¿ “ÆÃ]ÐõáŸøz ˜¼=âU¶û]´–·/×~ñ.š²Åý¹áKémà3Úy°Ï ‘%ÕÅ¥ä1ξ¶WšÔË¥*r‡·ÁÖkÚÑnÚ«¥Rœ¬ýX&ùeg¯Æpn&ølMlh×ÃË–qѧ¬e°šëo&œZ’Lò Æ/.°Þñ~•'ƒ<oo-Ëønúé.mu«b©>»à­icŠxx3ÆZh#†îÏíGªYi÷,ìb©V¢±X:«…m'4­*r{S¯NíÒ©£²mÂvn”êEsw—æ¸|tybýŽ"*ò¥&¹¼Üœñ]ÒºÓš1m#¸¨=@ € ( € ( € (ˆ×|bm5h¼!á]*oøúîÞ;«o i×1ÛǦXÌïZ÷Œ5wI 𗆄‰'úeÊI=É‚htËMBí³[:4^+Uap‘m{I+¹ÉkìèÃGV¦ÞìZŒn¥Vtáï/30Í0ù|m'í+µxÒ‹\ÞNOìBÿiïgʤÕ\øsðßþ¼ñˆ5üIãývÞ5¿‹o²ÙXØÄæx<1á[yGðµ¬îî‘<³\ÝJMÕô÷•1|višÏ(Ò§a‚ Û¥J÷wÙÕ«-9êÉhÝ”b½ÚqŒo„Åb«ã+:ÕåÍ7¢KHÂ=#Ñ/›oY6ÏR¯$ç ( € ( €”¯ÖN € ( € ( € ( € ( € ( €>oø„‡AøÿðgijþïLñWƒþ(ü*iGñMÜžøáx$'hþ!c|ÀÛþ_Îò¦¹«Ðótþ±ô:qÛè0|C‰ÃÚž*Z§9ãhÖKÎö…N‹^GÕÊLÌÑ~+ø+UÕ¢ðÍæ¡qá?IÂøÇ67>ñtŒ¬#‘´í]ŽÝõû5‘•EþŽÚ”›ãhndIQŸÖxZ¾Ëëyq8eÿ/¨IU¤º¥)Á¿g+}Šœ“ViÅ4Òúl.iÅÚ4kÅTòî~åKöP•œ­ÞÑó=¹Ï@( € ( € óoâ·‚´]ZO A©Mâo ð?‚lnü_ãXíï4 +™ôk6pA¿Õ”A]湊8ÝÓ¢8Z¾ËëypØeÿ/«Ê4iiÒ3¨â§.ЧÍ7¢Œ[i~+3À஫b#í#ÿ.áïÔò÷#wYrÇ»FŽà¿Œ_v¾µ(ø%á9~þe>â‹:Œ9ŠçR¯ü/àRË•adÞ+¸d}ÐÝéó eòq9Þ[‚¼0þÔÄGj“S¥„‹ï>JõíÓŸêñOxT‰óXÎ!ÄÖ¼0ú¥?ç•¥U¯%¬!ÙÿõR‹=÷Á^ð—ÃÍ)ôohÐi6³Ü5ö¡pe¹¾Õµ­JDHæÕüC®ê3O¨ø‡Z™#eÔ5+««™hR@ùLf;«í±u¥ZirÅ;(B+U tâ”)Á6í qŒUÝ–§Ï¶ÛrmÊRwr“nMõr“»m÷m³¯®AP@P@x÷Pë¿´GÅ}z¿NðW€>ü7iºù~*¿¼ñGÄ/X p†/ ø‡áÅÉÉ%¿µ… ¿Ð^á'‡áúؙǕcqU'M÷§J0¥•HU_/»ÊÆÊõT–*þ»þV>¯ÒŽ0 € ( € ( € ( € ( € ( €<ëâ§âƒ/ô++ôÑ|Eiqcâx‰ kƒá¿x~ê=SÃZËC¤—Qê6ñC{h’EöÝ>êúÆFòo$—ƒ¡ŽÂb0X˜)ÐÄÓ•9Çû²VÑôkxµªi5ª*2p’”tqw_#ð/ÅÖßX¶âïÝƾžužïÃzôq$¯ Ì>ߣ^@ñÞ麚Gwö7V÷(±³¼Pÿ+çÙ/‡ó ¸T[QmѪ“P­JþìãÙÛIÆï’WWjÒ~Ý*±«(éÝv}¿Èî+Å4 ( € ( € (Ÿñ7„¼+ãM*m Æ>Ðø“gâ-?GÓûm 4p2ÍG#>õ(Ç+,f ˜%öªRöU}}¶МåýꮯұÙCŽÂÙPÅÔŒc´dý¤]j)¨¯ðòýæÿh­?Ù¾+øGñæ]ÃÞ+øa©ºùg{¯èº§Œ¬æ”œþþßÃ¶Š öv*ZOBŸdõ‚ÅàßWJ­,L}cN¤0ÒKÉÖ“þ÷EêRâ'§ÿ/p5#ÿ^ç Ÿw?²ý ñ ÅvŸ&§ð㆙/+å&…àï|éÄÉöøçW¶[a›Ë“v`yUX®Ñž]/áç8)%Õε?M+P§/•®¾ÒZâ\ZXˆ[£§ÿ¤T’Óþã?áeëôEþ9ÿá?ùmUþÅÿC|þü_ë&]Ú·þ æ=>!xªëäÓ>|pÔf_%ôè;ñ }§ÅÞ8Ò-¾v|Ï?Ë‹§x†2ç—CãÎpP]ÔëTÛ}(Щ-;Zïh¦ô&\K€ÃK?%N+ÿKœWãëbÜZ—ÇMLãIø{¢á[â/ÄÏèq©<1ø{{ã¶EX“Jv´dÌé3Çdt¾,ÛÛÛ¦ ˆ—Ýõ˜á?k~–ož|OMRVÿŸ“§OÿHuSN~Ñšßü„Ì7î‹–¦“QþŒkgV¥$}\![kûª¬_÷´×Нc¥ü*4h/>z²^Žô—ÍÅú–¿³f‰¨bOˆÞ?ø—ñ(¶M/Qñ"ø7‡ûÖÒx_á­§‡­u}7¯ú.¼úÐ#cÈTçÕâŒnØ,6/KE*t½­__k‰u¥ zŠ¥ä‘åWÌ1ø+bêJ?ËìánÎ4Ô—ø¹mð¿ƒü'à}*- Ážðÿ„´Xè´Ÿ èú~‰§FÄζZm¼1y‡¾ÍÇ©$׈Åbq•lV"¦&«Þug*’ÿÀ¤Û·‘Æ¢¢­¢—E¡ÑV ( € ( € (ŠñÏŒáðn™lmì%×|M®ÞÇ¢x7Âvs$‡‰üCpŽööHêâÏO‚(å½Ô5¡Ó´û;ËëÜÚ¶}Œ%ÆgÙ…-9;Ô©fáF’øªOm–‘W\Òj)¦îgV¤hÁÊZ[eÝôFç¯KðÿÂ0išô:ÇŠµkëïøëÄ0ÂöñøƒÆšì‹u®j6ðJÌöÚ\r¬tëGwû›¦éöjÅ-¿ªp>[ƒÃ`p°öt0”ãN ­¢­y5kÊNò”·”›oVx’“”œžíßúô="ºÉ ( € ( € ( € ( € ( € ( 0ñßÃ/]Ùø‹GÖuxûI¶k='Æú ß8ÊÓ¿‡üC§j6óYø£Â²Ü3HúmìdÃ#µÎŸ=…ðŽî//6ɲìï ð™ŽW§¼^±9t9ÆÒŒ—“³WŒ“‹iÝ:“¥.h>V¾ïš<ÖO|oðû/‹¾ˆÐþê?|ñ‚Æø/Ëö©à/ˆºÞ…{á£3ü¦ËMÖü^!.Œ×›%¿äy—…ÈTrÊsU©6í J•9Â7Ñ{Jq©-ß³¤·Ók÷Ã{ðqkùvû­÷²ø]—CþhŸÇÐGoøWjquÖH?PH¯þ!Ÿ/ùu†Óþ¢#þF¿\ º½<ƒþeÏý?¿ønÇÿ.(ÿˆiÅóëÿ…ÿ úåïîø]—?ôDþ>ÿá»ü¸£þ!§Ϭ?þGüƒë”;¿¸?áv\ÿÑøûÿ†ìòâø†œQÿ>°ÿøQò®Pîþàÿ…ÙsÿDOãïþ±ÿËŠ?âqGüúÃÿáDÈ>¹C»ûƒþeÏý?¿ønÇÿ.(ÿˆiÅóëÿ…ÿ úåïîø]—?ôDþ>ÿá»ü¸£þ!§Ϭ?þGüƒë”;¿¸?áv\ÿÑøûÿ†ìòâø†œQÿ>°ÿøQò®Pîþàÿ…ÙsÿDOãïþ±ÿËŠ?âqGüúÃÿáDÈ>¹C»ûƒþeÏý?¿ønÇÿ.(ÿˆiÅóëÿ…ÿ úåïîø]—?ôDþ>ÿá»ü¸£þ!§Ϭ?þGüƒë”;¿¸?áv\ÿÑøûÿ†ìòâø†œQÿ>°ÿøQò®Pîþàÿ…ÙsÿDOãïþ±ÿËŠ?âqGüúÃÿáDÈ>¹C»ûƒþeÏý?¿ønÇÿ.(ÿˆiÅóëÿ…ÿ úåïîø]—?ôDþ>ÿá»ü¸£þ!§Ϭ?þGüƒë”;¿¸?áv\ÿÑøûÿ†ìòâø†œQÿ>°ÿøQò®Pîþàÿ…ÙsÿDOãïþ±ÿËŠ?âqGüúÃÿáDÈ>¹C»ûƒþeÏý?¿ønÇÿ.(ÿˆiÅóëÿ…ÿ úåïîø]—?ôDþ>ÿá»ü¸£þ!§Ϭ?þGüƒë”;¿¸?áv\ÿÑøûÿ†ìòâø†œQÿ>°ÿøQò®Pîþàÿ…ÙsÿDOãïþ±ÿËŠ?âqGüúÃÿáDÈ>¹C»ûƒþeÏý?¿ønÇÿ.(ÿˆiÅóëÿ…ÿ úåïîø]—?ôDþ>ÿá»ü¸£þ!§Ϭ?þGüƒë”;¿¸?áv\ÿÑøûÿ†ìòâø†œQÿ>°ÿøQò®Pîþàÿ…ÙsÿDOãïþ±ÿËŠ?âqGüúÃÿáDÈ>¹C»ûƒþeÏý?¿ønÇÿ.(ÿˆiÅóëÿ…ÿ úåïîø]—?ôDþ>ÿá»ü¸£þ!§Ϭ?þGüƒë”;¿¸?áv\ÿÑøûÿ†ìòâø†œQÿ>°ÿøQò®Pîþàÿ…ÙsÿDOãïþ±ÿËŠ?âqGüúÃÿáDÈ>¹C»ûƒþeÏý?¿ønÇÿ.(ÿˆiÅóëÿ…ÿ úåïîø]—?ôDþ>ÿá»ü¸£þ!§Ϭ?þGüƒë”;¿¸ž?|lñaû/ƒþ Màh_÷RøŸã?ˆ¼?i Žx{Í7ÁõŸj$0ÿÏ•þ§áA;+½Ž2³?·—xQŽ•Dó\Æ 1jðÃ)Uœ£}RHÓ7mŸ%UµãºYO¿wßž‹îW¿àz?>ÚxNúçÄúîµ㯈:•§ØukvÖVÓÚé,w áï é%§„ü..b†O°Úšéí­çÕ/5¸ê¿[ÉòL·"Ã,.[‡T!£œ·©RKíT›ÖO²øb½Ø¨Å$¸jTGy»ÛeÑz.‡©W¬fP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ÿÙuima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.overview/000077500000000000000000000000001160020716200306665ustar00rootroot00000000000000uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.overview/wrapAAE.png000066400000000000000000000754751160020716200326760ustar00rootroot00000000000000‰PNG  IHDRL‹ºZtIME×ñ ™ pHYsttk$³ÖzÜIDATxÚì}Lg~ÇgÁ¯—äLÕ!§s²ÔIŒÏ¸†ɸ(Én—åÜÆlã‹MÓÆP£%f%\Çù£€N-¶â;pTáQ-ãÔ $'‡%§d×UXŠŽÈá,V¡ˆO‰Áqϯìö7óìÎÎì ìÎîÎÌ.ß,<û<Ï<ϳ/3ßç÷Ìïù=ÇéHšÖD@Ê‘²@ä¤,9) D@Ê‘²@ä¤,9) D@Ê‘²@ä¤,9)Ë¢¸Ôrçæ7ï¤-Zº|é¢`Õœ½ùßn GƒÁãYü£{–¦ký¶Aúv”èÝÅ‚¾ÛØ;ááÕâNŒ½}@êaˆÃV;žÙÛ7Ý\ºÇíN[²t‘ì^ã¾sóölúb¿ö i‹—,NÃ= @‚‰Ãt%¯’éié‹-Jç“Øé‹–H­»´EK/2¸±‰€ÄŸéÊ´ô4²Ìö9e“œÒùRo"_šWªÃfIEvÀ|˜·KÕZ€©@nn®Ê{ rè¹ÁÁA­{Œ«s8ŸÊ ¢3äÓoáʳ‚efŽ2”•UΉYCf¿©Å«çðxs,‡ÍÂIÆ]Ý‚LUSŽ`KFÒ2A½g€¤"PçÑr»¥¥É«¤@Žj{ùQg¤e³šZDãÀy–ì®WLì…qó6 gq)ëˆ?7Ôl"€®ÉÈÈHÁõ®KC—³ÚèO1f[¸Ãg‘•á³,Û6û³1cå峻Ȧ ç-I@hP³E8ž kªªªTù&AYœ#¤=v³!À#Gú¾ŒµMšÊÏ„úÎãg2™´U;Æ[e•‡è…+‚€ þ–z'e,9çÙÜ%ÛÈ1³)p‘ñ¦IRzŽ2|–Á2NT–Û«!ê“I@J‘¨ƒ ql’Qꂎ9Êg –™ï z‹)(=òÊA"1 ¨Ù"D]“*K¼žø>Oa9Ay¥èÏ(8ó¸7ÎQFžå:Q$:WÊ­yW]ò×ë;ޤ þ¨/rœ cj´îEt„\QbrPVÎ7Å(:úÏU†gÜïQÉU·ð/X¶$]\ÞæmÜ[™Ø•ð•‡yWó•ú»¼‰2Ô2ž˜•TÎ}…mw=mäjkk÷.:OXÕ ýÃ{›œÙ¶`ß~òÀOÔ|ÌŒéJt ?Û¶ô®°Kø6qÙ³Gá!Uûdds‹ÌÛd?Nÿ` @Fþ/ªª Bx] Ï¡ªRÀd%¦7Ç[в² âêù't –Ô°Šþˆ¾hŠér{+`sáå ¬ÅåÖ“®À†\Ÿ±û{ˆ0w àŽP5Ë2#îÏüg© ¦K„"@œ9l>”=Îßxý½é¾¹Å9"%ЬŒµ(ƒ×8yÀ/Bè©7a"ܳÁ’ÑO>0pbµÃko±#Œ”81j ¿ü‹-«DX*X£ e‘ïÄ D€¤Ço`IbM’%Ê,'ƒK¹øïB ,r£Òxëׯ7€ä'///οCU€ã ê 7¼xyR^™ .¼½f ÌaJ4ÏéÊ"7*÷844tùòå˜?@ 1+W®Œ½,!HJ¦§§¢ã8}hÝ; äsˆáÂMz AØGoÂúЙÒÓEnD¼G3XB %.£Kéè衃ììì;v°Ä’’¶}{nnnCCCQQSJMM ›n¬««kf‰$xf³™¥8–ØÕÕuäÈ–ØÔÔD ±ÓÅÇ0¥¥¥¬?$¥â´•Úqq@<à5ÉddÇA{ÅHrå¶X˜%¼Ê•—uîb#¬ ¯vx¶œ-·sÕ™£Jˆš}‘w…_j ì,æFý%)%r$H$?R•jkk#Ý¢J!µ`‰V«•I0Š‹‹;;;Yb^^©cÒÅÙ¹œÜ¸Þ¿?•ä壿W®\ è %’Œ$’2Ç—±X,ìXì¶x@°wÄÉ…“~(l yQ8©Û¤‘Ô.ë6½qö9PºX?Ð>Râfï¦ÔB¤ün£7G˜|ôª‡'9›e>i”»}ŒÌNX fzÓ3ž]”ÅÏ$Ê„«™_jUî_Qç,é¢ì,ôˆÞEŽédff2Q!ÊÊʘüPâ©S§X¢¨RTŒn÷,‘©+)ÖIö'¨‚´¡àÖ_ýõàÄ€c„ä3Ø,#Y ãÒ+IN’@ñóaôôôÐGW__Ï”LCRw:¦E“¨Iu˶3¾åËòµË^Áb™ÕGµYü¦-ÕÜáò,ÙÐ:BÊæÙ¯Z“¥Ú˳Š8_ùp5 ËÌVï3ø—SK{¤ì,æGýY(Å®$ãctt´¿¿_ªRsƒ,‘nè¢-%U/0/ì¡hÞÑgN#ö1ŠÊÇ>[Øq…·y8E‚@_}#ÅÅÅŸá:Qttu·Ž´‡dŽ')ÀÊ•+õ£‘£ÈÙl6*ºzén+šP$#ƒR¤FP6hGX‡¢ï‚¾…ÎÎΔٱSS”‹³éÃhN r©A’Š\§+IºzzzHÏèŽ9<<ÌwïÞMöYww·ôrn¨@Àl•sÿ ºÉ^¼xqãÆ‹%¾¶€…ƒúKâiÉ‘nuttЭnŽ¢€±‡jpHvè;¥‘ÊùóçÉækmme_.™€F£ßlB!Úî I=„%—ÄÅ’#³‡Sפ‰Uäè–·L€Ž›››é&Hƒý‚‚ ö6›­­­lô½{÷ŠK,@Ü!‘ ù~úé§gΜ a0Gâ¹sUî?D.^ÌÌÌ …ˆ!ðØc-]º4Ñ­ÇEäÔŸ~W8]IWmíííýýý‡ƒùïU¨Öu 9 v»]\kÁ ¶;©Æ—s;¤aG¾}Ï=9éé²ÜÙÙk}}_,_îž#÷øñ_kýžÀ<а`llì³Ï>»4<@Âö•‹÷¿[q÷’\ãòàÂ翺vãÖ,¬_ó`Îú «³7äçççää¬X±Bë÷¡= -9º©Ñ(~ûöí¿)SSSf³™y’yµK4îèø|rrtåJËâŲ{Ù÷ß÷þô§7®]»/\îÖ­yjê,¹Èéîî¶ÿæÌ''繓ý“%&ãLv&—»ŠËŽÌ‹|p‚ÿ7z9½oâîA×õ÷Üý×›ŸÚú|Iaaaì}‹‹%ǼÕ\H…ÈÑ‹éÌh`h Dæ)"³ÄN¸%$rï½7¼zµùƒ^s»oŸ¸~ý säJÁ Dn^z{{ß=ùÚkZ»¤øgW-9\æãP­ë;Îþ%×qqÅȤ»¨¨è¥ª óNqm)î]ÙÑÑA¦[ii)DÌ‹Ñh”N\777:tˆ ;úýÀK%ZØÈ7Ü:¹»îZI–Ÿ< }tôWsä~óÍo¶oÏ×úºµ®¯Íºo¶4æØ/¹ŒÅ3ê•ñ>®â ú73u•ë|×Vnw/Ψ~ã—$xZ¿oõˆ(@sWWW]]]ggg}}½ÖÉ Þ©S§ÎŸ?Ÿ¤[uHÞÛ}῜{õ{ç«3¥E —¨¶È.$µÜõ_|ýÞ¿¿ºùñǺ»»5y×7Ôl1"‘£Qäðð0l8 úñ΋), ˜²}±?Åøä“ODykû‡ÿ#{K5rWq]å~©»pá‚Êï]_»Ðmˆ®.Ì/¸CC9²êHùjjj°ÚdnªªªÔÜǿ־1òÙ»ç^½ª¦¶À¤npâêÞ~ñ™ç+_Þ³Wµ¦Õÿ1‡µä¦§§7mÚ$u  ^Ðà‰¬º'Ÿ|²¨¨[îÍ ,¹ÔàòåË[ž*¼ÿòÚ+µT8’ºžÝßÿ±ÿ­²¿ß:33£uwEX‘++++..Æ($ºq“299 L°èííý»Ÿ?þVÑØ§ud—/[Ì5ZØõèçÏÿü‰‰‰ Z ¹›JB -rv»ŒJ1ê?*`µZ›››µî… –””tttˆ;CI!KWÜA$)cccõo¼|Þv¥àϵîJ(¬n¿_6YùÒs*¬ôЋÈY,­|oÀ‚¥¦¦¦½½=//íÆ¾p m#…#»÷Þ{Ífscc£ô ‘w„É)‡íåNÿãç<;Æû¸ãÖ?”•{UÙ¹GßáÿZÖñÁ'ÏŽr¦5aK:ŽÇS3ÌYÿâV{kKâŒ9• |&G"·aí{Ovv6éÝèÕýÑ%pðàÁM›6=ðÀ§OŸÞ¸q#õaxx¸©©©¶¶–¤.¡3uÌ\£¶&''¨E*œ“:2¸É¶‹©¢‰“ÛWJ¨íµg½µÑ×Ñ[ëoYz¬2ãþ÷ÒÅʾ½Qar·_ˆ0zxHQ%J!cîí¦#z ÐX0*Ç(í½+éŠÒÉ”ŒŠŠ užEutt¶™Íæo¿ý– ”ëׯ“I­«ðü‰ ;jˆš»rå kT4õTXB@oÙ dÀIO¥NYì^àò?xîÂe†­±ILo­õXB?±Hèîî.þ™B3Î)¨š%Ÿ3es:úˆ;ñz='cn“qöÃ?Œ¤ðÔÔTQQý„èò‰¤¼ö"g±X°Ð't¯?pà@Ü­:Š’éFvÛ‘#GvïÞM&TCC]ª½/ºæ©Q²Þh|<+«Â‡Ãá‰ÔPZZJ•( ôÖæÛ¸† §_\%&­zñtçî˜5v{NS. D¸ \0g?âÿn£;ñ}ܶuüñu—Õäfþð»¡/")IzA¿Þ;wÒåC]¡z[„% i á![ÆŒñŠ6GƒP›ÍF&Èèè(»ûúúðx)ZèommUdïNœ|ë·ç5‰Â1 wuv^Øõ ??}èeûÉ ijm¯?—EÞ0äí¸cVV”r·ŸúÒí.±Éãë1·çéò« W쩉õØžN6™Ù¹Ö–/Õ”cÖ·¹Àf9ÍǬÛOr/ž¾L† Ç—÷Ú‡Û¬Hmá|µ#ˆæpÃïL*g˗蜼f9cãß(¹…ªŸå¼ë®šþ~É ]Þ¼›3„û÷ß ¿êùØØï£>+;»¡¡~tÎÌÌ„T;õw!9ÕªÙ<ÑRUUã"ÒHºö.^¼800P__¯óU¡UZ÷B†ÉdŠYÞ&\¬Uâ­=sߌÖòs™o‰Bcn8̤lÕÏ™9ÇØ×!ª0?÷ĪÈj ¢÷„Í!6ÁfR¶½!j–!xmx–-Žþ3ùŽ;ó%ÿÿ‰;å–gø¿jºŸPÏoܼ¥øt2†S;], ) Kepp0ªmûûûm6е—Dû#êÍ’SÕq`â>ppk_“HɃ˜¹c¼˜ ik¾¬UƵaê𗙯¶ ÖyöŸî-oûmoma¡¼f9K—.}ð'625­1ç]÷ŒlU€)‡÷=¡ÎçC¬ˆïÆÈ÷ÈÃqˆ³™+@‚G—j{{;©Ýµk×Ö­[§f<ˆHVHäJJJvîÜI#Äy ³ÇoN§“®·d ª’ú„—¥øŸ¥¬6~>•sXW8kFÒGyXȱåq¤g†BäêåL…ÑU¨ ¹‡³sâX¡¨v---===›6m"‘£‹—.ÆDûNNW¶¶¶&´=â]ï¿ÿ~eeåÜ%Ùã·5kÖü?{çÝD•ïñ›]”¢ké.»ÝÔµ˜.(éR”¾â!lW›ˆ ‰¨4¯ôáy%Û<þîB㦶õ=mÑÕ¶6»|´â¦¯ÕwrdMQ!ÅIðÕ]ª/Ú(`GzÞZññLE1ݾ;3ù;™üíüIÒû9µ&sïüæÎ0ÓïüîýýîN;…ËèUH7ê5†!12q.BPH\œqÝÑ@…1Þà¥)¥¹A2O4îÿƒÓtñ~âúßsožÏ…e­Vûâ‹/~òÉ''OžÌËË£–ààî\è"‡¢Ëi5+J”é |g´ÛíTbuªõûÅCF¯B¿nãÙ«HE]’CmCxP »RÜ4;¹&hðó°—O$³ÐÚ/¥° g'´ •–‰½a?’Eïã¼$Ì9ð«JJJ8=„R©„>T»åË—ïÝ»—J?eý@(…‘Þ@ÝÚ´iSøvÇŸµZ½qãF‹Å’âÑ%I ‘H¾úê³H¥Ó¦ÍøòKÎ×c"ò pìkÊ-Ña[Ì^w‰BX#þ¯fÌ: ¢dµVZmT`:½_†Él‚¸òT*ÕG_ä Æ¯A+ÙE©gì&œL¤g¥µ±ué#Ò;n˜sKQ›Ý•~h'ð=•J²„o«p{aa!tìüóž³J!@d---ÔócµZ‹‹‹á[áÐÐPºwNDJ!€çµ|ù¢wß=À¸×Œù?ýé´H¥)EiÓ… æ-DZ›*À?¨GÖT Ãùct–þz ”“QŒ´–O¤$‰A;Sb)ô?Þt4^gÎr2l0MåRʳ:lÜüCømþ}Ãc”B_Ú¨€ÌÅ‹C[²dÉdçŠó!š˜˜þ®P(yžv`F322rýõ׿ùæ›|ÎZÂ)P¹#u´nÙòPGG[^Þ=´í_~ùáƒV^¸p9Ji<;¬ ‰xXr:5Yzû¢çל_‡(vîÚ÷¢-¬ã_|Gÿ h#…0ž¥vˆÎÏûh0tãLgÕµï¥ð"¨ñ4½HꮋyïõôôìÚµ :]P»jâ‡] Ÿ¥˜«añ€­V¤0¥iØR-º-q5·´µÉ…nÆ”§¢¢bÕªUùùùÐKÇá·HD9—öö§²³¿ÇT¡ºzðí8J©Ð§5%è~Á\U±Ì¾õbŒeÁ}équQ¼ÊY n°†£„·'á µøEÐøzÞ_Ž~¸–Äf³íرcïÞ½ÍÍÍI¿³Ò=9ø.\VV&ð€wª éÁP„M¤¾vŠ Ò¡¡ |3Óét‡ƒ N£¸©ÀTöä Í­;ºñÿ’É ç÷eP¶gV×cþ©fh°âÉQ‹Ý'ÔYHMZ j£Ñ˜D¾}L®ªªJð¾JüøA+(Z±uµÛ„m " °Z­………b±øôéÓ2¡[Ä&B0%())y`ëãë_˜)tC¢á¹*þsÖŽ6S$…c‹$V!(//‡6|ÀácöDH9®—ËŠRãô+ä’¥Œ*Ý<ÿ’µ6èEÁßÑ‹àUgg­w3UÕV믩êÄã´´“o#Q[aÀ 2Ù8‚]<tà4 tàš››iýrp;ÿ˳NF§LÊW­Y°ì·ÊŽlè-¥ øE°|ïªõ;KKyI5OøhÃÜl6ëHÚ7õRl{´V¥i«JåZƒe‚èÈÔÓ0¹àǰɩPâ(‚ïúÚƒR²„èS$…Éé¯ ´~)ŠbÄÛ)é-QäN’j˦@KÈñÃ(Æìâp8Š‹‹Ýn÷ÐÐP¤þzµZ:‡È6lÙ®©v±ñ‡Ž„nJ(æw®ZÙ•×ðÔ>Å]Ëy8Üdæ®”Édýýý.—K¡PÄ;B9¸'éxñc;lÊÕK%ÄgIuXÇý…¤vxƒQ$Õ&eE>“ 5-˜ÞªÝc‹eÿ°’^²„_« aD1Ž`*Îh4B.R7=,‹Å1çCIqRvD¢Üyç/ys›å¦æ×RâÔsÔ˜¯ëüpÑ_Žœà:õÛÏ$W!€ƒÅb‘H$ñë]ä¨!>~Ζ¼³Õ,HòPåü"ŸszÅ&VIÑ_Q3è+QUêífDÞ6á‹ô„>]–¹c8ŠqKà8¾dÉø6ÅóunûöíB7yR¤à*ˆ¤ÉÍÍ=üzß§¹H½¶û-ÁšåÍøÆ4é®û‰l[× ‡fÎäo¼•U¨µ±âì§I­îJr8ªZL‹ì.ô‰î¢K‹dŽ7)?JýDMbÍ_±¢ ŒÕ)6lR&jÁ===P᪪ªÌfsœqV)»P\ü O.Ãø×¦'_:râØW÷ò/u~yûð•‡_ïß°%]_©~šxÆçRJä¨︗bÄË«r„WDÛãœw‰¥(E4ˆšJï˜YÄ`]#xçf­Õ×´ÈÉQŒ#&|eÓh4;vìÀ0,‰äP·ÛÍóRDòóówµwú¥®éÕï'<›s‚¸Fîàt¿¼=ÖüGèVòâIDWFê\ooo̰,†èJøšÌÿ™BNBZ´Õä ?!üªà!º ß+JðšQŠüFˆúòIGLxçOŸ–J¥IX€ÎÐÑ£GËJP Aã—ºËó¶•=ý£…­Ù;vÕjTPéã×­ìϺãß”7 E>ÔF£1æ ;]ä$‰PyrÁ!'!M"£‚Wº»»áËQç9Žãð]2-^æjjjP>ûç&ø!eg$‰Öoæ… ¶¶¶F©RÑ•1‘·‘sˆÂó8G)bÅ>‚'¨4¸ÁÁÁ¡¡!¡}x”téºD)D$¤R©Ë劢)3&'ÄWuÂE¬ØGpOOON§«««ã:ý¹¼¼ª©J¥Â0,‰yÍDrpñæ*“Éàkk¤™Ùé"·Dè뀘rÀ±††«Õj±Xø¹¡ŽBys»Ý).r6› 6ª²Ð A X€ ‘+++s8‘DŽÞ]‰DÁ?ЩR(£££ýýý|Þ~Ô²¢BŸ} P øGÃn·G*M¯19DÒÛÛKÍÔµÿþwªÄ$aeîJÐ;¤Öbe„.rðmZ¨P® ˆ™ 5e ív×ét ‹%‰™ºX¤°°0egA« 2‰I®BÀ|FÄb1ŽãŒ¥ô19F³}ûö˜“»sÓéDÉ4 mª—ËUYY)•Jûûûw຺ºÔjµ”DØ–„ƒR™G7³L&s8Œ£tO¶½6"¸¦¥¥E¡PÀש预OHcccÊÎl‰I":·ÞzëÉ“'‹Ò-…‘æ°;S‹l"ºD†ÃQò+4é%•>­—Õj…µys¡¹2jN Çá=†ä$~2 …=Ú™+Ózq„ÇãÉËËûüóÏËèÝ•J¥õ ¸zo)®p6¡[Ò”B€@DÊüÛÂø¤ îJ"ø´¨Õj ÃR0%MÉÉÉɰ^¦&¬ Ÿ³¾ ¹\îp8Âmé"‡ãxJ” G„GY˜?Þ¼r¼ãÍý«î~uåê6lÞ6sæL¡¯„ØíöO?ýE #Ic4yÎÉ ñääryUU•ÐÁÌØØXåýwï|dýãw8{µ<)œè&êîüö¤îókÎ={×í‹z_zQèë!ÝÝÝüOßìr¹ÔjµÐg@L–¬¬¬õë×ó|Б“H$Üeê!&ÃÀÀÀŠ»dúâS¶ß…†ðJÎ5 éîñÁº±ãÏ?\W³a||\è Ã+b±Øl6‡lsT*…ÊÊÿqˆô‚qîÊï%nÁ7»O5ÕTØ{Q9_è¦@©ë©»mÚÑUw—9sFèæðŠL&$—´µµUè³G ’Çápp=¯‚Ûíj¡Ï]‰‚•SÊûï¾òß펿g Ý”P6—~ýìÊtÚr§Ó)t[2ŸÆÆF4M3"}woee%×÷0cèfˆÈí$új ±|öÂG·££ƒ·Ã!ìòÌ3Ï,$áô(±E‘R<Û¾kúß^ÑÉSúý=çpè75kBDNÓð„—a“S§ÐÙj†ÉD dÛækÚV¤-ýõÊlFÃúõD 2»ÝÞØØÈé! ›ÈØ]‰RRËá—ß>²çPõ¥8ë×n1þÒÏÃÛ€$æŽËÀÄý‰5U2 ì]õ‰¦òÞýæ×“1c‚wª=6Ñ&­¶ UB%¶TK’°É m“·M`@¤x÷»ëééáyˆ*kss3wé´ð0mã²à€æÉ•——ó߉çÂ… 6èü3·ã£PÞDáÒxŒØXûAb¦d?%³Î?×eJª!øñƒV¥i«œ¶YRÝaRZlj/„7ä×ù¾B ^˜AAu"RÛ}‹Ä6Ú.1,Ä×6ùVØ´s‹õ¾É"|‹»=Ñv!˜7ožJ¥Bãs ›ÍVVV¾=Dä  ¦ÁŒ'#û*rƒhꛬÁ¾¦Ämô5Žü™þÝØº½ìë$f01= &öFø uãümÀiøSÂ:W×åg;v%“T@è(š# /‘Ì)>•c:|˜èjMø<>ƒÂ×·8lÚåŠe!޶I–®V‚áÏÅ2YŒ“#4Ô× O{bíR__ÒÍ›7'|Þiii±Z­üËn·3¦À¥Ù˜!p%/ß7pÁÇ€qH=9‰ékR· }Z!À³²îÝ|û·Ü¢s7©póÁð^P=+¤¨zÀ– ÎÙ±)Îê[¾IÆ™Ã]V ”J˜Š$R%°ºð ê1oß"å j÷$t"q¶à˜M³íÑBG°Ã+žPP1}¬öÄÞeÿþýÛ·oOúœðx<æÀüLâ5:::88(czé¤Ï]™ÒÝ }M%:`8°.0ÙGþºæ- ]Í®'%(~æé¿LÆ‹—€ö=âÿÓD~?ГóæÌ±Š~…Üÿ™"à<‡s{Äœœ{˜£nðsNê²m8l‹l+Ž]²²²¸ŽRC &ÉÎ;Ýn7†aüôvww+•JÆY^CD®¡¡!…× Ù·»lÙ¶Ž>UiµÙ¶(½‘jÔ××›ÍfÞ¦©ÜµkW]]cQuWž?ƒ-¿. /È/-͇P_ š¨Û·˜©ÎLs¡®$XSÚÕ»o z9íêŠ}`Ý ÐD}¯ˆé^¦ª4•Ʋ)šCÆoO*Еé\¨åÈ8ßÿ€Óy)Ïýñ[_ĉñ…?»’¸È-]­dy#„D¹z©$!s¡šDjFòCoLž 9XçÓÓššÕÐ{=Û×¶;ÔHe /ÂGP¤&˜ä.ÍÍÍ£££½½½x¶´´r\±X©{#}DnŠ£ôöÆŸŒ”6}™»ýB£0()Ë¿ã>ÀΜg0¡¸ïŽüø¬…ÑשÃü‡ zR1]gƒåˆŒyÆÇ“žÜDû0þ£ ’fÙW)ýñ¤ÿE˜þøë³¾}Çc³á—gßÊ0R…wnÖZƒ5. 6ÁnTÁšD“É8-A*p mdÔc­8ú:ïÀYVÖÕ+¸”=‡n@qTyoÔÄ? ‰Vþè%6Æ8rt-£—A-3³‰î•@…ÆVoo«­Μ€»©Vr@î ‰Ã`V=sC´‚—-%ÙÛ:Iâ ¹¬DÍ^î;ý éééîéz¦çÏûEõ¼÷úõ›žî÷}¿÷~ï=.ÉŒÖør‡£¼[?•õx9³§(!æ0„ÀeK•7o?<›o·ÂD¤Êæ*[LŒ[hwQB63›^2s× …µüïÅ•ÈS‘››k0P1¼ÝVIc‚™]Ÿ–Œ”Ð@èG ×U€§‹rÓÊ …A­}•IsýºÿUªº ‘Ýxzâ­œ´²ÄÏ!-6‚õºd<’Ìä^c梸üp÷4 s›=^ØwŸtsþä\]ŽÕzçÅׯùê]Iæ½)¹}o¸¼+ËwùìW¢„ û7¥U¼üòËžQË–-ÃÃÖÐÐPVV&ˆšžžViók—ÙÃø¤ þcsïÚ.·K:uÊl6÷õõѽ¼)” ——·~ýúªª*™4a4…`Õ^c{‰×%;Ô6<ÆKá²®ôëVûwAssÙyŽw?œïRÅ«ï¼cìx7§¹þï‘’:Ëæ½ÁŒù˜ù襛9 QJKK[ZZø€ã%K–˜L&›ÍƵÃX\B1MOO×étø"Z—B‰|𢌌X,ùda4…€x~8Ü=a!¥•9žï˜1‘\Bˆsîÿ&ÑYBÜ”l_s{pG½ÞQVÎÉ0;›@Ѽ>ëÖÝ=H×ÝÆåUÿk¹¹Þûz\ÿ iâéd9³nÝ:ù4œÎÕÔÔŒŽŽnݺõøñã©©©‰‰‰0õ‚¶J‚êÔ×××ÕÕQŸ~ % Øív¼hüšDŠ0[ ùÁª ­ZÆ÷zÞ½):.¾þ7¼H܃Â>„r¾[ÿ›C:‘ëù’Ûªº ƒì.›í{^Y¥OÿÕ_·þâcÊå@ÝÄÛ™ÝÉtÿšÑ¿!¾d󨉙ÙâÛ}EvN0ÿ· >)ÉûìƒÁàp8²³³!8^±bE Ãöøuvv¢½ÛQ[¶lÁÅþP®á³@Ý7e ¨}}}A›D¡D!h›Íf…3ÍÝÆä 333µZ£ÙÛ˜\±ù¡ûŸúܧÙrÊÇäøé`pŽŒØóL—úll^ôÃé%crü§Ó £ OªhúsçÎáQîééÁ¨ 'xªÞi …f B€Tuuu)ôvq¹ÞÞ^‹&E§"ÇßïÈ/^²ù`Ìù*rŒìî<~(̸gÿeõ±NK%ð9†'§ÄGƒ˜wx¸GFF|7ï(J„`³Ùª««•+VÞ•ÑÅã<øFö¦Oiz?DÎÅY&æu÷‰mç¼b°.*´üòᇖJ *r¾ón||ÜjµzJ/^*£Ñ(ËE[\\,¤P(þqéÒ%³Ù<66ÖÞÞîS—Š\ˆ211QZdÜÿÔ„NÓyo ©ì^tuMnù«?•I£ŠÈñ yWRRÒܼ?>>%&ÆmÄúÚµÿ®¬|iddP&¶´tn»ÝŽ&çÀÀ€Š_™B‰NœNg^^^ðšš_ç縉šÉüù}A†Šœ€¡¡¡ªÒÜΠñ7k]YZ>^øÁÅÌÛ~ùdª‹‡ºæ]UUÕ}çÎýnåJÓ7º½N.tmܸò³Ï¾“Šýñ‹ø:—ššŠw’Ž#R(~®¡¡¡©©Éjµú×/â&r6› õ…üĺÀAEÎÇ=o5îjËý2du®cpÁ¾‘[Û‘ØØXù”9>ó7ïðü92¼jÕý==óÇ?Šltß}OËÄ&%%}úé§ä˜Lû“¹:^`"Ì!½Ø…¢DÞ¡mh,’õÃüÀ­ËfÜÔÔ”Qþ‘-S—«¶4V5mû2 [ø‡åèÍCW“mmo{U8²>Pà|FÒYÈÚü鬒¨ðü[²$––Ö$?{ödb¿øâè¶miÜG©¯É)1Y|«²²’Š…ÂÁÉ^ØyVÂ]è$ÖP̤̿ê›íÏu~Ïzb¡Öe™ãÜe&ýõE î{¾å@§r…cØ®E½^„nj̽koo¿xñ"Ycj·dÉ’¼¼¼ÖÖÖà/Õ«Îf³áê(CFFFmm-Q8 …—Âl6'$$ :_}LD.ÐLݲCuëÖyÿøOv¿ÔÓüo ¦Ë𻢴ždjzoo´ýsZZš¯çnذÁh4–••Ax‚V`OóÀ£ŽvâÖ­[¸Kãr¯¾úêôôôÈÈHо/…^  xðàÁ¶¶¶«W¯æææöõõ©¸¡›Èi8IŽ"¬¥º†_vuueZÊôwSûäüÞsn>üwÆrô–zø½^_¼x±™@lRSSñLãirù=—V!NÉ\g¦ßýþ¢@áp‰¡¡¡ï¾ûN&Y5‹ œž/9B–/_ÎIII¸‰ÑW˜FàÕëíí…¶Á€Cm`µZÑofËzE9Ù,‡M5?1ýÙ·–G¾šÔÙLUÏ¢µ÷Þäý:ù%˜½Bö9ËËËí®¨ø„”ywë­·^»¶T•KX L¸ÄÂ… ív»è Ô¸‚e†ÆXÉPºy›šš+ªÃ^ôÄzê%t199Y"˜Zë)ŸŠ*à…°õ÷÷ã?ž^TÅÅÅmﺉ.‰WK“ï(ÊÁa2™ÚZšSj_ß°ò†‚´)c  ÷Kçc;¹ ·1-­¾ùK©¨K~~>D¥½½=˜·Nyg±X¾ýö*æ×mU›ÍV__7m”C‡É÷^Šdþ5r¡y‚ky†ŒÃâä‡UT¦¼ xž§P¢È ^+XÏÎUظíDE)è’5sñ­_/ÜXÊšD…KwµõNÃÞo×ßßpÒ¦!? ù-Ö¬Y³eË–P¸ÕÂyrÚ–†â7d¸SSSCCC'Ožlvö}jÿÏ'¿" 2“„~"c_^??Ó/Uû~ÊÆ´üy~R’Z}’^A:–Z=ï)NþuÀzJ##1ŠyöìYA7,ÁS8eÊã9„)@ÔKÈO#5˜ˆÞ4©¨ññqþÍän÷ r÷ÉM 1“BhÉÕÔÔh]$ʼX¼x11ïá'Nœ„¬^½:p†šB,‹Vž–ÁÄl6ïܹ“Žv«ÂÕ³å›)|<‡0 Âõš¿ŒÌ·[„Ãêâ‡lÚ´ ­Oîc¸÷ -¹È®k¢OÙ ¸NKƒÁÖ/’<¤‚£"ÊàQ¤ëÎD$7Ì? e>¤§§”••Í?« çÙŽ&`+**jkkµ. …±çÉ9NêøK 2•••©©©ÝÝÝ‘º`?l8Ø©¤CŒL‹Æu^•””h]@ %bŠœÙl®©©¡f;%˜ÄÅÅY­Ö¼¼¼áááë´„˜‘¹Az½^j¶€ÀžB¡¨ˆPäBÖC†Ù ]e4+** vZ—E5ìvû¡C‡<(ŸìøñãUUU|ÿ4º:…¢B‘£Så(ZQ__Ÿ˜˜ØÛÛ1 F|¯ÖÖÖ¦¦&©7‹¯œ_;ß?þT0þìò虄@¡øPävîÜaýE”ptZGL©S§ÌfóÀÀ€ÅbÁ1¤†`’^:]‡ê“þ"mmmœd’D ¹ LÄí›®­E¡E. ÛŽP(ò T÷ÕÕÕ3_ª–““CŽÉ’Ð0ì sçK¾YÉ×?Ø…RÉ8 $V`?™õE>ršG$("í¥DtJhA:-½Í[p€ðØív¦ü@(M ä§±±‚§Jß ·ò–¨QÈÍt&kNvvv’ ΰÉ‚¤/”;¦Sú(ƒˆÈÑY Ae +,,ˆ€NK«Õ*5f!A,¾lŠÁÍt•@Òá‰ÿ°ùÈâTü(ƒPäо3™L£££Á/ j7Õ—º§„Êí•ÜÜ\˜µµµUUUZ—z¾_ÙëB¡ äRú'?bµ#[íÀÚÆwŒ››ÁEO°VÞ•/^Ôö^œl=ù@ÁÚ–£­° åÉoÉ"Ø7F£‘v*hˆ¨ø‘µÉ‚ÈmmmøH&’%%—/_NÆÿ"ÆE–îˆtWêt:<¾Ñ6"í´;˜$’m³mY’·&/]³tUŠÆ (kl…ÊÊJÒiäK£‚þöÛ¯¥bo¸a×-Uñúèõú®®®ˆìÜÝ ŽyÄùV8î€ÉdbX'OÒáIœ\è„Jð‰¹~ýº (’&*)ç§©?pNl.ÝütýÓZ—…2Cvvvff¦Åb òu{쩯¾ZÞß¿7-­IõÅGããÏ-Z´I*öÉ'ïêééB“­Æ£²K ·…&QAbꥧ§“O:ÔG (""…ÀŒ³š\ m,ˆ[ð³ÑŸ…‚1‡"AtSŒ)QkÌ1lÏXbbb___ð+Aè\W×á•+Ÿ„_¹òÛ]»ò>þøŒTìý÷¯zñÅe|ý)¤Ã“›êåã†ú¨òQT‡Šœ bÆ‘ã1æÂnLŽÛY‘¿û7‘™›’…4 $%7ä&ˆº§OŸ>sæLGG?%Žãââ½ÍÕ3Ï~hûа۠¹1§Ö˜œ”öùÉÍÍ%íe¢($)‰!‚'¡°°œžŸŸOúßP ¥¦¦’À––ˆ¦¢¢‚œÎ¥D`uu5 ,..æDŽ[ï%¸èNÍ`ãÆ¹ýû÷å )ëêêør:d§²Õ¸ZsàÀ…±(•Íf w_Pm!C}‚âÞBæöáY"BH\:7mÚD¬=ª|yD,9T‹¨°‡Öe |3Ž4co,ÞOOíÉbaØ—Ül6ÈÉÉ!{²àU7™Ldno}}}ii)I™@òá‘2//îܹ“/]P‚ØØXîB|‘ãÛ"œ)¦áîÀ¸KÃÃÃ2u©þP’UE˜ÙÇÅNNNÆ7 \áív;î'n/¹à@¬=nœ*E‘C}‡êRs‡þàÀÆñQwdï!ï!^<2k !]0n8¢=xKVäâ/ÅCzï}ìÞ‰¯g˜ÿÞFÛ„ýÚÚÚþþþŽŽŸÎÂÇ„In~TŽ8V«£—€‰VEôô|„&DùðsLMMy*é-×°¡FÑñ19TÁ°ähSÈ?ÈÐ1›Ðb€-EÌ&ŸFkÂnL.  Acn÷îÝ^çVËÍ«««Ãü@£££~Ï“AJߎЇS¾óçÏãG'ŸhA’Y ¤Õ…žäц¸ÈE›¡ 4“É„©¦¦f¾Õ1õ®tUîm vU…™X]]Mú9aXË,A‚_¶µµõСC(C__ŸÖ·„âd&þ“?†í'3Ù‰c'­ý" ¿¼+{_‰Ñ5víРD½¯¼Â¼öZ–üÕ÷Ì~0¨U U,§†††ÁÁÁ–––Ü SVV†ê)·—ÌßB•‡¦ 9³Ùl³Ù`êÁˆä”r›@EßJˆ@–.ƒåwöìY2àGz8¹) tdžð%ÔDΕ5ã¸.%r¬À•ÏųŸUºP뤖œ'ЛÄÄDˆíb¢Òîá¦4à?qk‚—œœÌI`(,=JñÂu P•LOO‹Ç9ÊYêzpe e´Ù ÀÂhIkAësÌs'ZNÈ%r}÷9¤î›è‰>$ö/·²©ö‘µ²$ŸL %À¦w8•••¥¥¥dl¬ÒYRR‚@<œZ—‘"DRäRRRúúúÄãÜt…ÈÒ\•6[÷ ÃÝë9˜±›]"&]+º4N¬²hŸXÎn‘ŠËãý¬2Ð1ðn廟|.•€-¯8ìmP&tr- exÉ-›àvªvë ,‹*YQ(ó²×ÞÞ‘3¤í0 ¤¾¾±“““Z—1ª‘Ü4?Ò©S§:FïÑ×¹j03¶/;AŸ½a¶ûp^ïªêð»»"²Ù~ŵ;º®¯•ì®;v¸›IÚíyºnóvsø÷cL–tÖl(BƒrºŠàQž3 ó…¾ø¤Gw¥üY|Z[[ñ_­ SŒ)ø“ù.nݶ®Û°£k”q»û!R¶¬×®;˜½yßfŠI»ªR"ÏÎsnÖæùóç¹9ìH¦ÓéÖ¬YCFøè¢eACRä233Éö‰J04[IåÅ NÑȎ؈rÇLU§Ûam>œP´·w‡œO‰c#ÝŒa»N$F·6‰éž»¦½{‹ºaLÌT²ÇHŒÞky|8«³³3??ß¿/ç‰ì˜œKðqÏ…e 7ùð±±(¯`tsö£Î%ÚÝÐǰƒ™k÷ºÂŒ~Æ™‡7À©0lI”-ë…fÿ÷—È|.rÆ·H¬<ñV«µ°0Ç0òùM^N‰v¸åJKK‰ï Ö? P`\\¹í±±±$ð£>Ú»w/Âßyç$8}útJJÊ]wÝuåÊ•;î¸iöìÙ …žc ëÉõ7HEÀôV¾gqÒZÝÌ‘Kpæ(<‹;fc†`piÃØï‡øåthƒÙó^ï̧ï3Ì£Ž&¡×‰·³øÀðUÑ!b°sðWÕ¿,Å2[*֨嗊+Kï¡rÒùB§¹ÎÆY)€Á ñp1ÚÌ%dï“9_<ecÛ? ~‚¬[“\y؇w÷ùrJ4sÕY ‡aHnY5n“Hþn‘40˜·ÝvéÆÜ¶mÛ›o¾‰GúGfÓŽ;vlùòå z½~×®]d èŸæ…ojjÂS”˜˜ˆ‚1aŠ?}œ"crnqìG¸Â¸©Éœ%1Ø#îvâ#‘³»‡û¢¯gÍ1==ÇW.d¹19_›¹{!3Ê(<æ§ãÝL…9(.›ÛIr€Ûùs ÝN™œ|ç†yöÍÙS¢…ÉÉIÒÖ.((Öº8?¹xñ¢Ãá°Z­‹…toÂæÃ~VâØ"?nzz:JˆÒj]EÜÄ÷>DW#³ÝïÌ$‡ÞXÛA¼#“:,0Ãvé~,ñ19ogqàYTwµOù19u5¸½ŒpqÓ¹è½Þ×FòŠKѰì®+¼úP±ÂS"Èj@:‘+Ü!¾š‚!²J™Óé„QEf¯“Q½õë×k5¼×ÞÞ^WWóÆhèß m2™pýÎß;媾 Û7ëÄbÙªÍ.•ë.ÚÛ;ó±÷•˜˜˜WzÙQ3¦|·› ‰äì½#ùйâÇYÂiw­:*Þ]éªÄ%`G.7è_pO/“¹\§³Ï¢)ù‘Ù–Ð}ÌdüO ¼ÙKWo¨­ù'å§D—.]*,,ä^Oªp‘ TÄh4VUUAQȘz999ˆ‚ìåååá‘ÏÈÈÀÒtwwŒŒºHxØP†pYúыȡea·Ûýν»È<382¶Ï\ÔÍ“"¶.œQ6Žw–ÔÀËí£µ”a=öF›‡ô.wCó Ys©$rvy>Ì•gF$¹±Ý63axøN—§ü¬"7&Çʽ¨ôz¶$à®I¬ÌøäÐ1¸½é/k:{övJyé_¨ozÿÌÌÊO‰ Т×ëõqqqaQËPÔ…l†¥\öøÃl* 2,šV^D7N¹¥'åÍÛ'Ì4®“„ïŽòî"62ad77ö•õx9ã –Ð(Ûu£´Ø»ùžR9‡‰$X7w®Ò¿³ÜHMMUñ‡IÞšüDåËŒÚYXuækœB[YÆàöÑÚfmp N¹e銚¿/ùsòíî³*ÞüÐ';;»¸¸U›Ö¡„ò²g2™\u—^Ó¿¶¶–¬a¦âÕ‘ÛÊ•+ɪPD~ÈnzzÚ`0ø5ÚÌÑÿÑfÃ|/¥h…Y¼ÞLuñ6œý<OâÜÜFfÏ$rnà\y>< s*W”™sÝOÌœáþ5%OÉLºƒaî;…B¡Ìñ#“ÖQ¥Ã#.-¥¥¥CÉu?|É<>>¾««Këo)Bàêå0sq 5‘óºâ‰ /Ëzñ—¡ñpmœáZ3î™(ÉAQÙfðp‚ÍÜý\~‰ÄO™œœ\±ô¹;A¡P< žœd‰2†5 jjjîÇÊy8 YiýDðkfExYj9òÐëõów°<Öpìí²·=ÃÿŸ½ójãÊïø#þ‡ãÄv&Œ¯á,Åi»@Hk¨çŒ_Q'±4ñPwb3œæ€)>Pé\À5w™ڠÔ>ä̸  w±D:‰»` ‘!Av‘ã6øÈ$DZ}†þvWý×jµÿ$Þg<²¤Ý}úIìî÷ýÞ{¿ßïç£?ç&S3Ÿ&י“Û-œ|”Ñh4 _þ†*AŽk `¸€ÊÒýýýð„*9”™™IU¡ŠßTÔ´Dn~~¾9¾´xàîüÝפ¯Ý¸vÃûÍ,UVew%7˜8}èdÔ×× mWôôô466‚ÇïíGPá €Gód2h¸}ñ•…–ÈÂÁdjj*¯.ñ”Ú tæ8sãP"‰\“ÙÙÙ  ™*3d2™Ä–„IHàú!†'pB©¸k×®@?O§ÓUTTˆGéWªÕêüüüêêj¡ æ ñˆœŸ3Ç¥—h´··Ÿ={6!-ážb4áÞ!´! Ÿš~¨d€F£Yss³Ð†°Fcc# 1.ÈÊʪ®®¶X,·nÝÒëõëÖ­«¬¬Üºu+<òsVG''•J»»»q8F̀ߓ ×Ubœ¨ëׯ‡„ÐV`0Q~z‹ªTg4%É¡C‡Š‹‹¹)ŒÚ“««««©©áí—Â`šš }ÆÄ´dw$ƒá­Vk6›Cm¥¦¦§§«ªªz{{ÁwÒét]­Q‹\EE˜bµ®„b&˜8ú†2™ÌS;~.[«v1>¡3·שÅb±Ùlccc u­­­¬›µÈ¢r8ë×?˜Ä))[=­P(—h‘‘:F£‘çYn.ˆÇ•¢dù h©"ަJjqaYô-»Î2ø+š-[¶Ð_-‚=9P–¾¾¾¼¼ÕßÿÆ;ËεËåòóµ…µƒÈA˶¶6*¾3“õˆåé)Ÿ²T ]Ò¤.¿7yÆ~TÑ‚lÇ£9NZfuò…4É™Y‚¸Ä¯¾9@ê@çš››ÁghjjÒh4¬XÂÄ“£€{:Gµø@)ÊîÝGùQ”?üáÔ–-Чó¼é7q"¸= •J•››«Õj…6„9p.Ùív¡­`ùñE¢jce|yBd¹ßZ›[™%‡-D§–÷ìBÛ%rä$ ¬¯¯¯®±±‘­9uæ"GÕ&Cøÿвu«ú¾ûÖy¿¯TzŠÕˆÂŒ½^o6›ãW'zzzâ×øä¯œö­jï5¬r0ô>ÞÈGí>ƒœÞã¥î7‰½ÁC- ¯†"@ÔMöqۈʾ>•†1,ÓÑÑQð@bXZ‹¥NOCChµ°µ‚®_¿~ß}«xûõW¯¾ÿ‰'þ1#ãg?þ›7o¿=Àb±€ŸÍ D–h ÚŠ¨ YW×kƒO\ŸËÅCïdZ:Ê»>¡ïA>• Ã4á«áš…‘¸Ec#pæÃ•KÕ:g “99:”vhhHÀÌè ó7>²};O‹èFFÊW­ 7»#6{0ˆô³ššš¶¶6¡m‰šää䄆ý$9Óåž ‡ÉæLRœ´ööšÂìã¿©ít—´ŒZõm¯¶¸›‘ì= DeNseîž¹:²-d"ú…T8b<¯«ä¥R T…BÁLçX¹DJ-ðÓÇÝ­s"—Ë5Me%®ê $ö÷ZR&A”Ûd ÌGAÂìClò…ôÌÈ'g*ˬK“f¡‰Žž¶É5+JaÃâ Æ«+ƒR\\ÜÐÐ:ÇÀ;dM䆇‡Wlº/øÝ®¯˜Àuât:F£Ð†DA… ·ÆQƒŒ„ãå³Ð2aö Üäñíˆ'µûäïÓoÜ*PT+}Ø9D&^—ŽA'•5‘3™Lp)Æ×íƒ-RSSÙ-A€áˆääd8QµZ­xB<#’@!îñ¾6·Tá^Qsäb~¿eüaöñÝBDDøL­‘ E|—ü/=§c€Û/R Ž^¯‚+"ª£X9¸}tww¯L‡ú‰¹4 ‘Éduuux•¬eRŸ¬^ŠñÓSÞÞfÛáÙIÑÄY ³—Ü›¤e;N/ͽ+-•K“mÇdSÄ¢ÿ%1“ï«%í"µŒŽd,xÀWÁ¹½"ÁÖÂo¨™up梊ώºÔŽØ€.yvvŸKö32~O¾ýöÊý÷O|úéG"·…BQPPãúf~hnn†›…N§ÚÑCŒ*vÀ³fâ€Z¥ÁÅ%FĘL&šûÇ' °$755•‹ÆÅÀüü“’Æ.\ø½Ð†ˆÔñýÁ¼¼<•J%þÜÇÕÕÕ '#ÄàçøòJ÷j‹Dh»0$Ü´UUUR©ÔápÐŒœã$„Àn·ÃD ¿¸eqqxtô÷ž±YµZ-`ªû@{0‘H$z½þpâ×D !`ùñåÁJj¼'M^€ûTQQa0hîωÈi4šC‡&äÂú@Eq:Þ†°Â1£¸¸877GÄ1dVÉkÿ1ÁúêJoêêêÌf3M?ŠÃ99£Ñ_’ë¢Æ £iiÛnÞ¼A½\µjݽ{·9ýD<’:33 OÀw¤†gÅ`†&àÆegg755©T*¡m ‰Ãá€“Š»ûPkz½>âžq¿ðÄϹÿûûßX½z~vöð²´´´££C<ö`è344¤V«¡ÂuoŒ1Ô’¼ðƒñܸŒŒŒéé鈥"ùHëåt:¹·¶~›à ‡ëÉ1&77GpÍÎ;c/|œììlút.B¼IMMÍÊÊ¢BÊÉêJ?Ìfsoo¯ÍfãhÞHúm !!Åf&<ÕÕÕp~êH˜ï·Ê]ìGm_<¬øÎ|˜’AZ&'îº~çB¡av†Sæææ‚qû6“ OqraÈÊÊ‚^sFFFGGGÄØu‘à©ßò|èÐ!¡ÍÁõ䨇ªt¯P(àüdkΕ(NME°ù×>#§¶@=ÃFrBžÉÐ%M*£žûDq»‹ÚXk³ÕZäûò}µ¨¥Lšd¨ú¯ã’€AÙ÷.œÏ»Ö2i!ZÒP-“ej¶RÊ–¬ó²ˆÙQ°X,Ößt}`³£Å?ɾ³V.™ûQ*úÅ_"™û¼Cþ ‰ãêçðïâÈùÖž®[›|à™½?ØÿBÉîÝ»yþ"üˆÜììlÄk3\®ìì<>3ŒH$;)Eß×h4úÍ—h?Ÿ¸ÒÐét}}}6›-b²ó°>b$ÑGï¹ÎžÜn‘ö€ ãÜ•áøs¿>oýOyÆZÕ÷n(w Ô,4ëú Y?Aæ±MÎé…ÂÂÂ_ª÷Žqk)))bÓ‹ööö±±1茆ÙGŒ"gµZKKKËËË+**"ª´_ý6®Y½zÍ—_΄Q±Ùƒ‰pæ@áL&S mð)r¢‹\ÌfsK“Núð=MΜ* m¾Ÿ“O¹võ8PûàÆ…5›k_ûg<D%rÔª“غ†‘©©©IOO¥³ð OQ*•ƒƒƒW®\‘J¥w†ûû7ßÌ-òÅÝ»wÂ+ŠØìÁÄÈ8èZ­VOçú6 ·§3e#okû_ýÚþêœæ¯¹R8üŠ=ÈQwã­}þο¾º÷ûO[,N¿?!CCC§ÌÅèÉ~¯,‘ÜÓ©D™L&´!>=;;»®®.|Ÿ‘ ¨¥Ø"9í™=9?>øàƒŸÖQ<~[Wø’‡0Àqéú6þ÷ÍÿÒjÈÉÉ¡yTTž#‡\Ò©©©ðA1zrA¯qìØ±­[·VVV m AIIIÂd&ÃD4z¾àÌY­|G?Ù× ‡ñãº×:š_ïÍø÷Â(•†zʯ®é§ßuÎpèÏ…¿Y€†<ùæƒîð+.xïÞÍÁÁׯ_³Õ`øß¿ãŠd`` ®ê¥³%×sÚ/’× Võ7Ýc½ð·{:Ì¿MKKc«eNCàŠ€îfCC;|{rAµ7 ¤®¿¿¿ªªJ¥RQoÂ;xþ à Ôê_ÞtŽÎÜl5›?šž¾˜’¢\³Æ§?þõ×>:óæÃ¡¶îߟ͵ÎaOnrr²¦LÕ÷ò—Ü--‰×W¨èÜŸýº³ܵPûˆ$„îçÐÑÌÏϧ9á—h"põ*++AçÀ·ƒž8³Ú­ðËBŸÀ ~uŽ¦È½óÎÄöíŠwßýÉÂÂÝÀvîüq˜­Ðÿ›˜˜àî+¬p‘ƒïþRQAçÁÿjŽ&Ž«èåÞÇÞ9ß¿nݺ ;ˆ!„€òáRSSégáˆãáJú€ã ×0ü: RžÀ»öövðöÒÓÓá /..s8h¤Á`èééÑh4Xä0ˆŒr¡Æ-ÛÚÚ¨Ñî€ÛÍD·6¤€†åäüÞ¿xñ—a¶~ñÅoŠŠè®¯ÃDËíÛ·+4N<+v…Cäjí÷¯V”þ¸ãß{coЍ¯¯gÑ¡¡!è\Âý<ªÙ¢!r›7oö&†{¼ãt:ûúúàžEMËæ·—øSÁ¿Ô›×®]×~V¼È ãÎðä@ç\.W*ì‹$›;†U•‡ŽvìÜ–£Íþ¸‚DÎpé8ðÕ¨(ïuÛáý<ÌŠN•ÁÁAÐ9*±G«œ’I„þ®&Œ_þô£’çî28ÖåDT´Šõ-dßä|Ù\ÿƒowýêġҲPƒ–üÓÓÓÓØØw쉉 YdW®ÈÅÏÛÃ`Â#‘H@çJJJ²³³»»»ñâ&Œ7¿lú']à 'ß"•OÉ'ß»ˆäé!÷´Ø”ÀÔHýwÎvœŽÑ™cåFJÉ<óäW‘ {öìqe™ D€AÂ5‡óªÉÏ^ã`žòà‚;ï¼Ó;O•#·­{î¹G™á]»ÔU–¥Æ§ªÍíOå²û»,“5`ëÖ-5ˆœ²<ŽèYàm®Ž½Ê »«sXDä¶CU§bCÈ$bÓ÷ÙÙ±cÇý÷ßïîúQˆ…܈°‘ ˆ\SwX®™º¥ÎÐFž»»<‘£NNǬìPü=ÓäO§|‰ßR|ÿ'Õ¥ùÅ*é¢ÓOvkcuͤðß¶üö—X.--)Ï&ò¦±“““ WÕ‚¦‘Às_ÄzO æO’;Ôr5ßé$ŒËf³µüx§3?²G¶çàÓG²‡Ï©s;¨‹Òôÿý¶«¬˜”¬DµÞvG‹Ù#q]†ÙjGëÂáð¿}Ð9ç\ßçÆXeܶ›ð·¸‹¬b¹ªÛ¸ZÎÏq_ê»%rÔ]IÞtòSLyÞ½ñ¼“%­Ý•xïB@ä­Î¾©Ý£W®Ü>Úe÷:lžÓO,Îqº¨Nç_Éåí$>$Êùüñ Ïñ6ùUã­çn¶$a{×û­DüÏý›?9sôÜuÊÉ—¹‘ S(·ÓH®Òô“2úÂÇSU§ï|h!rxÏîBP¿¼• B7Z½=kûÒh>Z¾_ëêÞÌžån æäï`îƒ~CzÊò8i{Å!7ž=â‹¡åyÍ+­“ãª^*WU× »P‚ (^òÎäÏòô³çžÝ´xm5;my\r… q—üý/¿Ð¬§Ÿßç~ñWOœtºéö Ô󀿯‚HO377·¸¸è‘û…‚§ ãqzzzÆžüþÜý½ÿ³ÒÚðMÜ̩ս ß0…e㧸ñÆ•(ñOm:ýÜnºé¦ú½yçC‚HOãû]|ÏöíÛ¿5òè¡g ÍcéîοÝôÈxЍ²Ûei0ÕErõ<[€5Eÿo¼áv)€ûìûú7¯\~Wš|òìÁ:?ïviÊ(¾Ï<óË#žØ½»aKÍ•‰'^N®NäˆÂ-//»]fÚƒ@ P¿r›ðÎD5P3tøþ-Á›w<0üÌ]WwÖõÀ¬sîÍÏþèWƾû”Ã…qQÖ=zÔíúaLoãd Ïó}ôr¥«ëÖmøðÃUæ‚pÛm·…~øÊ=¿¿ÿo^zðv÷¸,}ÂýÁ ÿúièï~ø½†ŒÃ™œ{æ—Æäð4$’[u{­C‡íÝû•·Þ²ß»`Æž/~q]¥« •tuuM¿øê{]ßâºþ韺V "oÇ_Züë¾°ó¾ÓÏþ}ÃÎS ’Àœ<ùøáüý6÷î»ÿ`¹ôá‡ÿ²wï]W®\«t•ãÙOVå/F¿ó‡Ñaù±Ñч^•>:ôÕÖeMämò•uOüxCxhßô‹I"ºMÊÈ;³+U±ÕÙû‡b:ÜËpñìò¸àvYšD.e_×°å4äûRÕ‚£GÚõ“Pçù•¯6µ®¬¶nzmréÒ%"u?}å¥C¿³th×gü¦&æU¸ÌúÉúsoÿ‘·?>R‹¼‘$íxÿG$€§9þ<çøwñ±cÇj¾ ZOOOÏ'ÓDêΞùþž'ŸÙ¸áÓC_ù`_?×@µ#Úvög×}ãóËë®ÿƒèÈôñý͋޼ DÜ„H]âÉ_>ŸîÌ÷ö<ùü†ë>éïáú»ÿoçop;{¹ªv_¼ÆÍý—û7÷ÞsÿþÙú 7ܹ멣‘­[·¶²Ríº„Ðb°„`í"|ûñG¿ýø;ï¼CïŸóoýåË?þÙ“…_ïÚÐÝI' îêùpýuŸ•'üß׿ñŸTNŠÿõéâGŸÝ¼mË.!üõo† …ÜZÜ%þFÁS‘R 3QÞÎNSa£aÆVs¨\gç9gy—gív£{<¾ h[û÷ïW^ÍS5/\¸píãËí7Ýx㟲G*oÞ¼Ù#,ñ·"×hLêÁÈÄz1«Ž˜e‹"‹9×êR˜äŒÕtÊ"tγÀ³»€–¡h9hàIÖX'×Xr Eˆi,¤$ŽêH"W2+¦‡™)Ù13Y–ksÈÈÈDáHìf6$B7‘3:TÎjWž5Ôˆwv!€È5’bzŒ*…9Èâ£3ŠŠŒ¥‹ê©ÜÓ“1[ÎÆkt¨aî䣓ŠÌåçuÃÜ´lcg“5ðsssx@3h; r¾¤8;•¡2"X.ðƒºÛáÔl‘½Ô„¦ÌNŠ×äPCŠ òf»>ËÖ‡jÖV»ò¬WÀ.ÔD® 4>£Ã`V”ÂL¡ÈÌæóô_¨/ó`‘‡uì\šKè8k¨%†Û¥ @äÜB òk0kP5˜uÚ‘ ·KAÁìʆSyÅ€ …­næÜ¡sœg ÜK@;â-"¹Âé4kb¹™2Pf˜ ¢£v'Vé°Š:Îx'»*‘k ª„”Ïz,¦Ãt -¬žW†¿Ì3ûê¬Ëª:ÇqÖP;˜]éO„6e?ë5ʶ2-žÔ:U;Y Öº•/úvî°ê"®ž5ðXBÚˆ\›B´ÁU1øèŒ²àÌ8#RTW¦™–º©+Ø ‰™”JY¦8:uèÝãjYo€%ÔD®Ñãú£F4èÃE¬SGèló ìx–õÕì°Ê":Êx€îîî÷Þ{ÏíRP—/_öÈÜlšê)ÖÀÞ¬k‰†|_2™Ì©S§Î;çvmjgãÆ‹‹‹n—ÔKggçÕ«WŽŽvtt`‚5JE)SžpÂŇ„ZÜ_"IR¿Û¥¨ çwFà.^¼¸gÏ·KAAw¥ h“&EÓìH}sh0ÓÝÝív¨»ó<ïv)(97P§8šØ¥o€žJ@›së­·ƒA·KAÁ˜œ{”MÜÇPœÏhÔ÷%“ÉtttxdB6í"9÷ “M@á€-KKKcccn—€¶"€×‘$éµ×^ÃEÐ.œ={Öí"”€Èàu:::8€%á -8þüO<áv)J`L€fï Xk,--íÚµëøñãÞBF$ 10Žçyï(‡H€æÑðïËÜÜÜâ⢧î xDr´ û÷ï'RçvAh r´ Á`ðôéÓDç0ÓxŠ¥¥¥cÇŽ¹] {š+r×_¿9à%j©†ºE©ÍÖ:µz³K^é¼CKçÉmÉ%ªÞƒµÚÕf´$¡›O*gµí ë{öíÛ÷ØcAä€w ŸFQ_ýu· bOsÐ|íÚ¥íÛO¹]Ç.Ü[kRÓÓHèc&Ãé…Úv»¡›ì¸ÝVŠé19Ç&rÑ•W¤Óš’JSÔRI’äéÜxiP)7-“s£ÿX(»¼,h¯<ÆÂÜ.%Hð@~{?~Üí‚ØƒîÊZà£Éxfj¶èv9Ýý >4¤ÔÜœB‘ˆ”Ÿ/ꯉÆÅ#½éágxx'ÛàUëPýM¡P8qâ¢:à.çÎó¬Âq¹z!±F8‘kn¥ŽM­£ÍÔ§Ç^¤Í½|Zç\x¢`r[Þagkif^K§d@S²ªØQÊ4N Ò-Y6F0õÏæô)Ò²¨”JqW^Á\å*p\ß`„+ý< 74h*GÒ Cq®éÒÛ®tww¿ùæ›Û¶m#RçvYÀÚâüùóú(o‘«Ú»'Eyö"#sIåÁ“ThW!Šõ²»=?Ñã#rçR#ƒ&Ga1ŸZ )’œ¬uÚ?S‘³{K r¬d©Ôð‡îvPRUËÊRå&Hø4BÏE1¨†ê,¤òÔ¡0N·(gûˆóZêò ª Ûë*Ç4®¼@&ø Ä{:;;OŸ>=33sñâEì üÍâââèèèÀÀÀ#<âvYœ‚MSBÂãŽäF¯ß祠rTœÏsñ¤ÀŽi26_䞊@Œ CQ ˆLòܬîE ]fXr&H,D£ÃT‘Å'=ÛKRóóv–V$EaôT‚ g®gV–È”ÝP\Õ9z>µ Tg¥á·ò ÚWAàu{nx¶òLãÆIüéö›ÛÞô3ô—»ví"â·cÇŽ`0¨Þ=ýôÓÅb‘ œÄɪNêŸ%å·ÔäääÎ;kû¸¶Dr‰g+nêãÙÿb!£é @2…";T†¡˜ òsP·Re”6šSv™«liB+ ƒ }•â¬R”e‚¥†ìèÞ?ª=‘lgØW°r´XÎIÇZµÖ÷lmræÌ™d2It®££C9CnL—/_VŽ•{NâdU'ÉÇI9èîî&‘\)×ì'ž{¯Í®¬å Æ)…+\2™å± 6ÿ2—ÏE¦Æ¸IrÂ`F§"ª•~Þ”ÔO¹%çÄ‚¸›Z™³ìW«šî§hSŒJõ5UÐZûò´ìr¶¼AŒu Ç}3ã\" rí:¿OÀuÉ5`i£S$J1ÄUÂP(&ÆÊã8eb,InB xL#cDèÄ {K+Z2j¡IÄ<¶#M†j™´™£´jŽl‰>Ä8;²Bíª`2'®m„N¦8m03šäDZJ6ñ'8cr „ÎË÷ôXJ-Ì¥+CqŽ*_VGçÈl¸OŠÇ¥’Ÿyâ'Æ^h£¶–ân8ÈXrgm1â§,{ã°›¡ÚÀœ¡:z1è\LY¼Æ›Ó˜*hW…¢Ù\ÎÛ¨.ü룳HK§21¬•Ô º+×+t·¶¹\®=ŸIŒîJ\Ý•þ§ÒÒ¶¡=à r¾†­È¦«ÝÚ6Š€zÀ˜œ¯¡C\Q· ®H€oÈð-Í]¹qãFO="½³³óêÕ«n—¬0»×i®È°–Á÷×Aw%ß‘à[ r| D€oÈð-9¾¥¹"wóÍ7¼ÄÀÀ€Û  u4}«+W®¸]Ç]]]X·ZÖÉà:è®à[ r| D€oÈð-9¾"ç€b:l]ŒÈÕåÍ.y¥ó-'_9•ñŒ~¬¶€Å.Q~’ž §‹Î[²ž¦l µ5,À@äÏ.—XHåÅÊwòUà£3Ëã‚Ûõ©I’äéœáDnZ&çL6Åô˜‡b¹Ê~L-IhǶ´ ¹Zà£Éxfj¶èv9ZJ(‘òó¥:‹G"&“âìT&>4´¨!¸D®>Šép8‘k½n¥î8-Ð3uv±is÷—ÒçGLLn-~*Yš™×Ò)І¬êìxëŒp%e§74hn ¦qý UèZšÑPÙReôÆÓÎÍ•­Ðn†J³«ê1ñ¯˜Ø6uyy îÑw @‘«Ú+'Eyö"#sI¥×-—腔θl(ÖËn†ü`Dkˆp©‘A“£°˜O-ÐINΨg‰Ÿ©È‚Ù½¥9VH²TqY¤©„‘”!¨R5¨öjó•cgö•›ˆ‘êÑsÂÐ ®,äJÂRjFÖ¢¬vkfã\I1å)nR«``X?V¯Ûµ›ñ (8I F‹óyöÚ½e6åÑÞf‹þUÚˆœCL·fz³›‰òê%)¨‘'§ÝøÉmžSn§¥›,Õ8M˜ì$GT”³t¬K³ÓdÊÞÒŠ¤hLIÜ,[ŸÆUÎNãŒÅ&*Wi`Î4&WjE½Yúq]KhK–*¨fÀ%ãq¦P¬ÐnêÀÞŠÜt>’ŒpÔ–¶E¨¯ð–•—‡E~"—…ÀÐn@äb™.a¼ÙÑ»%¥XÈ”nŒú­W¿É–kœ¾/¤gb½ºžfV´4¡•„ÁnØf‰U5°v4•+×8ÜŠ-ÊäwAus¦Âz©+;³ý íFš‹Æ•DÐB}B_ˆýf((z_á-+ó/‹cÁl*_],À@ä‡é&i¸}òÑdhj6WAãôàF’Ò1iVT[K{_å&ÍÈ”PÐ.{ª—¦Tæû>gcO#7Ÿ·Ø°0Ñô;`„RµŠQ8½ã‘öW:ƶÝX\Y˜% @ÊLŽóóiM£+½eVâ$pÈÛ†ÌÐ^@ä -z!¡Ž!†B11V.24ÎÒºõrZìaÑR'HØ[ZÑ’Q =Ò"îäét¥0’u,–nÝt0LZ)Þdöeu1e¨Ö­Ž¨Dn´Ö£r˜Ê®Ýô+ù)µø 75¥itå·Ì6ƒ‘™ ½X×Tï]]]n×ÑTžfºÆRáÞ@€“˜bF(]¡KC¥ñ' >:“-ĹKñ¸Tò3OüÄØ ±t¶–ân8ÈXr'™‹bŒøáíÒãËÙD@Ë¥Œò\ehUä¼Eã¦e’N(·ʼn\´úq,:¢ÖËêJÊ“MI"¶øÕ“Ùµ›ÒÎA.#‡’ô5E3ùÔ$¿Ê[fî˜8œ\¹‰Þ¡¹ûÉO@{ÿ ILšh9ø¾à:è®ô? ˜V í DÎ×°9ŠtÁ¢8ÀšÝ•4 |_pDr| D€oÈð-͹ÍO100àvƒhÍxBíO¹]Ecyîå0´ L<ÀuÐ] À·@äøˆß‘à[ r| DÎ¥]ªu¹º¼Ù%¯tÞ¡¥óä+§ªÍxˆœCLÛ^/¤òb¸ÖÍ3ùè v½€–‘«…zv½Ð2 rõQL‡Ã‰DXëÀ,uljž©÷½H›ûs 5ÁDÁäÖâ§’¥™y-’MaȪڞHc7m)mÙ,íÞ"W Åô˜,Eyö"#sÉåeÚ™KЭÛX‡f6ëe·{~0"ÉÓ9%Ùì—49 ‹ùÔM‘ääŒz–ø™Š,˜ýØ[Zc…$K—EšJIé™W½yj1=¬ÕFwh_6ÎÒà r‘Eôªe3Q^½$•£â|žÓDDŠsùù"gT9ªqš2*0ÙI*ލ )gsÓ%ÕdÊÞÒŠ”Œ©¬[õáJˆÃqU½ìʦçä«rM"çÓÄs¼êãÙÿb!SºÏóA)S(²#"4T,Ê5Î ßÒ3±^]O3+ZšÐJÂ`e–XUÁGg"S½e]“ËfʼD®q”t3)M†¦fs4N –X ¨!)“fEµµ´÷EQ4‡Î‘QCA»ì©^šR™¤šNU§“r±aUælËž"×8¨`hÝw¹iÙÙC¡˜+geb,InB‹‹„!ÃÔÍ\‚Qö–V´dÔBï™$îäét¥0’f¦ëÍNÔú#­ÓTXuìÊže]S½wvvî]t»Ž¦ò4Ó½0¾ ÷ô˜Ä;3BéÊPœã†ôQ<*e 1 “ñ¸Tò3OüÄØ‹xv™¥³µ´pÃ@Æ’;É\cÄo—F_Î&Zn,¥RN>:©×†C¨X6ð(ÍÝOx“õ’èYl9ø¾à:è®ô?µL«_‘ó5lá6]ð€(°&Aw%Íß\‘ß‘à[ r|Kuëäèº7má`eš¼.°:à[Ð] À·ü?zKª2˜ûD¾IEND®B`‚uima-as-2.3.1/uima-as-docbooks/src/docbook/images/uima_async_scaleout/async.overview/wrapAE.png000066400000000000000000000405741160020716200325650ustar00rootroot00000000000000‰PNG  IHDR&¼@tIME×iqÄ pHYsttk$³ÖAIDATxÚíÝŒWaïñY’à€ FXø¹y1½¶›Ä+a0¨i,…»±ìÖÐÆ}n㉤Ú}ÇŠÛÀ]üZ9"¨ÖKýv­‘cŒÖzqª¼:•ŸÖœÝ‚ì]œ¦*#9Âq¾d+pýêbÑg+ˆ}gþÿŸ93wæÌÜ{¿"sw÷Þ™sÏ{~sΜ™X\\Ô(ß›ª. _9Eˆ€"D@" ‘P„È(Bä!rŠ9Eˆ€"D@" ‘P„È(rcÕèU@G¸=Xåèå¡—“Í¥K—ª.€Ì–/_^u £—P„È(Bä!rŠ9Eˆ€"D@" ‘P„È(Bä!rŠ9Eˆ€"D@" ‘P„È(Bä!rŠ9Eˆ€"7V]%ºzõêÙ³gÍǯ¿þºóØë7~ã7–/_îü¸aƪKžEä=âÔ©S—.]úáxúôéëׯ¿öÚk ¹—&BèöÛoÖ¯_¿råJKƒƒƒK—.­ú]¢» ,..V]†î000 þ_éª èĦxÚ–.+nÑÖ®°¿ã­Ú{o‹^ÚËÿª]¼j=>wQ»øzôÓDäˆàñ³Þ`fRW0»q4w•#rd9¨œÈ•çŸþ»ßýîw¾ó@ÆÜ|“v÷*=]~}™v÷jý7âGñËÜ®½¡½xApfAûñeýß3ÿ¢]ùßs̺ÇPóá8"§&ˆYDªb&ÍsÏ=ç=#º,"T~s•Ö¼SOÑ›Q@DŽ?ß:¯½ø#_gH´é###÷ß=³‡È© "G‘ÅÂI#bfëô˜ýg¸¬BíËzðˆø9vÆѸoÞ¼ù ª è"rj‚È‘Eä@Ȥ¹ö»ïÕÿ­­ùóÚsÿìËž•+Wþöoÿö'>ñ‰:ò!rj‚È‘Eä lGŽùÊW¾â$ÍÍ7¹IÓÉQÅÂÙ#"Gtz|ðÁ '¼95AäÈ"rP’ëׯ?ýôÓ_úÒ—œ­KdÌ貤 dÏÒ¥·|ò“ÛDðxÏR†È© "G‘ƒÂ]½zUtk>lnWeÚç>ª'Í;ÞZuÉ 5û’ö×'ô…%K–<ôÐC<òˆâà!rj‚È‘Eä X"i&&þç¥KÿW<¾{µ¶ë#µ>TÓ¹3 Ú_ŸÔž~A,‚gÛ¶m"x” µ95AäÈ"rP”S§N=öØcæ1›æÚç>¦ÿÛ'Ú—õÏ_Ћ©#²GÁz‰œš rd9èœØ~ÆÇÇgffÄãµ+´/þ6üžªËT…sµíÏê{4crÁ¾}ûÖ¯__ꉜš rd9èБ#G{l÷Õ«¯¯¸EïÙ|êÞª Tµcgôà1'ìܹS„ñ’%KJZ‘SDŽ,"¹‰ÍF4©'OžºGûâï÷ÚÜ®½¡=úwÚ—¿­?ÑÝ)é$"§&ˆYDò9uêÔC=tõêU3"lDä `ö%íŸÖ»;¢—311±uëÖÂWAäÔ·hJtøðaÑ€Š¼¹{µö»È›hÃïÑ~ðymëõS”Dwð±Ç«ºD( ½Yôr•h:<(|ê^}¦@WŸ×©Æ_ÐÇÙ„‘‘‘}ûö8…š^NM9²ˆÈ{ë>ø yðF„ÍŸn¬º@Ýcö%í§ôKVNOO•:DNM0°ÌÉ›w¼U›ÙIÞd3ü}²±L;{öìæÍ›¯^½Úù2QDP°ññq3oæ>ݧ§Ýthí mî3nꈯºD( ‘içÎG޹ù&mæmÝʪKÓµDÞ8©#ºŒ¤NÏ r€Â}zÏž=âÁߎ1žV ‘73;õÓfE>|¸êâ ÌX“ÅŒ5$¸zõê}÷Ý·°°ð§õ)j*oÓ&=?NýmtYÆE\ÖFþ\›-¤4ÖÿkÁoðØmóý,ÑcÇŽå¾3Öj‚^P€Ï~ö³"ošw¨Îíe_ÞGÏU]E»ö߇­y€L`ëvDЩ™™™ééé·hûßT¯zþlð7³§µvÕR¸'6ë÷w¸téÒäädçKC…ˆ #bïÛ<¸-šE‘:J]Öö~#ôË—´ý/W])%0»O?ý´yŸ!t©«.ÐÝ&&&ÄÞ÷Ý«+¸~Zûœ{¦õamÒŽŸÉ³ÚÄù;ü mfƒê÷’jÝJý¤Ú¿:q}Ïž=GŽ©º8ȉ^N¥N=¾<äñSU—Ê_ÄgŸ](- Ï>~÷‘¿¬6æUÔüQk?qÚ}¼¶©µœ¾¡º\uÕ”`×°¶béÀÉ“'OªíDN5¬¬ÙüTøOOm®K+króW«.F‰Ýíëׯoý`g}¾¬½d?~¶q™¶éÃî{o°âíOîÓ§œ=óÌ3U—99êé-yTÖøèÁSmìœz<µ0OÙVÅý=}þ³Öдæ û‹Ùg´ùJk¦$Ý£_ûùçŸçt….Eä(&òÆÛ’?<}Éïô‡œ?>µùƒZÈéäÉ“ kWè“©Ô;î™8Ð2ÃæNÏØšxB/N"á÷èS6¦§§«. ò rTZxö'o†¾xZ$ÌãÁô+?þÜ¥KÓ[?Í=z¨lˆvìØ1­¢.NàtœMödïØÚdNì2+ü¹çž«º ȃÈQèÔ¡GçÌG"ožûxüèÿ†ÇÎÎSûèèÔ•yûþu¬úÐ?x~ø°Ö´zÇÖzuèSÞ|“~¹ON íFDŽ2 Ïî³{8ïüxÊÑæ•ßiõtæ¾úíèÌ Ív‹9ôœ÷åül Þ™K¶ûcs®,ßZ³ùB_1BË’-d.Ò ÏP`i †Æ2ý:`ª]ÖŽ¾äþ4ÕôüÉ?¶Ö““DÞܽJð /T]dF䨲ðí¯:]œQ‰³6i·¸‘s""­¼÷w¬ øA;kDŽvXÈd§¾ù”õV&#“Ã]úSߌȜN5=ÌöN}/Çw:ÎG‚£j¦ÆZߨZïM"I/þ£—ÓˆÕòt&lÎñ ‡ÿKôˆ“Qk)°½µDŽvVÈdNâÄ¿••»ÌQ ÚÙ ¦O%»ØíSѧã-Óvõú$ÕíFA¸’tqŽI Îé ¯ûY %…ÔgÙ=šö=Ðü ïhP3`éÒ¥æØšJÞ‰ÞÓqÂôt<ý¡ã/W3¹®<_¯ºÈ…ÈQÄØù6vÿ ƒøuw5•+¡îŒê‰Èÿ¶/+[óŸŽÓL|²q‚ŽÓ%Êt;ƒzÞ¼ÀëÚúæ½¥Ñ]ˆU6ü—‡µ§ôa!ýÆÇea;CǼãS«Fr™…,n@n+Wêë Ÿ2¾ÓqDŠ|AËpƒÌoh‡šÚ¨úùuå0»8fꣻp,G=s ’N³[¸.œÃñAœ)µÈ¦ÌBJ,[™%K–hF/G™ý]°¿—&\4Ž£ÑËéFDŽ:NæÈœ”âžÚâ9TþîÛí ÆßŒ~½SµÈ¨ÌB¦.[õëõ™ÈÿtAÕú^ÎÒ§‰ÒK“fÆÁÁÁN刅6Œ:'+&Ÿï½â´w¦±;¡9ò¤Ï 1…ON“Wf!=ËŽ»\‚ª[‰nØ î˜Wu&Ê|gtöÌ•¾u^ÿ÷ž{”ßú#rTrÏÑâ.¸ ÚÃÓ¾ä=Wû|t½ïÅú뜗š8™OŸ)³î²C ,?nŠvQVÚ—•Œ­]Ööz¦Ÿ B[<(ûŸ÷*Ÿ“ÿ µË/lÙ®½¡½ht.‰œnDä¨å=Ý_ç\¦Ùæ½zØÃÓá+²lxܹ™ŽïÅž×=<]È¡ugË^|·¡ÌBz—¬¾Ø¨.‡ÙÑ9v¦ô&D\ä&ž÷*ŸÚKÚ‰î¿È‘:ƒƒƒLèFDŽr¾«¾ÄÒ¯çÝjnxü’§Ñ ŠŠ©œåt±,Y®NPf!Ų“미:H622"þ=øíÒWä;'æ"7qšþã=0‰À¬ðûï¿¿ê‚ "§ƽ?/E·Êæe'ûÆu7C/6®×Y`[ê‘e›&Vf!Íú W_Ì­VK""gåÊ•ç.jóçË\ÿtœð¥£Søï Óí“.¾.º•K–,ÙºukÕeA‹‹‹U—¡; h\¼~ûöíÛ³gÏýë´éíe­bþÿhCž9s“.: ³„Ö§C§…^ÖFþÜ»«ó© 9«ýÙ´¶yóæƒfz¡9£šæ®rôr€üľ¶Øã>vF;SÚµo¼×ñL¾ÈMœÀtºwÁ•ÿÐþú¤¾ç÷È#T]äDäù‰}ç‡zH<Øþ¿ËYÿtœV¾QüwÐéÞIŸÿºvñêâÈÈgät/.xtd÷îÝÓÓÓ/þèÒÓ/h=k7p:Φ¼—æÔï ã9 tôœ–p3tý~9\é ¤q9Ñüò·–,y³¨ðâ—UèåY²dÉ_üÅ_ˆ6­üÉ:N¾Q5Sà:Ý8‰@Tïµ7EŸòöÛo¯º,ÈÈ:µyóæõë×_|]ûãÃE.6p:NÎQ5S`l­Û®Dð—³úEn–/_Þjµ:_*Dä8|ø°hÑÿZaËôŽÓÁ¨šiô#¾»hÑÅ<ÈéŸÝŽIÒ²˜$d§NÝñ`î3ZóŽªKÓ+Ú—µ÷íÑG,wïÞ½sçÎÜËa’tMÐËбaÃóÈöæ%Ιî+"o†žÔófdd¤“¼A}9@aD³¸uëVÑD}Ôé”^Oê©388¸oß¾ª‹ƒb9@‘Dãxß}÷‘:2+ÐÌ›ééiáô "(ØáÇÔyñGU—¦ éãiF`¯\¹RT&yÓKˆ `K–, å† ÌÔ9òÏU¨«ÌŸ×ç ˜ysìØ1ñoÕ%B‘ˆ x"uŽ9²uëÖkoh8¥=úwU¨K|ùÛÚÈ>}TMöÉ“'É›ÞC䥩³oß>óÂuBoI/¾^u™jLÄÌÖ¶?«ß~íÁäøM¯â¼Yœ—ƒ|fffvîÜyõêÕw¼Uûâï¶ðâô¾`û²žÓ{öì‘Sø*8/§&ˆYDr›H“'OŠÇ[?¨ø#MÄѧùü×õëÙƒƒƒ,éjDNM9²ˆtH´§bþúõë"ožØ¬}êÞª TµÙ—ô£\ç.êE$‹^NIë"rj‚È‘Eä s¯¼òÊg?ûÙS§N‰ÇëVj_üƒ>½4Žˆ6³ÆýD·fß¾}ëׯ/uDNM9²ˆefff÷îÝ ú™¢[?¨÷x˪.“*_×öÎêw¾¹öÆâÒ¥K[­Ö¶mÛ¬—È© "G‘ƒ]¿~ýàÁƒ_úÒ—®^½*~¼¶ë#ÚÝ««.V™Ú—õÃ6GþY?~#ˆ¤y£lZ‘SDŽ,"…›“H#GŽ˜ÁÓ¼Cû“züô˜¤íýíØëÇ‘‘‘ññqÅ7“&rj‚È‘Eä $"o¾ò•¯>|ØÜºVÜ¢§ÎìúÃz&ÂÆIš¥K—аyä‘GÌv¿DNM9²ˆ¨!"瘡»²GÌÓ/hÏ}Çšô¬I3b«ºtDN]9²ˆ(vöìÙçž{îùçŸ7ç¶ivö|è}¢A&¹]{C{ñ‚6ÿ²ö÷ßwïÔP«¤q95AäÈ"rP‘=‡ž™™ñn~"~šwj¿¹J?¿çîUÚÍ7)*Œˆñß?]ÐÃÆ{C z&ƒÈ© "G‘ƒÊ:uêÃw¾óëׯ{ÿ$hí ½÷óëËôæj_Öÿ»òz´|ÿ_ôÇá›Îmذa½¡žIã rj‚È‘Eä VÎNŸ>ýÃþмœA$B7ߨ­XªÝùŸ’–öã×Úÿf=¾òÿ’îg*ÒåÝï~÷ûßÿþ|àe_2 @DNM9²ˆÔ™Ø2_yå‘@ "„4£KÔá2—.]ºÒpÏ=÷ˆV»¤kn*@äÔ‘#‹ÈA7 ôÚk¯™ÅÖk¦Q˜™+æã®Ž–8DNM9²ˆ {95Á]AŠ9Eˆ€"D@" ‘P„È(Bä!rŠ9Eˆ€"D@" ÈUÐ]Y¸òŽ•ï¨ºu$jæ»G¾k>Uôþ­ï¯ºD@~DjáÙŸý½}¿÷kƒ¿VuAjçg¯ýìäÄIóñê «‰t5ÖP½Ìüà§gê4¬z·h“Å-Úʳÿ¾ý"ră'wÐÑA¸E[MÐËAÅÌ.Žù˜ŽÐÛˆTÌ3ÞøÐ{X“e¬¡X ­ñaíÃÞß´µö7´oT].ô&š»Ê1c UZ/þç'Bh™¶ì²v¹ê¢ÕÅ­Ú­Õ>j>þ©öÓ¯i_«ºD@~ôrP™3ÇÎØ| üûu÷¯Û>½½êÒÕÅùùóO=i>¾³yç§ç>]u‰€ü8–ƒÊ|ýó_ü½ˆ¢…3 U—@ñˆT#9WâÒ@Wc` ÕØó¾=É]™ÝßÛ½rÝʪ‹  HôrP™¡3::@ï!rP™8áˆÐ{ˆ¨&Ÿ%tt€Ãy9PM>HÌpêó#:L’F/!r Ôë_ïï¾Wü'ÿüª‹  0D”ºeÅ-{ücU—@58–P„órŠ0°†Š]n_~áéÌÇËËîy螪K ,D*&"Ç™ÃvgóN"èa¥Ë™0ŒjWý>ó•ÿP‡oéÖÚ€N1} š‘–CGó¾ÜÊšUc³á¿ÍŽ­"y íüüùmÛÌÿ¾0ô…ª‹t„µ(óãC“¹_,â&2jôä9:uaf´Qõ»­Ø²Æ²~î£Î㪋 DôrŠÌ›ÖÜbÀ\Ëý«;ãóU—¹b"f>öøÇÌÿ8S®È‘ÞÒ7ÁލëPÉ Bäi~Ü᩠͛"`&šÁç4'į/L Û?Oõ}è |æqÕèî÷äPiÉÓáuÊÀ yÁKdïЛ­oÉWpOŽH¼Ðó숾Pï––¦Ø-± @GeÈPu]×ÈU¥’^ŽÓGµö«‚}ÖȆàô7û礮³`é¿›KµäX;1r;€óûíý ÖœÄšÆèg{ž<î[~öbÇÔUÚЉ²%¹Ü¾üµÇ¿fþ眠ƒ‚GzÃ-£¯Y:ÝÉKQõÀšÑ¨û¬FKŸôñé-ï¿ñŠj»·óÇ­ OíhJ½¢1ºËÞd™“Ÿ¡ÉÆÐI¡õSÜŠÌórÌÿ^<übqE„o¤×l2Ã;CÑ_ë99Ä8‘Æ yiªœÉ¡ø¹]ñ[þ‰˜ùd"wªûÄÛ¯žµ ®iȾ¨¹©ÐÌI™+'ê§ ÆDيЉö¡½öEo4ÃM¦‡h=Ô™ÛÞê-Dd»©C褪º—cðöX=û ³GO´ÃOžÓ7ÏA‘»Æ~Kxü7ñÛjhŸ³GÕ6¥>׳:'sξږYt mì–…+¨ÆDÙŠ Ë}^NÆ‘^±í;Ÿ_à«Wô5ƒäÒï®Ar•GŽ7ÞÝ»Ï0{®û"φ  Ì>D•ÛÉ©Šó-ÑSÀÿ5Ñ+È®ÔÙ±ýVPÑ+2ÏË1ÿ»ûÁ»+®ÆÞáŒôÊï¹C½Ñ»{¥“Aò]8H.£âȉüH·X™½ëßš‹UµC§¢ÌqÞÑÚF–§7ÖÊÏ&JdK†§D;bVPá+⼜R¸;AYúÝN·[Qæ0HW†ž$¯6r†·lld~QÌ7Èi¼;¢êDlÏ,š3×!'âk´±fÐ|ÐQ)[:“o¤×ýeÜä¨$+A’W>°–Y\7Âiè:û®ää¬=¯ ûSIœëΨv¤lE}ïŽæšÿ}zîÓ’¯Ê;ÒënÈŠv$ëÚArÝ9± £êl홾'î q¶ñ¸ eß’VÄy9¥êpË*ƒäºw\FENQcTù¸{‡>7qòŒ0F‘::}hAåŠ8/§Tµîj2H¡ÇÉ»/râ¶gÿ»¢Ý:Ïáý‘CŸúÔß‘8wîlj£lT±ÚáK”.סó¼$OÒ£ƒäÝ91½ˆö‰£Ö>†çOÙxÜס¹Ã™Üu¼ÍØ¥0?\#x<îZ»üÝÚÅÎ7®§lEÈ/ßy9yÉ8»ê•È1H®@EǬº0r"{žs·¢úê‘Ç¿Ü×ÃsBXÄÔBw„Ú žUîÉf±ãOòÅv'–Ç^µ!xe»JVórJáNwÎrì·ø¡Þ\$׺r\F7FNð zz7}î–»·h C' E¯(ãÉ Þ³Í·Õ ^‘Iך‹ú,sÛs.š¾æ@èUdgœ7“•­(çå”#u¤7¬À¡^) ’GèõAò®Œu÷ò{™žöÑ?bi4§­9ï¥`½/[;ìô¾ .ù‹,¬õ÷¨Eç*¶§žu×êïS)[ÔKé ñ\È2Ðn–6@Í y’§÷¨ò‹»U…Ó(Çôè"ÿî4s­¹è»XÄucbÅxzj S–úÖ%Eܦ$O±Ónðy7e+‚r¾O)ñCñnáOÛýkò–xeÜæÿŠ„•\†,U—T!òßcéb§ßxËy†g™ÊVÔ¡®Œœ@mÉlNþMÄy~ÂöèoSóÕxr6†ÇØ (vÄËdjHÙŠÂþí¿}õs_5ÿ;õ¿Nå©gÄJßy >#j;Œm@LsûûÐú‚˽êB#ñÎYlßßê!æ‚È宨C¥FN¡‘Ó3¬÷Õ¿7|yîåOjŸ4ÿ{²ùdÕÅéAºÜ±_®¤e¸° –wñ2JìþP)Yn¨»è\Å–©¢àê”­¨#]{,§g˜W‚Z”¹º<‡¾‰I´,Á‹º–?û"wz£%8a;a<â QN’·¯“OlãÈmèàl®b‹Ï,uì:øbe+ê‘ÔZîûåøX{6‘m’µ›Ò°KÀÊß¾L‹šå½”—³ÌØ…–S©ª“$×s';yо]«‘Ÿ–²u`@,³Ø%–e~Üšµ[tê¢Z—Û—K«-k,ëóyÒ¯_|ý[_þ–÷7ÿþã÷ÖÏo=ø[Þ¿®¾{õ{†ßSu©3êÕï²õ¾Òî#Úßn¬ºèwæy9U—¢.nYqË÷ÿþû g"ÿj^Îû›ÝßÛ]u‘aÓ;U¢îXê壟û¨ä3×Ý¿n底U—È {"ÇŒ.~l¨ù ‘' &XCÅ8–&²äÀæÉÏ¡‹ƒnDä bÞãw6ï$r4;NâŽè˜èâ uÏÀÐO’¥»»8 ’÷1"¨£äP¡‹ƒ.ÅÀ*fÞ/Çy\uqj$îˆNwwqÐߺçTP ÿìyßžðÝßÛMä K1°ÔWx.º‘ÔW8`8Šƒ®Æ±TŒór’yèÐÅA·#rP1ÎËIæ=G‡.ºk@Ý™IC=€ÈêÎ º8èL’FÅ8–#CÔ'-¡9EX(Bä!rŠ9Eˆ¸ÚíöÐÐÐ@/zó›ß¼sçNê§ÔúR1c ³=ÿV]²ÜvÛm ¹_Nýã‚7Ð9íé­·¾ïÞ{wÝpÃMU—¨¿øÅ¥o~ósâ_ñxõêÕÔOIõHb` ½ßž¾å-·Šßô¦œ[;õ…¬ßõ|{ú¶·­y×»>Dý”T?@&DN_ë‡öô¶Û¶ Ü@ý”Q?@VDNÿê›ö4çKê(‘Ó§hO©òê±Áõ£+W®Üu×]×®]ò“ï9²µê¬Ãö”úJB/§Dý”T?@&DN_ë‡öô¶Û¶ Ü@ý”Q?@VDNÿê›ö4çKê(‘Ó§hO©òê±Áõ£+W®Üu×]×®]ò“ï9²µê¬Ãö”úJB/§?t" ‘P„È(Bä!rŠ9Eˆ€"DJæ?÷Ç6>ŸwyÞ3QŠ9¥èÆ3ßÃ…ãôt1"e±ËUc³œÊÜ [Ëš þavl•§%ö´õisç%ŒZ™ù»p1­%J¿es9á™o·ÃDªAä  zcÝ’ûé­°Lã)±<½%ÎÐ]Bw©aX`z?E›äåH-¨"…í¥Lcngr›.ÚqÉåMzµ‚f,§HǤå‰Ò¥Ä–»˜ãÒo¨…E[àGôƒ SÞmaxêBÑ‹4µæOškŸ¿îˆú—µÆ¤…YÂðÓ¢Ÿœá §>5öýòùepò…Èék…GN°9LZdà¹rùÊKdÛµÈbK±ZÙ,‰~^pqï7*wˆÔ‘]Ñ‘ão0Ó—ç_DóšeR=‰‚KZg\DD<;ê©éψ+‘ƒ:sò…c9(ÎüqÏ!ˆÖÜÌh#åÑžvsroðx¸oÃSØœˆæ*±„~ÃS;šI%Üä-àÙWƒËjÚë+ÞDÒÂEº‘ƒÂxÛó”Æ×ÑÝå6óGO´ã¨µv¥æCsGJ\x ý†·lL.bcmbùÚç<“Z›R‹ç+Ð ˆÅƒk’/ó6óçÚž¿´_=ëþ Ñ‹emÜ’Ô¦^B¿ÔÄÑkµøEùVæý¦eP7D ⠈ᵠÙ×ùbÂ;ØÔ>qt6ë3§ðȇXaÅKÉX nn¬ºèIúy™cy^§ïù7"þÐas® „Å’}¿F¿Iþ # bôrP߈Êèº*»„5x¿@w!rŠ9Eˆ”!ù$ÆžSQrÍÆòƒ/»„Åböú‘ƒ‚øZÌ„y]ù±ÀrKXÍû•ŽX ˆ$ùœE ôM¬.½„ÅÊU<æ »9(Н1y|^òeÖ}Ò"nþâ»>ŒÜ“[àÂKX¬ï×wö(PDŠâ?-1írd¶ùýæ-fü·ö4ùÛàôú¯Q¦¢„ÅÊú~It"…ñ_ò+å>d¦ùqßÍÈ‚×QóµÁ³cû—×>´=íiÅ—°X÷»=9tEº‘ƒ®«™r7ÍÐÝ/Ã×ó/0ay²wä,¼„eV ÈÄØN•ì­CZ!rP¤ÐõE›5%Ì`“y±þàåRB_˜ô}¥ /a¹hŒæJU4 K„o¡ƒþq¡ã®DÝ,ý¶5rË鸔nöœsa¾Iœê#÷|ùâ OMµ’KÔ¹‰.r‹6” 9‘±MmeÒÍÒ£3²©Óš’zbÑ%,˜lñô{Ì­QU( DÊ MÉΉ¾«/ssΙÔVXßÉŸØèýMÒ嘋.aÁôâ%¿aQ¬Ò‡ù€¢9(‹‹ñíº5¬$ßlê­pôâÌEe…¢KX°¸7l ‘7èFÎ(ÛÀÀ€fŒµU]$ ?ßÌ5:@=8ùB/=Å{ù 7þ ‘ƒú²®4“~¾¦Ãw:~áwÐ!"õe]èÒ8sF&yü¼)û´M™9¨1ÿu8÷¦]ÿÅw>(‰Ô‘ƒó_‡3êL|Sø|üá©ͪK ˆk¨·\×cªP+ÌXC—È|¡ò¨/"µ—~&¾Í8I’¼j‹ÈAW0ÏÄM늖ʯK ŽåÊű€jD@" ‘P„È(Bä!rŠ9Eˆ€"D@" ‘P„È(Bä!rŠ9Eˆ€"D@" ‘P„È(Bä!rŠ9EnT¶¦ªßlX\\¬ºPz9}k~| ÑÈ¡vµl1 2>/ÿnJ(´ü’3¸„"ûöçÇýïCÅ»ón“éïÅóì„BÙå®Ó¦ÝÏÔõrLë׬ú-×ÔéÓÛª.‚ßìØª±ÖÜâD³ê’ QûÐÞIëáìÑíÑÑFÇ Y56«i­¹‰ ßVê{™?>™¼û}„­oÚÚðÔ…™Žë YÑËéwâ‹·a®eüur¨º=ÂÆèŒQ2/QûÄQ½YmµôOlvlÿ|IëQþq虓ðç”Ä] ;oÄ~SÔ¶­ýåˆDjN\˜Ö¤|ñQ1+q†×îØd´¤“Çç«.Rdž[-}ÛKÚô¬®Ýððpô_G†Œ@2v¨‚!ÙœprGÄŽòaÐ>Gä Fct—ù­$sjÌNœ-M+sövÿžûÚM[’3ÇîÚmÙõÇCÛþMâÈ™³O59Dè¨Dä Vc­ÙÏ9×6¶ÄêßPïq^ß76x°60r‘r Úw¨>þ¹þ•¤µÁ"%=?Û’“øfgøjÁþKÌÒ­"È ùÌï³G´¢›$öü³F‚k1þjHMyËéû8²|Žy>ˆÆÆÄ̱gÓÆ„:™:|¤¦1zÀ èv"i†×6ü¿8>>0䎣·65­GzC<^«˜{Ú»ëý-·†ç[»ÚŠðJô–qü¸ì³­–4¢¹Ë¶ä$¢‚¼5¨+âêÀ"i¬ ³Ÿœ’9F“ï+Wîã™?Ç,„±‚¤Ìq§™^'ùßJAä Vû\ÔtmrrÒt07g}ïçò­u&!¸-K3þƒÝRE¶$f‰ì1zÏJŒuèe /Ï.’wŠ„3œâoi³-9™ù’Àr<«LÊœ fÄ“í̉šD0?n5ùÁ‚ÍŽmwªÂ8ÌaU‘ýÄèùY>Ç,„-!s§ýêYù ´;òdŽ:DbØso#¾¼ž1‹f³é{²hSÙûŦ™çòÌütrÍs“þ3}®ØÌIL{?ipDŠ•¬4þÿì«m™§£sD¢¸SL#Z¿pY­@ԓóbÚ*‰Ä±šØ©§4'ÂÑàŒèï/ÏjòÝ"eZrºp5BÆjNC‡úÓëÀSçvKî[YLæÄ}@NArìæK~Ž™>ˆˆ²ÿ˜’8f'GšÕÍ2DN¿33„XƒL¾}bGhÒiÐ"›Ð†È©U£j C&¡–#y|ÅÚ¹µ'FdZrº¨÷`·íÖî´ý£¯=uBD*qbêÜ 7_íZûþá%wr¶Ôç˜éƒˆ¬3æ$'jÈA4cØ=ÛÙÙ¡y–P«q˜[bÿ>iÈÄ >9:PHµ Ó’sWƒÁn\#2'9¸ƒ•ûä¨4˺ï/IæsÌôAD¿ß;IIœ¬WÌñJ”†Èéw1WÈ”6rß[Ï®l¨­Ê2¢Ô‚mahÀÑ>Ã&j*ÄN{"³—=1,<\•†y”ý9†2Ç|ßIudíßHœ±³XòÐ:Gä srƒOÞ/0ˆ_Zâ¯uÒA®v(ÜÑð·×žs:ÓfÏvHš=~Õ éÏ1çÈ+q’êȪ“;ÙÚY*<‹‹ÈAaâZ´¨N¯-1[ª´ýûLû¯™f¿fÛ3Î[ _îz2'[âMG÷³§9Ûo?a¸©Ã D§~ŽNCö-_"q$OˆµßûÞ SÒQ"Kž÷}ª‰Ý–ˆöÙj©Ò¾÷Iû¯¡k<Ú¬TS—iÉ颢Ë óà¸}„yëE–ÉÑ B{ÔÎ9´ßðwºŸŸö9fú –/>©Äqk5<÷Ú¹ò‚uóº8$ŽRD 7éWKØ“´^3y|\.qNtô\¾?øäèKŽwí3-9U¸±s¯úåïÈÙíéØÐ˜ü4¬ØÝQoߊѸ(z¦u&iŸc¦"~ù³G÷ï—J÷J6³c«ü§™ÚE1€YǼR/ŒƒB9(‚s0|l•·ùH<½Çn«&%Ç=KF´n[wWûÉ"y åi´3-9¯±s®; ™NÇI«0{²´9îäV†}A‚@ze„s„7å»ï€füsý+I;Þ,RÒó³-9‰ï¸¯ì¿Ä,]jj@93ÇNœMßøþ1;qDgy“’Ý–´-3j>B¨ú}÷ñù6ØÏ(e“‹Û²í߇–k•&f1IÅ‘ùÎÆ¾œMÈAšáµ ÿ/Ž ¹#ú­MM둾M¯2ÚW`‚ÝuŠk±´v%ŒÑ‡W29$Öp\öÙæó£¾sÙ–œDT·†µ`5Ãquàm±UKÌ'qšI‹°>C»üŠ2DZe íPÄ(ãÃZʉˆOo~õ¶Ø·èkh›œUÍÚÙWý•Ò>g¾,X[ö÷ÂSóßµ´š‰$Þ£¹Øá© å*#rËþLNNº“ææ¬­wÞÙ¦=G}Iî7¡?¾ñÍ –èÐHh%Æ:ô2…—gÉ;EÂ:Dœ‘mÉÉÌ—–ãYeRæZlÕ2'W⸙“{Aá-s~<¼¸ŸˆøHÂ-ôìØ˜g)öö¢7çz[ì|ªÖ’›\t5»S3œ³æ_=k,ÒÙõ“ý®%ÕL”òóF#rËžèÑú O°7Èf³é{²Ø¬=3ÌšÎ÷ÍùfÆfNzâX=ý‹æ®D¬ÃnA"Ë/žìýúèóàæÌ™TÛÝÆ"Ó’Óù«ÁYŽÝî6wX•[»ªš‹›99'­SW0ÿ–énÔ™êhhÁçÛýró÷î§Ú=0åwβÉ5Ö ^ë$K¨²<ÇÆ|k‘ø®ÅÖLDÕ)ÉÈA4±euÛ#Z¿pYߊ¨'‡g!ÄdŽDâXíÙÔŽÀSšáh°¨BOÖœ&ß-R¦%§ WC dì‘•`ã^¥‹É©Äqš\ßûÏ9ÆpT¦³@[fÂ4{«ÍÜ ¬Cšáß[‹pR+Ë&þ˜5<<5Õò-4œ8Y¾kq5¤*o4"ÆpˆÕo`Ä×upMÃÿ ç[Ù …†ó#ç1IŒªYã Q_»Yzrh'3Ó’ÓE½‡Àð½ý£¯qpZì '&sä'f3pò¶ô‰k¡-3²˜Æáñ¡IÙ…ØÑ’¶ðL›œý%ðD‹1Œ=¸f£±Á¹ýkxÛ^{ÆïšTÍœW•7‘ƒ8ÆÈo¶ 04ÏÀjµ#¾û÷ïžÁVëÉÑê48Ö>Ó’sWƒÁnJ"2'¹1Q'"s:Jœ˜€M—t*h–-30³+xÔ½(™69û[áT‰ùÛŽUYvÿ'æ‹!ý]Kg¼²)8àFäô»˜«dûNŸ“ù{®C™Sƒ¥’£+4b D Ë(.j0sì1ŸÄ’Ù‰5f·òêÏñŠšÙelò9ÒÇ®eó[av‘Œ’µ¥˜ÙduÜ/FæïšœÖ”ÑšOQ0"“Ûµò¶KKœ”k¦(¼bŠ÷à°U¾Ü ÙËHnXä§(̱'¹döŒ”«ØvkÀ™†èÛ±*÷S—Þä¼ÝëÓ7ûÙæ†a|¸áîeöïZú“õy£öé e~9(L\ ÕöùZ5kP!eÿÞú²EÎ1Š{²Ü!ëLKÎ] _îz2'[âÈŒöÙ'u|#¸|ï§#—8ÇC³výœIÅê®~ãŒôÍ…S&¼бL›œñ·;c~Eìd1—¤/Èü}D€dù®¥pN¡šÏä,‘ƒÎ9°’Nð Î&rǬÄIkmí°Qƒ3¡«MÚ²TiÉ颢Ënþ|àöõæ­½YÙÉÑÍ›ÕødÚßu—ïfN¶Ä‰í§:“Õ]ý&¡œQÀeÚä VwF|üæ°š]P'‹…¿y¾k²ìí±ÔÐ!rP€¸I¿ZÂé=θ¸\â$œUè¹V~ðÉÑ-\ðŠ#™–œ*ü•mÚ9ÖnÙdžÆ$Nz‰ªð¡ØËæìíèœR'söï—Oœä~ªý‰(; ¼`“§¼R£€YeÚä<¯˜=º7PÇÖïÍãúÑûj™¾kÒ5flTfè9(‚s0Ü ÄÓ{ìÌ™”L÷,™É!ÏyÎ)1O]•Ä)”§…Ì´ätÖR‚‹ W‚Ý~²ÊrÎDô•ØY¡óä=nagÎädjâȶtödiU™ãt;†‚7¤sgHg>Ξø³lrfÍik³îïïM¡IÛ9¾kòuæ,¼¬Ð!rP ÷T}ÏŒ%÷²Q7½ñ´·²ûeî=œ©¨ú÷Ì>.æÉþITÎI|ü™–œÌ¸OŒ1ZÜ9Nž:È8y¢1:cUxpZ®»ÂN”K:ö UúgèL–V4‰À9‘×[CCæqù¤Ët°Æ ›œÿñ'o9¾kÙ+­´É9¼ø±p¥”¾ç”Wÿ!ÖF7I:ápÒœû9¶”ù;I…HXo†«ñ÷„‹”ø–3-9©Àá%¯2Ãçòö’×ñvâÞ¡½äØ?«‘Ù*Â…•¨¹%† ³´à§zMìB⊿edØäâ*Ù.uB%È|×’j&¶ürŸR6Nû6àü rÒüUaͧŸ¹|$+¯þQSæ5•œø TÅÉ—•­’Ʊï³YÑ•£Å8–TÆžÉVÝ•£µÔõr˜SáZsðº½@5ÏÅ7=zœºé€þää ½€"D@" ‘P„È(Bä!rŠ9Eˆ€"ê®±ÆÍ dpõ=Œ^@ÕW’^Bäô»á© ‹æZÆ_'‡ªÛInŒÎE™hV]G Bä RsâÂÔ°þ`öè‰vÕ…Ð#ˆÄhŒî2z:d€¢9ˆÕXkösε͟­ãÑúñïÜßñûzÌ$„”#ì¾CõñÏõ¯$íxS°HIÏ϶ä$¾Ù¾Z°ÿ³ôòú+$CD?Wfà DÒ ¯møq||`hÒù©µ©i=Ò››Uc³¾ç&!Ø]§Éãókš?n,¶µk´¡Å ¯drH¬á¸ì³ÍçG5‡Ù–œDT·†µÐÜd'‹®ƒýF†·llh%ˆª 5ÿ\ë}Gn€ƒÈA¬ö¹Ù¨_ONNº“ææ¬†eÞinZsáIn#e5¸Qí­8ñM•Ø­ÄX‡^¦ðòì"y§HX‡¨‚ó"²-9™ù’Àr<«LÊ«JJœùñp…¸ÅóI–ÚsßwxüˆÄhÚ×ú O°û!ÍfÓ÷dÑâxf˜5'œFj¯ÝFÅfNzâX=½5wW"Öa5šÑåOžñôšôypÆógǶ»Íf¦%§óWƒ³œÙ±ýÆ›nî°*%¶’úyùÙyæ~|fñ.„‹“©ö<ï;¸a~D¢ˆ]\kD%¢õ ‡PûÄѸ'‡g!ÄdŽDâØ-æŽÀSšáh°¨BOÖœ&ß-R¦%§ WC d·‚X¶Šàœ³…§£gª=GY£è!DN¿33„XƒLbo=⬘Á5 ÿ/œÄ‰l*­ˆ gޝ½•U{õ¬Q¦¨vÍšé ÷dñô5ƒF‘¬¶7Ó’ÓE½;dξÚöþèk·žEY‰ãŒè ¥ÛÏT{®Ð†9ˆf ÊÏdß Í3°„ZíPIíß[‡–"Û5« =9:PHµ Ó’sWƒÁn§#2'9¸ aw¶4k@ÜIJLµd@äô»˜«dJ›˜yž½âPæ¨QªR0ºBŽVâDŽeW }-0Vh…×bƒ D:'7øäÝû(-q<³ç:ÍÕYcUþܵ'ËáðЖoq;Í ÿ\5kac«‚©SŸÚCÏ rP˜¸0ªí³–ÌöÖLœ´ý{+Øä†s¬'GŸûÒÑ’sWƒÁ—»žÌÉ–82£}vÆ%` f=£.[í9èœ3+éÏ@kjgŽhŸ­ÄIkmí£ÖQà±Öz²\«™iÉ颢Ë>Pã ·¯7oþYzr´D&XAïɸøë8óìÙ YjÈ€ÈAâ&ýj §÷X¯™<>.—8n¯ÀÞ­#âÉQE _K'Ó’S…ÏYiÚ9éØÎݱ!ãÏò‹N…Å^6'\ív²†Þe¸K”©öyDŠà [åm‰Oï±3gR2qÜñÉ!Ï®ºhCWpñ>9P$O¡<iÉé|ÇEÜÅ„+ÁŽC–CYÑö…BÝ=ìwè?és‡óš@ÄVˆTíÒˆÃ=Uß~ë¹NÔMo<í­ìQs÷ž Îü]½žšj%<Ù[¤÷2.3‘çàË,9Y«Õ .F‹;ÇÉS'O4FgœC0þ¹Ìî ƒøÝ×DÖHôE djåL? üX¸ªßhw(¯þC¬¶'n’t» JšÈtaÊ?y-eÒSR!Vç›jeü=aAÁ"%¾åLKN*pxAÉ«Ìð9¤¼½ôZÏR#2Ï•Ù0ÐßœömÀùAìÀ˜¿*©15—dåÕ?jʼ|&Ýô4'_nT¶JS Ä:ÌÏÕÉÐ'8–TÆžÉVÒ•£ÚQ×Ë` L…kÍEM®z½@5ÏÅ7zœºé€þää ½€"D@" ‘P„È(Bä!rŠ9Eˆ€"Ák¬q‹@Ièåà¢j5þ?Y*‡1öq,IEND®B`‚uima-as-2.3.1/uima-as-docbooks/src/docbook/ref.async.api.xml000066400000000000000000000556771160020716200236160ustar00rootroot00000000000000 %uimaents; ]> Asynchronous Scaleout Application Interface
Asynchronous Client API Overview Async Client API The Asynchronous Client API provides Java applications the capability to connect to and make requests to UIMA-AS services. ProcessCas and CollectionProcessingComplete requests are supported. It provides four kinds of capabilities: sending requests, receiving replies, asynchronously (or synchronously) setting timeouts and limits on the number of simultaneous requests in process (via setting the CAS Pool size) using an optionally provided collection reader to obtain items to process deploying services as part of the startup process An application can use this API to prepare and send each CAS to a service one at a time, or alternately can use a UIMA collection reader to prepare the CASes to be delivered. The application normally provides a listener class to receive asynchronous replies. For individual CAS requests a synchronous sendAndReceive call is available. As an alternative for this synchronous call, instead of using this client API, the standard UIMA Analysis Engine APIs can be used with an analysis engine instantiated from a JMS Service Descriptor. See . As a convenience, the Asynchronous Client API can also be used to deploy (i.e., "start") services. Java services deployed by the API are instantiated in the same JVM. Logging for all UIMA components in the same JVM are merged; class names and thread IDs can be used to distinguish log entries from different services. All services in the JVM can be monitored by a single JMX console. Native C++ UIMA services can be called from the JVM via the JNI or optionally be launched as separate processes on the same machine. In either case logging and JMX monitoring for native services are integrated with the other UIMA components in the JVM.
The UimaAsynchronousEngine Interface An application developer's starting point for accessing UIMA-AS services is the UimaAsynchronousEngine Interface. For each service an application wants to use, it must instantiate a client object: UimaAsynchronousEngine uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); The following is a short introduction to some important methods on this class. void initialize(Map anApplicationContext): Initializes an asynchronous client. Using configuration provided in the given Map object, this method creates a connection to the UIMA-AS Service queue, creates a response queue, and retrieves the service metadata. This method blocks until a reply is received from the service or a timeout occurs. If a collection reader has been specified, its typesystem is merged with that from the service. The combined typesystem is used to create a Cas pool. On success the application is notified via the listener's initializationComplete() method, which is called prior to the original call unblocking. Asynchronous errors are delivered to the listener's entityProcessComplete() method. See for more about the ApplicationContext map. void addStatusCallbackListener(UimaASStatusCallbackListener aListener): Plugs in an application-specific listener. The application receives callbacks via methods in this listener class. More than one listener can be added. CAS getCAS(): Requests a new CAS instance from a CAS pool. This method blocks until a free instance of CAS is available in the CAS pool. Applications that use synchronous sendAndReceive() and getCAS() need to call CAS.reset() before reusing the CAS, or CAS.release() to return it to the CAS pool. Applications that use asynchronous sendCAS() and getCAS() must not call CAS.release() nor CAS.reset() unless sendCAS() throws an exception. If sendCAS() call is successful, the UIMA AS framework code releases each CAS automatically when a reply is received. The framework releases a CAS right after a callback listener entityProcessComplete() completes. void sendCAS(CAS aCAS): Sends a given CAS for analysis to the UIMA-AS Service. The application is notified of responses or timeouts via entityProcessComplete() method. void setCollectionReader(CollectionReader aCollectionReader): Plugs in an instantiated CollectionReader instance to use. This method must be called before initialize. void process(): Starts processing a collection using a collection reader. The method will block until the CollectionReader finishes processing the entire collection. Throws ResourceProcessException if a CollectionReader has not been provided or initialize has not been called. void collectionProcessingComplete(): Sends a Collection Processing Complete request to the UIMA-AS Analysis Service. This call is cascaded down to all delegates; however, if a particular delegate is scaled-out, only one of the instances of the delegate will get this call. The method blocks until all of the components that received this call have returned, or a timeout occurs. On success or failure, the application is notified via the statusCallbackListener's collectionProcessComplete() method. void sendAndReceiveCAS(CAS aCAS): Send a CAS, wait for response. On success aCAS contains the analysis results. Throws an exception on error. Note that this interface cannot be used to interface to a CAS Multiplier service, because it will block until the parent comes back, and any child CASes will be ignored. String aHandle deploy( String aDeploymentDescriptor, Map anApplicationContext): Deploys the UIMA-AS service specified by the given deployment descriptor in this JVM, and returns a handle for this service. The application context map must contain DD2SpringXsltFilePath and SaxonClasspath entries. This call blocks until the service is ready to process requests, or an exception occurs during deployment. If an exception occurs, the callback listener's void undeploy(String aHandle): Tells the specified service to terminate. The handle is the same handle that is returned by the corresponding deploy(...) method. void stop(): Stops the asynchronous client. Removes the Cas pool, drops the connection to the UIMA-AS service queue and stops listening on its response queue. Terminates and undeploys any services which have been started with this client. This is an asynchronous call, and can be called at any time. void stopProducingCases(): Send stop signals for all CASes that are currently in process (where the API is expecting responses). If a CAS is a parent of child CASes being produced by a CAS Multiplier, this operation will also signal the CAS Multiplier to stop producing new CASes. void stopProducingCases(String aCasReferenceId): send a stop request to a UIMA-AS Service for a particular CAS-id. If that CAS is a parent of child CASes being produced by a CAS Multiplier, this operation will also signal the CAS Multiplier to stop producing new CASes.
Application Context Map The application context map is used to pass initialization parameters. These parameters are itemized below. DD2SpringXsltFilePath: Required for deploying services. SaxonClasspath: Required for deploying services. ServerUri: Broker connector for service. Required for initialize. Endpoint: Service queue name. Required for initialize. Resource Manager: (Optional) a UIMA ResourceManager to use for the client. CasPoolSize: Size of Cas pool to create to send to specified service. Default = 1. CAS_INITIAL_HEAPSIZE: (Optional) the initial CAS heapsize, in 4-byte words. Default = 500,000. Application Name: optional name of the application using this API, for logging. Timeout: Process CAS timeout in ms. Default = no timeout. GetMetaTimeout: Initialize timeout in ms. Default = 60 seconds. CpcTimeout: Collection process complete timeout. Default = no timeout. SerializationStrategy:(Optional) xmi or binary serialization. Default = xmi
Status Callback Listener Asynchronous events are returned to applications via methods in classes registered to the Client API object with addStatusCallbackListener(). These classes must extend the class org.apache.uima.aae.client.UimaAsBaseCallbackListener. initializationComplete(EntityProcessStatus aStatus): The callback used to inform the application that the initialization request has completed. On success aStatus will be null; on failure use the UimaASProcessStatus class to get the details. entityProcessComplete(CAS aCas, EntityProcessStatus aStatus): The callback used to inform the application that a processCas request has completed. On success aCAS object will contain result of analysis; on failure the CAS will be in the same state as before it was sent to a service and aStatus will contain the cause of failure. When calling this method, the UIMA AS passes an object of type UimaASProcessStatus as a second argument. It extends EntityProcessStatus and provides getCasReferenceId() method to retrieve a unique id assigned to a CAS. To access this method the user code should implement the following if ( aStatus instanceof UimaASProcessStatus ) { casReferenceId = ((UimaASProcessStatus)aStatus).getCasReferenceId(); } collectionProcessComplete(EntityProcessStatus aStatus): The callback used to inform the application that the CPC request has completed. On success aStatus will be null; on failure use the UimaASProcessStatus class to get the details. onBeforeMessageSend(UimaASProcessStatus status): The callback used to inform the application that a CAS is about to be sent to a service. The status object has getCasReferenceId() method that returns a unique CAS id assigned by UIMA AS. This reference id may be used to associate arbirary information with a CAS, and is also returned in the callback listener as part of the status object.
Error Results Errors are delivered to the callback listeners as an EntityProcessStatus or UimaASProcessStatus object. These objects provide the methods: isException(): Indicates the error returned is in the form of exception messages. getExceptions(): Returns a List of exceptions.
Asynchronous Client API Usage Scenarios
Instantiating a Client API Object A client API object must be instantiated for each remote service an application will directly connect with, and a listener class registered in order to process asynchronous events: //create Asynchronous Client API uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); uimaAsEngine.addStatusCallbackListener(new MyStatusCallbackListener());
Calling an Existing Service The following code shows how to establish connection to an existing service: //create Map to pass server URI and Endpoint parameters Map<String,Object> appCtx = new HashMap<String,Object>(); // Add Broker URI on local machine appCtx.put(UimaAsynchronousEngine.ServerUri, "tcp://localhost:61616"); // Add Queue Name appCtx.put(UimaAsynchronousEngine.Endpoint, "RoomNumberAnnotatorQueue"); // Add the Cas Pool Size appCtx.put(UimaAsynchronousEngine.CasPoolSize, 2); //initialize uimaAsEngine.initialize(appCtx); Prepare a Cas and send it to the service: //get an empty CAS from the Cas pool CAS cas = uimaAsEngine.getCAS(); // Initialize it with input data cas.setDocumentText("Some text to pass to this service."); // Send Cas to service for processing uimaAsEngine.sendCAS(cas);
Retrieving Asynchronous Results Asynchronous events resulting from the process Cas request are passed to the registered listener. // Callback Listener. Receives event notifications from UIMA-AS. class MyStatusCallbackListener implements UimaASStatusCallbackListener { // Method called when the processing of a Document is completed. public void entityProcessComplete(CAS aCas, EntityProcessStatus aStatus) { if (aStatus != null && aStatus.isException()) { List exceptions = aStatus.getExceptions(); for (int i = 0; i < exceptions.size(); i++) { ((Throwable) exceptions.get(i)).printStackTrace(); } uimaAsEngine.stop(); return; } // Process the retrieved Cas here // ... } // Add other required callback methods below... }
Deploying a Service with the Client API Services can be deployed from a client object independently of any service connection. The main motivation for this feature is to be able to deploy a service, connect to it, and then remove the service when the application is done using it. // create Map to hold required parameters Map<String,Object> appCtx = new HashMap<String,Object>(); appCtx.put(UimaAsynchronousEngine.DD2SpringXsltFilePath, System.getenv("UIMA_HOME") + "/bin/dd2spring.xsl"); appCtx.put(UimaAsynchronousEngine.SaxonClasspath, "file:" + System.getenv("UIMA_HOME") + "/saxon/saxon8.jar"); uimaAsEngine.deploy(service, appCtx);
Undeploying a Service with the Client API Services can be undeployed from a client object as follows: // create Map to hold required parameters Map<String,Object> appCtx = new HashMap<String,Object>(); appCtx.put(UimaAsynchronousEngine.DD2SpringXsltFilePath, System.getenv("UIMA_HOME") + "/bin/dd2spring.xsl"); appCtx.put(UimaAsynchronousEngine.SaxonClasspath, "file:" + System.getenv("UIMA_HOME") + "/saxon/saxon8.jar"); String id = uimaAsEngine.deploy(service, appCtx); uimaAsEngine.undeploy(id);
Recovering from broker failure The Client API has a built in recovery strategy to handle cases where a broker fails or becomes unreachable, and then, later becomes available again. Before sending a new request to a broker, the client checks the state of its connection. If the connection has failed, the client enters a loop where it will attemp to reconnect every 5 seconds. One message is logged to notify this is happening. The recovery attempt stops when the the connection is recovered, or when all UIMA AS clients that are sharing this failed connection, terminate. During the recovery attempt, any CASes that are submitted via the client APIs will fail or timeout. If the application uses the sendAndReceive() synchronous API, the failure will be delivered by an exception. If the application client uses the sendCAS() asynchronous API, the failure will be delivered via the normal callback listener that the application registered with the UIMA AS client.
Sample Code See $UIMA_HOME/examples/src/org/apache/uima/examples/as/RunRemoteAsyncAE.java
uima-as-2.3.1/uima-as-docbooks/src/docbook/ref.async.deployment.xml000066400000000000000000001154341160020716200252110ustar00rootroot00000000000000 %uimaents; ]> Asynchronous Scaleout Deployment Descriptor
Descriptor Organization Each deployment descriptor describes one service, associated with a single UIMA descriptor (aggregate or primitive), and describes the deployment of those UIMA components that are co-located, together with specifications of connections to those subcomponents that are remote. The deployment descriptor is used to augment information contained in an analysis engine descriptor. It adds information concerning which components are managed using AS queue names for connecting components error thresholds and recovery / terminate action specifications error handling routine specifications The application can include both Java and non-Java components; the deployment descriptors are slightly different for non-Java components.
Deployment Descriptor Each deployment descriptor describes components associated with one UIMA descriptor. The basic structure of a Deployment Descriptor is as follows: [String] [String] [String] [String] inputQueueScaleout="nn2"> initialFsHeapSize="nnn" processParentLast="[true/false]"/> ... . . . remoteReplyQueueScaleout="nn1"> . . . ]]>
CAS Pool This element specifies information for managing CAS pools. Having more CASes in the pools enables more AS components to run at the same time. For instance, if your application had four components, but one was slow, you might deploy 10 instances of the slow component. To get all 10 instances working on CASes simultaneously, your CAS pool should be at least 10 CASes. The casPool size should be small enough to avoid paging. The initialFsHeapSize attribute is optional, and allows setting the size of the initial CAS Feature Structure heap. This number is specified in bytes, and the default is approximately 2 megabytes for Java top-level services, and 40 kilobytes for C++ top level services. The heap grows as needed; this parameter is useful for those cases where the expected heap size is much smaller than the default.
Service This section is required and specifies the deployment information for the service.
Customizing the deployment The <custom> element(s) are optional. Each one, if specified, requires a name parameter, and can have an optional value parameter. They are intended to provide additional information needed for particular kinds of deployment. The following lists the things that can be specified here. name="run_top_level_CPP_service_as_separate_process" (no value used) Causes the top level component, which must be a component specified as using <frameworkImplementation>org.apache.uima.cpp</frameworkImplementation> and which must be specified as async="false" (the default), to be run in a separate process, rather than via using the JNI.
Input Queue The inputQueue element is required. It identifies the input queue for the service. ]]> The brokerURL attribute is optional. When omitted, a default value of tcp://localhost:61616 will be used. A different brokerURL can be provided as an override when launching a service. Consult README that provides an example of brokerURL override. The queue broker address includes a protocol specification, which should be set to either "tcp", or "http". The brokerURL attribute specifies the queue broker URL, typically its network address and port. . The http protocol is similar to the tcp protocol, but is preferred for wide-area-network connections where there may be firewall issues, as it supports http tunnelling. When remote delegates are being used, the brokerURL value used for this remote delegate is used also for the remote reply Queue, and must be valid for both the client to send requests and the remote service to send replies to. The URL to use for the reply is resolved on the remote system when sending a reply. Using "localhost" will not work, nor will partially specified URLs unless they resolve to the same URL on all nodes where services are running. The recommended best practice is to use fully qualified URL names. The queue name is used to uniquely identify a queue belonging to a particular broker. The prefetch attribute controls prefetching of messages for an instance of the service. It can be 0 - which disables prefetching. This is useful in some realtime applications for reducing latency. In this case, when a new request arrives, any available instance will take the request; if prefetching was set above 0, the request might be prefetched by a busy service. The default value if not specified is 0. The prefetch attribute is only used with the top inputQueue element for the service.
Top level Analysis Engine descriptor Top Level AE Descriptor Each service must indicate some analysis engine to run, using this element. ]]> This is the standard UIMA import element. Imports can be by name or by location; see .
Setting Environment Variables This element is optional, and provides a way to set environment variables. This element is only allowed and used for top level Analysis Engines specifying <frameworkImplementation>org.apache.uima.cpp</frameworkImplementation> and running using the <custom name="run_top_level_CPP_service_as_separate_process">; it is not supported for Java Analysis Engines. Components written in C++ can be run as a top level service. These components are launched in a separate process, and by default, all the environment variables of the launching process are passed to the new process. This element allows the environment variables of the new process to be augmented. value goes here ]]> Usually, the value will replace any existing value. As a special exception, for the environment variables used as the PATH (for Windows) or LD_LIBRARY_PATH (for Linux) or DYLD_LIBRARY_PATH (for MacOS), the value will be "prepended" with a path separator character appropriate for the platform, to any existing value.
Analysis Engine This is used to describe an element which is an analysis engine. It is optional and only needed if the defaults are being overridden. The async attribute is only used for aggregates, and specifies that this aggregate will be run asynchronously (with input queues in front of all of its delegates) or not. If not specified, the async property defaults to "false" except in the case where the deployment descriptor includes the <delegates> element, when it defaults to "true". If you specify async="false", then it is an error to specify any <delegates> in the deployment descriptor. The key attribute must have as its value the key name used in the containing aggregate descriptor to uniquely identify this delegate. Since the top level aggregate is not contained in another aggregate, this can be omitted for that element. Deployment information is matched to delegates using the key name specified in the aggregate descriptor to identify the delegate. inputQueueScaleout="nn2"> initialFsHeapSize="nn" processParentLast="[true/false]"/> ... . . . remoteReplyQueueScaleout="nn1"> initialFsHeapSize="nnn" processParentLast="[true/false]"/> . . . . . . ]]> <analysisEngine> is used to specify deployment details for an analysis engine. It is optional, and if omitted, defaults will be used: The analysis engine will be run synchronously (processing only one CAS at a time), with a scaleout of 1, using the default error configuration. The attributes internalReplyQueueScaleout and inputQueueScaleout only have meaning and are allowed when async="true" is specified (which in turn can only be set true for aggregates) or is the default ( which happens when the aggregate has delegate deployment options specified in the deployment descriptor). These attributes default to 1. For asynchronous aggregates, they control the number of threads used to do the work of the aggregate outside of running the delegates. This work can include one or more of the following: deserializing an input CAS (only on the input Queue), or serializing the resulting CAS back to a remote requester (only if the requester is remote). running the flow controller serializing CASes being sent to remote delegates (only useful if one or more of the delegates is remote). These attributes provide a way to scale out this work on multi-core machines, if these tasks become a bottleneck. Note that if an aggregates flow controller specifies that the first delegate the CAS should flow to is a remote, the work of serializing the CAS to that remote is done using the inputQueue thread, and the scaleout parameter that would apply would be the inputQueueScaleout. For subsequent delegates, the work is done on the internalReplyQueueScaleout threads. The <scaleout ...> element specifies, for co-located primitive or non-AS aggregates (async="false") at the bottom of an aggregate tree, how many replicated instances are created. The <casMultiplier> element inside an <analysisEngine> element is required if the analysis engine component is a CAS multiplier, and is an error if specified for other components. It specifies for CAS multipliers the size of the pool of CASes used by that CAS multiplier for generating extra CASes. The actual CAS pool size can be bigger than the size specified here. The custom CAS multiplier code specifies how many CASes it needs access to at the same time; the actual CAS pool size is the value in the deployment descriptor, plus the value in custom CM code, minus 1. The initialFsHeapSize attribute on the <casMultiplier> element is optional, and allows setting the size of the initial CAS Feature Structure heap for CASes in this pool. This number is specified in bytes, and the default is approximately 2 megabytes for Java top-level services, and 40 kilobytes for C++ top level services. The heap grows as needed; this parameter is useful for those cases where the expected heap size is much smaller than the default. The processParentLast attribute on the <casMultiplier> element is optional, and specifies processing order of an input CAS relative to its children. If true, a flow of an input CAS will be suspended after it is returned from a Cas Multiplier delegate until all its child CASes have finished processing. If false, an input CAS can be processed in parallel with its children. The <remoteAnalysisEngine> elements are used to specify that the delegate is not co-located, and how to connect to it. The remoteReplyQueueScaleout is optional; if not specified it defaults to 1. This scaleout is the number of threads that will be used to do the work of the containing aggregate when replies are returned from this remote delegate. This work is described above. It may be useful to set this to > 1 if, for instance, there are many CASes coming back from a remote delegate (perhaps the remote is a CAS Multiplier), and each one has to be deserialized. The <serializer> element describes what method of serialization to use. This element is optional and it may be set to either binary or xmi. If omitted, xmi serialization will be used by default. Xmi serialization can be quite verbose and produce large output for CASes containing many annotations; on the plus side, it supports serialization between components where the type systems may not be exactly identical (for instance, they could be different subsets of larger, common type systems). Binary serialization produces a smaller output size and is more efficient; on the minus side, it requires that the type systems for both components have exactly the same type and feature codes - which in practice means that the type systems have to be identical. Also, the binary serialization format is new with 2.3.0 release, and is not always available. For example, C++ services do not (currently) support this format. The <inputQueue> element specifies the remote's input queue. The casMultiplier element inside a remoteAnalysisEngine element is only specified if the remote component is a CAS Multiplier, and it specifies the size of a pool of CASes kept to receive the new CASes from the remote component, and the initial size of those CASes. Its poolSize must be equal to or larger than the casMultiplier poolSize specified for that remote component. As of release 2.3.1, the previous restrictions limiting remote CAS Multiplier to just one have been lifted; you can have any number, and they can be scaled out as well. The brokerURL value used for this remote delegate must be valid for both the client to send requests and the remote service to send replies. Services may be running on nodes with firewalls, where the only port open is the one for http. In this case, you can use the http protocol. The <asyncPrimitiveErrorConfiguration> element is only allowed within a top-level analysis engine specification (that is, one that is not a delegate of another, containing analysis engine).
Error Configuration descriptors Error Configuration descriptors can be included directly in the deployment descriptors, or they may use the <import> mechanism to import another file having the specification. For AS Aggregates, the configuration applicable to delegates goes in <asyncAggregateErrorConfiguration> elements for the delegate. For AS Primitives, there is one <asyncPrimitiveErrorConfiguration> element that configures threshold-based termination. The other kinds of error configuration are not applicable for AS Primitives. See for a complete overview of error handling. The Error Configuration descriptor for AS Aggregates is as follows; note that all the elements are optional: [String] [String] [String] [String] ]]> For an AS Primitive, the <asyncPrimitiveErrorConfiguration> element appears at the top level, and has this form: [String] [String] [String] [String] ]]> The maxRetries attribute specifies the maximum number of retries to do. If this is set to 0 (the default), no retries are done. The continueOnRetryFailure attribute, if set to 'true' causes the framework to ask the aggregate's flow controller if the processing for the CAS can continue. If this attribute is 'false' or if the flow controller indicates it cannot continue, further processing on the CAS is stopped and an error is returned from the aggregate. Warning: there are some conditions in the current implementation where this is not yet being done; this is a known issue. If maxRetries > 0 or the continueOnRetryFailure attribute is 'true', the CAS will be saved before sending it to remote delegates, to enable the these actions. For co-located delegates, the CAS is not copied, therefore the retry and continue options are not allowed. The timeout attribute specifies the timeout values used when sending commands to the delegates. The units are milliseconds and a value of 0 has the special meaning of no timeout. The thresholdCount and thresholdWindow attributes specify the threshold at which the thresholdAction is taken. If xxx errors occur within a window of size yyy, the framework takes the specified action of either disabling this delegate, or terminating the containing AS Aggregate (or if not an AS Aggregate, terminating the AS Primitive). A thresholdCount of 0 (the default) has the special meaning of no threshold, i.e. errors ignored, and a thresholdWindow of 0 (the default) means no window, i.e. all errors counted. An action of 'disable' applies to the specified delegate, removing it from the flow so the containing aggregate will no longer send it commands. The 'terminate' action applies to the entire service containing this component, disconnecting it from its input queue and shutting it down. Note that when disabling, the framework asks the flow controller to remove the delegate from the flow, but if the flow controller cannot reasonably operate without this component it can convert the action to 'terminate' by throwing an AnalysisEngineProcessException.FLOW_CANNOT_CONTINUE_AFTER_REMOVE exception. Note that the only action for an AS Primitive on getMetadata failure is to terminate, and this is always the case, so it is not listed as an configuration option. This is also the default action for an AS Aggregate getMetadata failure.
Error Configuration defaults If the <errorConfiguration> element is omitted, or if some sub elements of this are omitted, the following defaults are used: The maxRetries parameter is set to 0. Timeout defaults are set to 0, meaning no timeout, except for the getMetadata command for remote delegates; here the default is 60000 (1 minute) The continueOnRetryFailure action is set to "false". The thresholdCount value is set to 0, meaning no threshold, errors are ignored. The thresholdWindow value is set to 0, meaning no window, all errors are counted. No disable or terminate action will be done (i.e. errors ignored), except for the getMetadata command where the default is to terminate.
uima-as-2.3.1/uima-as-docbooks/src/docbook/uima_async_scaleout.xml000066400000000000000000000035401160020716200251630ustar00rootroot00000000000000 UIMA Asynchronous Scaleout uima-as-2.3.1/uima-as-parent/000077500000000000000000000000001160020716200156675ustar00rootroot00000000000000uima-as-2.3.1/uima-as-parent/pom.xml000066400000000000000000000105411160020716200172050ustar00rootroot00000000000000 4.0.0 org.apache.uima parent-pom 2 org.apache.uima uima-as-parent pom 2.3.1 UIMA-AS: ${project.artifactId} The common parent pom for uima-as ${uimaWebsiteUrl} scm:svn:http://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/uima-as-parent scm:svn:https://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/uima-as-parent http://svn.apache.org/viewvc/uima/uima-as/tags/uima-as-2.3.1-rc7/uima-as-parent eclipsePlugins Eclipse components default http://repo1.maven.org/eclipse never fail false central Maven Repository Switchboard default http://repo1.maven.org/maven2 true fail never false apache.snapshots.plugins Apache Snapshot Repository - Maven plugins http://repository.apache.org/snapshots default false true fail never uima-as ${project.artifactId} 2.3.1 uima-as-2.3.1/uima-as/000077500000000000000000000000001160020716200144005ustar00rootroot00000000000000uima-as-2.3.1/uima-as/LICENSE000066400000000000000000001040471160020716200154130ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ========================================================================= == For the Java Service Wrapper == ========================================================================= Copyright (c) 1999, 2006 Tanuki Software, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the Java Service Wrapper and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sub-license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Portions of the Software have been derived from source code developed by Silver Egg Technology under the following license: BEGIN Silver Egg Techology License ----------------------------------- Copyright (c) 2001 Silver Egg Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sub-license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. END Silver Egg Techology License ------------------------------------- ========================================================================= == For Saxon 8.9 == ========================================================================= MOZILLA PUBLIC LICENSE Version 1.0 1. Definitions. 1.1. ``Contributor'' means each entity that creates or contributes to the creation of Modifications. 1.2. ``Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. ``Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. ``Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. ``Executable'' means Covered Code in any form other than Source Code. 1.6. ``Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. ``Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. ``License'' means this document. 1.9. ``Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. ``Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.11. ``Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. ``You'' means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, ``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, ``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``Utilize'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. 2.2. Contributor Grant. Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims. If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled ``LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. 6. Versions of the License. 6.1. New Versions. Netscape Communications Corporation (``Netscape'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works. If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a ``commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and ``commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the United States of America: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Santa Clara County, California, under the auspices of JAMS/EndDispute; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. EXHIBIT A. ``The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________.'' ========================================================================= == SVG Icons == ========================================================================= This product contains icons from the SVG Icons project. The icons are licensed under the BSD license, but the actual license text is not provided by the SVG Icons project. Here's the generic BSD license template. BSD License Copyright (c) , All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. uima-as-2.3.1/uima-as/LicNoticeAnalysisActiveMQ.txt000066400000000000000000000003621160020716200221110ustar00rootroot00000000000000Excluded from the UIMA AS distribution are the following parts of Apache ActiveMQ 5.4.1 release: - MX4J an implementation of JMX and tools. - JmDNS a multicast domain name server - Glassfish JSP engine - jboss integration moduleuima-as-2.3.1/uima-as/NOTICE000066400000000000000000000027071160020716200153120ustar00rootroot00000000000000Apache UIMA-AS Copyright 2008, 2009 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). Portions of UIMA-AS were originally developed by International Business Machines Corporation and are licensed to the Apache Software Foundation under the "Software Grant License Agreement", informally known as the "IBM UIMA-EE License Agreement". Copyright (c) 2007, 2008 IBM Corporation This product includes software, Apache ActiveMQ, developed at the Apache Software Foundation (http://www.apache.org/). This product includes software known as "The Saxon XSLT and XQuery Processor from Saxonica Limited", whose home page URL is http://www.saxonica.com/ Saxon includes the org.apache.xerces.util.XMLChar module from the Apache Xerces product, renamed as net.sf.saxon.om.XMLChar but otherwise unchanged. See the copyright statements included in the source code of that module for conditions of use. Saxon includes code for performing Unicode normalization that is derived from the sample code published for this purpose by the Unicode consortium. For the terms of use of this code, see http://www.unicode.org/terms_of_use.html, which should be regarded as forming part of these conditions of use, and part of the Saxon documentation. This product contains icons developed by the SVG Icons project (http://sourceforge.net/projects/svgicons), licensed under the BSD license (see LICENSE file).uima-as-2.3.1/uima-as/README000066400000000000000000000535011160020716200152640ustar00rootroot00000000000000 Apache UIMA Asynchronous Scaleout (UIMA-AS) Version 2.3.1 README ---------------------------------------------------------------- 0. Building from the Source Distribution ======================================== We use Maven 3.0 for building; download this if needed, and set the environment variable MAVEN_OPTS to -Xmx800m -XX:MaxPerSize-256m. Then do the build by going into the .../uima-as directory, and issuing the command mvn clean install. This builds everything except the ...source-release.zip file. If you want that, change the command to mvn clean install -Papache-release Look for the result in the two artifacts: ../uima-as/target/uima-as-[version]-source-release.zip if run with -Papache-release) and ../uima-as/target/uima-as-[version]-bin.zip (or ...tar.gz) For more details, please see http://uima.apache.org/building-uima.html 1. What's New in 2.3.1 ====================== - UIMA-AS repackaged - includes base UIMA - New ActiveMQ version - includes ActiveMQ 5.4.1 with its dependencies - Each thread uses dedicated Serializer/Deserializer instance, removing a bottleneck - Many bug fixes - Multiple improvements to increase performance - Improved error handling and stability - Fixed CDE slow startup with an aggregate containing a remote delegate - Improves and fixes bugs related to XMI delta serialization - Fixes a bug preventing shutdown of C++ services - Improved debugging with optional dumping of JVM stack if process() takes too long - Added detection of failed client before processing a CAS - Fixed bugs in JMX Monitor integrated with UIMA AS service - Improved performance by increasing prefetch size on reply queue - Fixed processParentLast logic 1.1 Contents of Apache UIMA-AS binary distribution -------------------------------------------------- The Apache UIMA-AS binary distribution includes - Apache UIMA Java SDK - Apache UIMA Asynchronous Scaleout extensions - Saxon - Apache ActiveMQ - Spring Framework It includes the base UIMA binary distribution which it depends on. UIMA-AS components, in addition to those that come with base UIMA include: shell scripts: -------------- bin/startBroker.sh/bat: starts the ActiveMQ broker, which must be running before UIMA AS services can be deployed. bin/deployAsyncService.sh/bat: deploys an AnalysisEngine as a UIMA-AS service. Takes one or more UIMA-AS Deployment Descriptors as arguments. bin/runRemoteAsyncAE.sh/bat: Calls a UIMA-AS service. Takes arguments specifying the location of the service, and an optional CollectionReader descriptor file used to obtain the CASes to be processed by the service. documentation: -------------- docs/d/uima_async_scaleout.pdf: UIMA-AS documentation, including the specification for the deployment descriptor file syntax. examples: --------- examples/deploy/as/... (Sample Deployment Descriptors) Deploy_RoomNumberAnnotator.xml: Deploys Room Number Annotator Primitive AE Deploy_MeetingDetectorTAE.xml: Deploys Meeting Detector Aggregate AE with all delegates in the same JVM. Deploy_MeetingDetectorTAE_Whiteboard.xml: Deploys Meeting Detector Aggregate AE using the whiteboard Flow Controller. Deploy_MeetingDetectorTAE_RemoteRoomNumber.xml: Deploys Meeting Detector Aggregate AE that uses remotely deployed RoomNumberAnnotator. Deploy_MeetingDetectorTAE_3MeetingAnnotator.xml: Deploys Meeting Detector Aggregate AE with three instances of the MeetingAnnotator component. Deploy_MeetingDetectorTAE_Sync_3Instances.xml: Deploys 3 instances of the Meeting Detector as a Synchronous Aggregate (meaning the delegate AEs do not each get their own input queue). Deploy_MeetingAnnotator.xml: Deploys C++ Meeting Annotator. Note: requires installation of uimacpp SDK into $UIMA_HOME. MeetingFinderAggregate.xml: Aggregate descriptor that use the same components as the CPE examples MeetingFinderCPE* in base UIMA. Deploy_MeetingFinder.xml: Deploys MeetingFinderAggregate illustrating scalability and error handling similar to the CPM examples; see Section 4 on migration below. descriptors: ------------ descriptors/as/... (Other Sample Descriptors for use with UIMA AS) MeetingDetectorAsyncAE.xml: Specifier that can be used to call a UIMA AS Service from an existing UIMA application; see Section 2.5 below. 2. Installation and Setup ========================= 2.1 Supported Platforms ----------------------- UIMA AS Requires Java 5 or later. It has been tested with Sun Java 5 on Windows XP and Linux, and with IBM Java 6 on Linux. Other platforms and Java (5+) implementations should work, but have not been significantly tested. 2.2. Environment Variables -------------------------- After you have unpacked the UIMA AS distribution, you must perform the following environment variable settings (the same as for normal Apache UIMA setup): * Set JAVA_HOME to the directory of your JRE installation you would like to use for UIMA. * Set UIMA_HOME to the apache-uima-as directory of your unpacked Apache UIMA distribution * Append UIMA_HOME/bin to your PATH Note: The Mac OS X operating system has special procedures for setting up global environment variables; see http://developer.apple.com/qa/qa2001/qa1067.html for how to do this. 2.3 Running the Setup Script ---------------------------- You must run the script UIMA_HOME/bin/adjustExamplePaths.bat (or .sh). This updates paths in the examples based on the actual UIMA_HOME directory path. 2.4 Setting up Eclipse ---------------------- Eclipse users should install the UIMA Eclipse Plugins and UIMA Examples Project using the procedure described in Chapter 3 of the Apache UIMA Overview and Setup guide, which you can find online at http://uima.apache.org; click on Documentation -> HTML Online Version -> Overview and Setup -> 3. Eclipse IDE setup for UIMA. Since UIMA AS requires Java 5, you must be sure to set up your uimaj-examples Eclipse project to use a version 5 (or later) JRE, and you must set your compiler compliance level to 5.0. To do this go to Window->Preferences and navigate to the Java->Compiler page. Remember to run the base Eclipse using Java 5 (or later), as well. 3. Getting Started ================== 3.1 Starting the ActiveMQ Broker -------------------------------- UIMA AS services require an ActiveMQ broker to be available with which to create/register the service request queue. If no broker is available, start a new broker on the same machine the services will run on or another machine; this is done by first setting an env parameter ACTIVEMQ_BASE pointing at a writable directory, or simply by cd'ing to a writable directory, and running: startBroker.sh/bat The first time run this script will create a new directory $ACTIVEMQ_BASE/amq (or ./amq) and default configuration files will be copied there. The configuration files can then be customized to modify broker behavior for subsequent startups. Note: only one broker can be started at a time on the same machine with the same configuration file, or on different machines from the same writable directory. When the broker starts it will print a message such as: INFO TransportServerThreadSupport - Listening for connections at: tcp://yourHostname:61616 Note this URL since you will need it to run services and clients. The tcp listening port must be exposed to any clients or services using the broker. To connect to a broker running behind a firewall using HTTP tunneling, see section 3.6 below. 3.2 Deploying an Analysis Engine as a UIMA AS Asynchronous Service ------------------------------------------------------------------ a. Create a Deployment Descriptor. Examples can be found in the examples/deploy/as directory, and the syntax is documented in docs/d/uima_async_scaleout.pdf. Note: One of the things that the deployment descriptor may contain is a broker placeholder with this syntax: ${defaultBrokerURL}. The placeholder is replaced at runtime with an actual broker URL. The value for the placeholder comes from System properties. The brokerURL attribute of element is optional. If not present, a default of tcp://localhost:61616 will be used. The examples assume the broker is listening on tcp://localhost:61616. b. Run the command: deployAsyncService.sh/cmd [testDD.xml] [-brokerURL url] The argument to the command is the deployment descriptor you created in step (a). An optional argument -brokerURL specifies a URL of the broker that the service will use to create connections to queues. This argument takes effect only if your deployment descriptor does not explicitly name the broker URL in the xml element *or* the brokerURL attribute is set to a placeholder ${defaultBrokerURL}. Omitting brokerURL or using a placeholder is a way to keep your deployment descriptors portable. You don't need to edit your deployment descriptors when switching brokers. Note: If you use import by name in your deployment descriptor, UIMA AS searches the CLASSPATH as well as directories on UIMA_DATAPATH to resolve the import. Note: deployAsyncService.sh/cmd scripts launch UimaBootstrap main program which loads UIMA jars dynamically from UIMA_HOME/lib, UIMA_HOME/apache-activemq-5.4.1, UIMA_HOME/apache-activemq-5.4.1/lib, and UIMA_HOME/apache-activemq-5.4.1/lib/optional directories. If you want to use a different version of ActiveMQ, set the ACTIVEMQ_HOME environment variable to the location of ActiveMQ you intend to use. When using different version of ActiveMQ ( older than version 5.4), start the broker using a startup script located in ACTIVEMQ_HOME/bin directory instead of UIMA_HOME/bin/startBroker.[cmd|sh] script provided in this release. This is due to the fact that the 5.4 branch of ActiveMQ xml schema has changed. The activemq_nojournal.xml provided in this release two optimizations: schedulerSupport=false to disable broker message scheduler, and producerFlowControl="false" to turn off producer flow control. Also, if you want to deploy your own annotator that is installed in a different directory than UIMA_HOME/lib, set the UIMA_CLASSPATH environment variable to point to one or more Classpath entries; these entries can either be directories of Java class files, Jar files, or directories of Jar files (in which case, all the Jars are added in an arbitrary order). Separate multiple entries using File.pathSeparator. Note: Both UIMA AS client and UIMA AS service by default add a time-to-live (TTL) to every request message. This enables expiration of messages that are not consumed. Currently, the UIMA AS client multiplies the Process Timeout value by 10 and uses this as TTL. The UIMA AS service sets TTL to the Timeout value multiplied by the number of outstanding requests. To disable TTL, add a system property -DNoTTL. A convenient way to set this parameter is by adding -DNoTTL to the env parameter UIMA_JVM_OPTS before running deployAsyncService and/or runRemoteAsyncAE. 3.3 Calling a UIMA AS Asynchronous Service ------------------------------------------ To test a remote UIMA service you can use the script: runRemoteAsyncAE.sh/cmd brokerUrl endpoint This connects to a remote AE at specified brokerUrl and endpoint (which must match the inputQueue endpoint in the remote AE service's deployment descriptor). A subset of the optional arguments to runRemoteAsyncAE are: -c Specifies a CollectionReader descriptor. The client will obtain CASes from the CollectionReader and send them to the service for processing. If this option is omitted, one empty CAS will be sent to the service (useful for services containing a CAS Multiplier acting as a collection reader). -d Specifies a deployment descriptor. The specified service will be deployed before processing begins, and the service will be undeployed after processing completes. Multiple -d entries can be given. -o Specifies an Output Directory. All CASes received by the client's CallbackListener will be serialized to XMI in the specified OutputDir. If omitted, no XMI files will be output. The full set of arguments are documented if you type the command with no arguments. 3.4 Quick Test of an async service ---------------------------------- Start two terminal windows, each with an environments setup as described in section 2.2. * In the first terminal window start the broker (as described in section 3.1), by running the commands: cd some-writable-directory startBroker.sh/bat * In the second terminal window, deploy a sample service and send it some CASes: cd $UIMA_HOME/examples/deploy/as runRemoteAsyncAE.sh/cmd tcp://localhost:61616 MeetingDetectorTaeQueue \ -d Deploy_MeetingDetectorTAE.xml \ -c $UIMA_HOME/examples/descriptors/collection_reader/FileSystemCollectionReader.xml If you get an UnsupportedClassVersionError, Java 5 is probably not being used. If the driver fails to find the input data, adjustExamplePaths was probably not run. 3.5 Calling a UIMA AS Asynchronous Service from an Existing UIMA Application You can also call a UIMA AS Service from the DocumentAnalyzer or any other UIMA application using a new JMS client Service Descriptor (see section 1.7 in the UIMA Asynchronous Scaleout documentation). However, note that this is a synchronous interface, that is, it will process only one CAS at a time, so it will not take advantage of the scalability that UIMA AS provides. To process more than one CAS at a time, you can use the Asynchronous UIMA AS Client as described in section 3.3, or write your own application using the UIMA AS Client APIs. An example JMS client service descriptor is provided in examples/descriptors/as/MeetingDetectorAsyncAE.xml The JMS service makes use of the customResourceSpecifier capability in Apache UIMA. For more information on the customResourceSpecifier see the "Custom Resource Specifiers" section in the Apache UIMA Reference manual. 3.6 Firewalls between clients and services ------------------------------------------ A service running behind a firewall can be accessed as long as its input queue is on a broker that is accessable. For example, the service can register with a public broker running outside the firewall. Alternatively the broker may be configured to tunnel over HTTP. For details see http://activemq.apache.org/configuring-transports.html Note: The ActiveMQ 5.4.1 jars distributed with this UIMA AS release include bug fixes described in http://issues.apache.org/activemq/browse/AMQ-1308. Previous releases of UIMA AS included custom ActiveMQ 4.1.1 jars (which we have patched) to remedy the problems. When using ActiveMQ HTTP connector, make sure that both a client and a service use either ActiveMQ 4.1.1 or ActivemMQ 5.4.1+ jars. 3.7 Monitoring a broker and its queues -------------------------------------- When the broker starts it will print a message such as: INFO ManagementContext - JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi Connect a JMX console to this service with: $JAVA_HOME/bin/jconsole service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi (Note: jconsole is available in Java SDK (not JRE) distributions from Sun) If your console is not on the same machine as the broker, replace localhost by the name of the broker's machine. The default ports for the broker (61616) and for the JMX server (1099) can be overridden in the broker configuration file created when the broker is first started. For more details see http://activemq.apache.org/jmx.html 3.8 Monitoring UIMA AS service ------------------------------ UIMA AS service monitoring is available via JMX and jConsole. To enable this, please set the following before starting a service: set UIMA_JVM_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port= -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Connect a jConsole to this JMX service as described in 3.7 above using the appropriate port, e.g. $JAVA_HOME/bin/jconsole service:jmx:rmi:///jndi/rmi://localhost:8009/jmxrmi Under the MBeans tab, expand org.apache.uima in the left panel to view UIMA components enabled for JMX monitoring. 3.9 Stopping UIMA AS service ---------------------------- A service can be stopped from a command line or remotely using jConsole and JMX. When the service is launched it displays a prompt on stdout: Enter 'q' to quiesce and stop the service or 's' to stop it now: It reads stdin expecting either 'q' or 's', ignoring all other characters. When 'q' is typed, the service will quiesce and stop. As part of this, the service closes its input queue and waits until all CASes still "in-play" are finished. When the input CAS is returned the service stops. When 's' is typed the service closes its input queue and immediately releases all CASes being processed and stops. To stop UIMA AS process remotely or if the process runs in a background use jConsole and JMX. Using approach described in 3.8 above launch jConsole. Once the connection is created, in the left pane open: org.apache.uima ee.jms.service Uima EE Service Controller Operations Here you will find two buttons labeled: CompleteProcessingAndStop StopNow CompleteProcessingAndStop will initiate quiesce while StopNow will initiate a hard stop. 4. Migration from CPM to UIMA-AS ================================ Migrating a collection processing engine from the CPM to UIMA-AS is straightforward. First, migrate the CPE descriptor to a standard UIMA aggregate descriptor: create a UIMA aggregate that includes all the components specified in the CPE descriptor. Transfer any parameter overrides in the CPE descriptor to the aggregate descriptor. Note that the aggreate descriptor must set to false to be consistent with collection reader and CAS consumer delegates. Second, test this aggregate descriptor by instantiating the aggregate and sending it a single CAS. The contents of the CAS are not important; its purpose is to start the collection reader delegate which will then create the actual CASes to be processed by the other aggregate components. The CAS Visual Debugger, CVD, is a useful tool for doing this test. Next, create a UIMA-AS deployment descriptor that specifies desired scaleout and error handling. Vinci services are still supported, although it is recommended to replace them with UIMA-AS services to enable more efficient load balancing and greater scaleout capability. An example of this kind of migration is embodied by the sample descriptors: Original: $UIMA_HOME/examples/descriptors/collection_processing_engine/MeetingFinderCPE_Integrated.xml Migrated: $UIMA_HOME/examples/deploy/as/MeetingFinderAggregate.xml $UIMA_HOME/examples/deploy/as/Deploy_MeetingFinder.xml 5. Known problems/limitations with Release 2.3.1 ================================================ 1. No automatic refresh for broken connections with temp reply queues. 2. When connecting to an AMQ broker behind a firewall, avoid using the maxInactivityDuration=0 decoration on the brokerURL (see: http://activemq.apache.org/configuring-wire-formats.html) as it turns off AMQ 'keep alive' messaging. Without these, a firewall may assume a connection has become stale and close its ports. 3. UIMA AS does not (yet) support PEAR specifiers. The deployment descriptor should not point to PEAR file. Instead, PEARs must be unzipped and classpath adjusted to point to required resources. 4. To monitor multiple UIMA AS services on the same machine, each must be assigned a unique JMX port (see section 3.8). 5. Handling of timeouts on Cas Multiplier delegates not working For up-to-date information on UIMA-AS issues, see our issue tracker: http://issues.apache.org/jira/secure/BrowseProject.jspa?id=12310570 Crypto Notice ------------- This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See for more information. The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code. The following provides more details on the included cryptographic software: This distribution includes portions of Apache ActiveMQ, which, in turn, is classified as being controlled under ECCN 5D002. uima-as-2.3.1/uima-as/RELEASE_NOTES.html000066400000000000000000000064021160020716200173200ustar00rootroot00000000000000 Apache UIMA Asynchronous Scaleout v2.3.1 Release Notes

Apache UIMA-AS (Unstructured Information Management Architecture - Asynchronous Scaleout) v2.3.1 Release Notes

Contents

1. What is UIMA-AS?
2. Major Changes in this Release
3. How to Get Involved
4. How to Report Issues
5. List of JIRA Issues Fixed in this Release

1. What is UIMA-AS?

UIMA Asynchronous Scaleout (AS) is an augmented version of Apache UIMA that additionally provides a set of capabilities for achieving flexible scaleout. It is a second generation design, replacing the CPM and Vinci Services. The CPM and Vinci are still available and are not being deprecated, but new designs are encouraged to use UIMA-AS for scalability, and current designs reaching limitations may want to move to UIMA-AS.

UIMA-AS is integrated with the new flow controller architecture, and can be applied to both primitive and aggregate analysis engines. It fully supports CAS Multipliers.

2. Major Changes in this Release

Please see the README for this information.

3. How to Get Involved

The Apache UIMA project really needs and appreciates any contributions, including documentation help, source code and feedback. If you are interested in contributing, please visit http://uima.apache.org/get-involved.html.

4. How to Report Issues

The Apache UIMA project uses JIRA for issue tracking. Please report any issues you find at http://issues.apache.org/jira/browse/uima

5. List of JIRA Issues Fixed in this Release

Click issuesFixed/jira-report.hmtl for the list of issues fixed in this release. uima-as-2.3.1/uima-as/issuesFixed/000077500000000000000000000000001160020716200166735ustar00rootroot00000000000000uima-as-2.3.1/uima-as/issuesFixed/css/000077500000000000000000000000001160020716200174635ustar00rootroot00000000000000uima-as-2.3.1/uima-as/issuesFixed/css/maven-base.css000066400000000000000000000043711160020716200222200ustar00rootroot00000000000000body { margin: 0px; padding: 0px; } img { border:none; } table { padding:0px; width: 100%; margin-left: -2px; margin-right: -2px; } acronym { cursor: help; border-bottom: 1px dotted #feb; } table.bodyTable th, table.bodyTable td { padding: 2px 4px 2px 4px; vertical-align: top; } div.clear{ clear:both; visibility: hidden; } div.clear hr{ display: none; } #bannerLeft, #bannerRight { font-size: xx-large; font-weight: bold; } #bannerLeft img, #bannerRight img { margin: 0px; } .xleft, #bannerLeft img { float:left; } .xright, #bannerRight { float:right; } #banner { padding: 0px; } #banner img { border: none; } #breadcrumbs { padding: 3px 10px 3px 10px; } #leftColumn { width: 170px; float:left; overflow: auto; } #bodyColumn { margin-right: 1.5em; margin-left: 197px; } #legend { padding: 8px 0 8px 0; } #navcolumn { padding: 8px 4px 0 8px; } #navcolumn h5 { margin: 0; padding: 0; font-size: small; } #navcolumn ul { margin: 0; padding: 0; font-size: small; } #navcolumn li { list-style-type: none; background-image: none; background-repeat: no-repeat; background-position: 0 0.4em; padding-left: 16px; list-style-position: outside; line-height: 1.2em; font-size: smaller; } #navcolumn li.expanded { background-image: url(../images/expanded.gif); } #navcolumn li.collapsed { background-image: url(../images/collapsed.gif); } #poweredBy { text-align: center; } #navcolumn img { margin-top: 10px; margin-bottom: 3px; } #poweredBy img { display:block; margin: 20px 0 20px 17px; } #search img { margin: 0px; display: block; } #search #q, #search #btnG { border: 1px solid #999; margin-bottom:10px; } #search form { margin: 0px; } #lastPublished { font-size: x-small; } .navSection { margin-bottom: 2px; padding: 8px; } .navSectionHead { font-weight: bold; font-size: x-small; } .section { padding: 4px; } #footer { padding: 3px 10px 3px 10px; font-size: x-small; } #breadcrumbs { font-size: x-small; margin: 0pt; } .source { padding: 12px; margin: 1em 7px 1em 7px; } .source pre { margin: 0px; padding: 0px; } uima-as-2.3.1/uima-as/issuesFixed/css/maven-theme.css000066400000000000000000000053611160020716200224100ustar00rootroot00000000000000body { padding: 0px 0px 10px 0px; } body, td, select, input, li{ font-family: Verdana, Helvetica, Arial, sans-serif; font-size: 13px; } code{ font-family: Courier, monospace; font-size: 13px; } a { text-decoration: none; } a:link { color:#36a; } a:visited { color:#47a; } a:active, a:hover { color:#69c; } #legend li.externalLink { background: url(../images/external.png) left top no-repeat; padding-left: 18px; } a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover { background: url(../images/external.png) right center no-repeat; padding-right: 18px; } #legend li.newWindow { background: url(../images/newwindow.png) left top no-repeat; padding-left: 18px; } a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover { background: url(../images/newwindow.png) right center no-repeat; padding-right: 18px; } h2 { padding: 4px 4px 4px 6px; border: 1px solid #999; color: #900; background-color: #ddd; font-weight:900; font-size: x-large; } h3 { padding: 4px 4px 4px 6px; border: 1px solid #aaa; color: #900; background-color: #eee; font-weight: normal; font-size: large; } h4 { padding: 4px 4px 4px 6px; border: 1px solid #bbb; color: #900; background-color: #fff; font-weight: normal; font-size: large; } h5 { padding: 4px 4px 4px 6px; color: #900; font-size: normal; } p { line-height: 1.3em; font-size: small; } #breadcrumbs { border-top: 1px solid #aaa; border-bottom: 1px solid #aaa; background-color: #ccc; } #leftColumn { margin: 10px 0 0 5px; border: 1px solid #999; background-color: #eee; } #navcolumn h5 { font-size: smaller; border-bottom: 1px solid #aaaaaa; padding-top: 2px; color: #000; } table.bodyTable th { color: white; background-color: #bbb; text-align: left; font-weight: bold; } table.bodyTable th, table.bodyTable td { font-size: 1em; } table.bodyTable tr.a { background-color: #ddd; } table.bodyTable tr.b { background-color: #eee; } .source { border: 1px solid #999; } dl { padding: 4px 4px 4px 6px; border: 1px solid #aaa; background-color: #ffc; } dt { color: #900; } #organizationLogo img, #projectLogo img, #projectLogo span{ margin: 8px; } #banner { border-bottom: 1px solid #fff; } .errormark, .warningmark, .donemark, .infomark { background: url(../images/icon_error_sml.gif) no-repeat; } .warningmark { background-image: url(../images/icon_warning_sml.gif); } .donemark { background-image: url(../images/icon_success_sml.gif); } .infomark { background-image: url(../images/icon_info_sml.gif); } uima-as-2.3.1/uima-as/issuesFixed/css/print.css000066400000000000000000000003361160020716200213330ustar00rootroot00000000000000#banner, #footer, #leftcol, #breadcrumbs, .docs #toc, .docs .courtesylinks, #leftColumn, #navColumn { display: none !important; } #bodyColumn, body.docs div.docs { margin: 0 !important; border: none !important } uima-as-2.3.1/uima-as/issuesFixed/css/site.css000066400000000000000000000000651160020716200211420ustar00rootroot00000000000000/* You can override this file with your own styles */uima-as-2.3.1/uima-as/issuesFixed/images/000077500000000000000000000000001160020716200201405ustar00rootroot00000000000000uima-as-2.3.1/uima-as/issuesFixed/images/collapsed.gif000066400000000000000000000000651160020716200225760ustar00rootroot00000000000000GIF89a€!ù , DŽ`ºçžcŠ5 ;uima-as-2.3.1/uima-as/issuesFixed/images/expanded.gif000066400000000000000000000000641160020716200224170ustar00rootroot00000000000000GIF89a€!ù , „j œ´Î;uima-as-2.3.1/uima-as/issuesFixed/images/external.png000066400000000000000000000003461160020716200224730ustar00rootroot00000000000000‰PNG  IHDR Óº&gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe< PLTEuuuÿÿÿ™ÿÿÿÑðPtRNSÿÿÿ@*©ôPIDATxÚb`&& @ P6#@ `ÀÄÄäX˜Ć2™Ê« ›‰d@AÔ3ƒ (± *‡½ÜtIEND®B`‚uima-as-2.3.1/uima-as/issuesFixed/images/icon_error_sml.gif000066400000000000000000000017621160020716200236510ustar00rootroot00000000000000GIF89a÷ÿÿÿ ²±«£ q x v m¸;@’GJf46éÒÓ_ Á· œ › ‚ i [ ¾½¹·«¦ ˜ — – “ Š ˆ ~ } s q p n X V L ž  … ƒ  v l ¾~ ®Â"±",¢9?‚6;{6:Ždfå³¶ðàáÂ$¿'¿)©OWͱ³ÞÐÑÅ-Å/«*Ç"4À"3Øs}ôÖÙñÕØðÖÙúðñûòóÇ%8Ç&:È(=È*@È+AÃ*?É5H½=MÀM\ùñòÄ+BÉ.FÉ/GÉ0IË2MË3OÈ2NÇ%9J.F¯p«±r®N3O²v´³x·µ{»@-EL6RO8V08G3O1:bGm3=4>7 C5AgOx?2ME7TmW†|d™}gŽu²š„Á^Vƒøððèààöððýýýûûûúúúôôôÿÿÿ!ù,Ï; H° AJýéÃg’ÁN’Þ´YcŒ—* FrÃM™/]¨HI‚h $5iÎŒ³å “%B€øéTÉ ™0P8ÁÒ$À“2,Êã…‹•,Z(µ¤D‡ŒðL‰¢É¥¨@¡€¢;GŒÉák$<Hd‡ >`ê'‘!\2ƒ†?v°hp‰‡  uÚ@‹ .¨Xñà = q˜0 )f$Tp„"F¼ˆQƒ´ÁGrểCÇÁ€;uima-as-2.3.1/uima-as/issuesFixed/images/icon_info_sml.gif000066400000000000000000000011361160020716200234460ustar00rootroot00000000000000GIF89aæÿÿÿýýþùúüøùûÚàërƒžÑÙæÕÜè×ÞéÖÝè 'SG]}]y¢Vp–OgŠLc…J`EYxCWtI^~FZyeªh„¬gƒ«j…­l‡®mˆ¯pаXl‹t²v´dy˜w´|”·~•¸w­€—¹uŠ©nž„š»ƒ™º…›¼zŽ¬ŠŸ¿w‰¤‹ ¿¡À¤Â…—²™¬Ç˜«Æ‚’©’¢º†•«¡²Ë¦¶Î©¹Ð­¼Ò¬»ÑŸ¬À±¿Ô°¾ÓµÂ֏Ũ¼ÈÚÁÌÝÃÎÞÂÍݲ¼ËÉÓâÆÐßËÔâÍÖäÌÕãÓÛçÒÚæÈÏÙéíóãçíõ÷úôöùóõø@TpAUqyŽ«}ަ•©Åž°É§´Å¹ÆØÀÉÕàæîßåíáçïåêñäéððó÷ïòöÝäíÜãìÛâëçìòæëñìðõëïôêîóØßçâèïñô÷öøúûüýúûüþþþÿÿÿ!ùr,»€r‚ƒ„…‚`fg`l\d LGƒ^qqopnQmbj.‡™MObhNg r\oP6 [igŒ%‚d›mE4k_^eL‚ PRah YcHB‚ËjfV ‚FØ`\- 5Z=97‚D`] I' 1ì30‚@KICA@,¨"‹éøcÇ $X ñA‚ ?tàÀrå…Š!8h 2è† @ Pa†b ;uima-as-2.3.1/uima-as/issuesFixed/images/icon_success_sml.gif000066400000000000000000000017361160020716200241710ustar00rootroot00000000000000GIF89a÷ÿÿÿ„™º¦¶Î§·Î¼ÈÚÇÑà¿ÈÕc~¢¡±Çßåíw¬™´¦¸Ë—®¿³Ã©½ËSq‚*/‚¡­%(#8='*!37,/(CH'AF&>B/2*,)FI"!Prkœ¼´¢À¸j•†„¬œtœ‹¢Å²FcOƒ­7G;ÅÖÈÈ£¬Ö©·Û´¸ß²2B.²á¥³â¦·ã«¸ä¬¸ä­ºå¯¼å±Â€¶ã©²à¢²à£œÎˆ¬Þ˜«Ü™©Ù—«Û—]•BÎ…¢Ô‹©Û‘Í„­Õ—]”>¡Ô„çñሻf“Çr¿mˆ¶jÐæÂøûöbœ7Jw*U‡0WŠ2•ÑiÔäÈmª;Ag$r³?o¬=ež8fž8b›7ZŽ2YŠ1S‚.Jt)Qy1‰ËW…½Yu¤Qe‹FcˆE—¹{›½{“h­Î×Çîóê„ÊGv·@uµ?k¥:hž7`’3Jr(ÃE^‘3Q|,S~-Dh%}¼DEi&‹ÎQ²Å¢ÖàÍÏ×ÈãëÜIm&Qx+Ot)Mo(êïåLl&Ig%Gc$õ÷òþþþûûû÷÷÷ÿÿÿ!ù‹,» H° A!,X E aCF5pAÆ *01#†"NT0è‡A˜ ¡ =†Y²&€ NR¤I’1ÅÁbà€JðÃ'À:oŒ8bŠ˜3‡ˆ-ÃeË“‹„у™>Ô|‰Â¥ (ØÌq£Å‹•4häÔ±(Ћm®TÉ"Jž;*d(Å"4l¨p ,Pø°( ;uima-as-2.3.1/uima-as/issuesFixed/images/icon_warning_sml.gif000066400000000000000000000011001160020716200241470ustar00rootroot00000000000000GIF89aæÿÿÿ¸œ§º¡«b`awr}“ޤ˜ º¡¨¿¬²Æ~ް„’²j| £¯ÇfsŠ„™º§·Î·Ä×ÄÏßËÔ⣴ÌÜãì[M@Kƒ? àk®T£N ”G J$ùwñsïrêpÛi×fÖfÔeÎcÍbÇ_¿[¼Z°T©Q¤OšJ E D E ƒ? i2 çnämÃ]¹X·WµV•H ‰A €= h2 ]-Ëbùzù{ìz&«Z¿i&×iù(Ëj&ùƒ1ùƒ2ú†7Ìm-D2%Ìp4úŠBúŽIØ|DÌu@ú”Yú˜aæ\Ì}R׈[¦v[úmI:2̓`û¡vû¤û§ƒÙ‘s=.()ûª‹+*û­‘ç ….!Ó—<,&é¤5&!:*%²‡y*Švp묜*,-¨‡‚š~zÇŸžÿÿÿ!ùv,€v‚ƒ„…† †…oae‹ƒd][s’v iT ‹u^PW†\Z¥MI…gXU¥GAD„SRQ¥?4ƒVONK¥)#C‚nJHFE0=7'6*v B@%¥+8, l !5"9¥.:/Lt"$&(-3:øc‡ Yìø‚f3càÄ‘#¦ ;;uima-as-2.3.1/uima-as/issuesFixed/images/logos/000077500000000000000000000000001160020716200212635ustar00rootroot00000000000000uima-as-2.3.1/uima-as/issuesFixed/images/logos/build-by-maven-black.png000066400000000000000000000043661160020716200256670ustar00rootroot00000000000000‰PNG  IHDRZ#ž/ pHYs.#.#x¥?vtIME×úļ•IDATXÃíXiLTY>ï½* ( ±J¶BZ@–€Š›ˆ†%‚‡?hÆ?"jb‚Qd~(„d\ÆA $ &Œ2™¸1 ›€ »‘"R`UJ-¼Zîü8Ìm„žîÎ4É´NêÇ©sÏ}ïÞï~ïœsÀš¬É𬒤¦¦ÖÔÔÔÔÔTWWzxx¬ôQ(‡bY¶¤¤ÄÕÕU&“‰Å⥣¹¹¹ßÄfÙ_ôغu+!¤ªªª¶¶6<<¼¼¼|¥ÏÜÜÜøø8˲™™™NNNçÎKMM¥£~~~1118`rrR©T¶¶¶ÖÔÔ@II‰D"€ôôô¤¤$www???tÞ¶m[JJJ^^µÀúõë¯_¿^__Ÿ””ÄqÜ… eáááÇ …çÏŸ_J¨ß5‰‰‰gÏž---­¨¨(++€ýû÷;;;@TTTxxx@@Àž={Ðùýû÷ÝÝݳ³³K¿¸ºººòòòêêjOOOooï´´4ÈÍÍ%„0 # ¿vhµÚáááööö“'Or÷3Î&“É`0LOOó>þÕ«W‹¥¹¹ùÒ¥K·oߎãöíÛçääô °czz:;;;>>¦¦¦<¸°°PQQQUU¥ÑhZ[[ggg ÃÄÄ!dppÐn·777·µµ€Á`P*•>ôðð¸|ùòÔÔܽ{÷ðáà  :;;—~_ߘ–ý¯äZ9Äqœ@ð#úiii•••ke@~~~___ppðïma̯ôsvvvssC]¯×B‚‚‚<==­Vëàààüü<ùøø2 £R©&''†Y‡Ãáp|«çyæÌÜ€ÕjÝ»wï³gÏìv;!„2<<ìçç'•J¯^½j2™Ðh2™²²²þ°ônllÄ}Z­V£ÑH¾–G-3~;ðue·H¹/A„”“:3Ëø‚‚ù{‘º CíK7lسk×®àààeC,Ë¢?G®®®[¶l‰ˆˆXÍ´%ÆÇÇé>5MSSÓ‡–nÞh4>}ú´»»›ZL&“H$Â'ämsžøóúù<©-_fË—Yóe†¤ÿø^âïÆâz{{µZ­V«MNN¦ï½xñ"ëëë¦ÈÈÈÐó°ÙlCCCééétJQQN¹víÚéÓ§ÕjµÃá°ÛíoÞ¼ùî»ïV???‡Ã+¸qã^.ÂÂÂèÎ{{{7n܈)“ÒD§ÓÑüÒô½X8*CthnnÆYGŽAKPPÐüü~ü6›Íf³¡q``€Ë·ZûÁ~ñ­Ö‰þ¦õ¼¡«z»X¤†x,Öû£££¨ÈårTŠ‹‹÷ÊÊʾ¾¾ºº:±X<33£P(¶o߈e‹H$ÊÎÎÆr122§÷ôô;vìèÑ£´hÆ[…"=..³Ùüöí[Ô#""¨CWW½¹Ò‹,5Àé—&r1»}ƒ@.f‹à¾7Ø…B‘““ƒE`II œ:uÊÝÝjkkœœ°c€F ‘Éd Óéñ0ÒÓÓ322@¥R­2£££z½uÚ „tww£Fó1…Ãß=©pÉ ròwc™¯3{‡Æ¶–eKKK1øÎÍ͉D"Ú@)(((((X¶BäæÎ;‘Å”˜¾¾¾¨tvv® ÃÄÆÆRÒ×PŒT*ÕÌÌÌ2#…#̃{šå.³Ð3ck›²M|¶ĸø¸² üccc‡ƒeY¹\¾{÷n<Ï—/_ÖÕÕ€D"Á]Y,–'OžB–-òñãÇþU*•”­´Ø£Æß$¡¡¡4åååÑ\£R©ÐØÐÐ@oݺ…F­V‹ukŸFÍ¿'‰9`ƒ3cøAŠaUâÄÐuùò…¢V«ÛÚÚ!<ÏÓíyyya™c4×­[·l…Ø+á8n``ßN/– 42 ³ ¡tåcõéïᅩ„ÇEGG£Ž—e Æk‘€½Ÿìv, ‰… ¼ÓÚ¾ð„¶±]äë뛀1‚ž§^¯Ÿ˜˜À:¢²²™Â²lllìµk×JKKÀÓÓsóæÍØCèééÁ‰;vì ÔXɩ߇^¯Y™k(F2™ D„€~aq‰®ÿÚï>œëñ×Ý‹M@ú¥, 0;;[TTDÿò<_VV†ûÉÉÉQ«ÕƒÁb±tuuåååõ÷÷c,Ãp344DåW{{ûêô; Ïó<Ï¿{÷îóçÏhŒŽŽFãüüüëׯi——Îó  VD„Oj© ´½÷ìG>»’ø|aÒ?æÎ™3÷ÎïÌ™™sJ!„`&‰^€`Ž/ƒãùóç&)--­»»{¶ŽÑhÌÈÈ€üüüW¯^1 óîÝ;2j0²²²~!pô÷÷wtt>|øÐ¡C"‘h÷îݳuø|~`` |8::ZRR‚•%É–-[ÂÃÃW¬XA,hµÚÀÀÀœœœÜÜÜššš¦‹ŠŠ ªªJ¯×ÛÙÙY­Ö¯^ææ ‡£££R©ô÷÷ß°aÃ¥K—ŒFãg”íìì\]]¥R©D"!ÂÕ«WÇÇÇûùù%&&VWWïÚµëîÝ»¡[·n%$$À±cÇ”Jå×…Ã~Žzr¹<66óuuuµµµ€slll.„B!fx<EQnnnµµµ­­­*•êËØ€€‰DÒÙÙi³Ù***fëS5>>>]ÒÔÔÔÝÝm±X***Ö­[ )))ÑÑÑ)FóöíÛo‰DÂ0L\\\\\ÜÙ³góóó ERRRaaáúõë—.]êééÉãñüýýÀÇÇG,‡„„ÔÔÔTVV’º£V«=„áØ¹sg{{û¾}û°Î•+WH2þj„¾€l6›Ífû±Q–e9Ž›!™˜˜ }}}aaa3t¾.Á×zqUUU``à½{÷Ðω¨/©mcccÃÃÃ|>ßÅÅ…¢(,´Z­ƒ¢(™Lfoÿ£©šã8Žã>£ðsß,¥¥¥A“ÔÖÖ–žžîææ†óÂÞ½{ÇÇÇ-ËåË—hš¦i:44´«« }Sô?À‘œœLªÆì!55uãÆ$F0ÅÆÆÎ2á 3{l–/ùnƒ&“é'S˲ ÃÌ1CÍŽãBCC§7Z …ÂÁÁaFquww—J¥Dâáá1e¡ö{6w‡íO+lô¶ð´¥úÚþº«.@¬ !ôæÍ›èèh•Jc6›ÉKU*•J¥*..ÆB­V»gϹ\.‹%‰R©ÌÌÌ$z||\­V«Tªèè覦¦'Nxzz:99)•ÊŠŠŠyƒÃd2‘3&&w†„ƒR©Ôh4V«upp âëë;U†þ¼ÎvT6ûÇÕN·oooßÝݧ”——cû^^^&“ !tîÜ9‡¡wtt$¸9rOimm¥ihš–ÉdÓWËÅÅeddd~ਫ«#vËË˱°§§ÇÎÎ O:E–çؾ}ûdp³÷qÿ¾Ä½~‚Þ¾â^ü‡ýËz û}2VY¾|9žU__×9(({^RR‚º~ý:v5** CVSS#ÀÁÁãUPP@zß­[·ž>}:22’D´N§›8rss?ôm4Ý×ׇ…ÓÏì·o߯B½^OúñÌÌÌ÷± 1îM+×vŸ-øÝ8nŸÅƒjµÏ*++C]¼x?nÞ¼™ã8³ÙìããƒýÔjµ}“„¡'®8pÏ:sæ 6‹Ïø”`4?ïæ\ë\}}=f¼¼¼/^Lún’5BBB0ÿôéSÒž!{¹šBÔúOêÖúQÆñú fHtôõõ™L&|]$ ÏŸ?OQTcc#îY­Vë”ÙIâñx2™Œã8Ÿñ€¡¡!²s§çµÿÿDzlcc#æW­ZEš…ÇcÆÓÓ“`D€ãóù+W®Ôó„ûûoad( ܃)_ƒØý+l°ãQ+±¾ŸŸfôz}^^^OO¤¤¤à*†ïVÀÝÝGH¡PH¥Òþþþ®®.Œ¬¡¡3áááós¢5/^¼À<©/V«µ¹¹y†p:ÞÞÞ#ôS02”ú;z〢ÑëfTõ7€_yƒÄuFt444`# …"--¼3QQQ7nܘÝ:@ss3Ìàà`±XŒG=z4w8æt„klldYv†çƒƒƒ¯_¿þiŒ&FQÿ³©}AÑ`³ úb@(ï©°÷ññÁqWUUe4)ŠÊÎÎ&åŒÜ$•––a·M&ÓÍ›7###ñõ-¹|#ž›Íæ––ÌGDDÌOthµZ̈D"òYÓ1Z³f fzzzôzýGpØóAà£Fà ÷Snè0†)¦àX¶l™H$b/µZ­Þ±cˆˆØ´iSee¥ÅbÙ¿ÿÁƒE"Ñèè(BhÉ’% …â“pèt:|i “ÉÈfüÒèÐétb±X,“lôäÉ,tvvÆÂ––¡Pˆå0²ãÑ[¿¾`ì=Ò?£"~2w°€½¼C§§C???@ œ³³³qY%e²¸¸8)) ·,ËŽŒŒP%—Ë?Ž¡££C …BGCCŸÏk×®Ñ1’æt„{ÿþ½ÅbÁÙÑÉÉ GFFpÄÒ4íââBu£££¤í™òçÝÔ÷x"Êc%ˆóÞ,à´¦}¥Á`˜˜˜Àиºº~òc C{{»Á`îîî¾¾¾¸®s700€Ëœ\.ÇÎ3 Ã0 ˆÅâE‹Í ;-À±@ÿ§wýí¿ƒIEND®B`‚uima-as-2.3.1/uima-as/issuesFixed/images/logos/maven-feather.png000066400000000000000000000064021160020716200245150ustar00rootroot00000000000000‰PNG  IHDRZ#ž/ pHYs.#.#x¥?vgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF xIDATxÚb`H €øÿÿÿ£ FF€blnÚ³gÏ÷ïß!ìß¿?xüä8û÷ïߟ?´¶ €XˆQtãÆ®®.[LL,##CAAMÍû÷ï'Ož\WW7eÊooo g„„„ ²oß¾1cFuu5A»øøøBCCýýý£££&ì=q†ñߟß7¿j›%ôó7£™»¾º€¾§²<· Õƒ €ˆJÏŸ?¿yófZZZJJ ''gpp0¦666mmm cß¾}oÞ¼Ù°aCoo/\öÛ·oÀh'Æ.33³ ­366^½zõ›W¯ž<{sbá‘['>>¿ðú׌}ßÒ'|vJzdt9&çî’Ÿ^=§bp±™E@@ÀÂÂÂÊÊ*;;ûÉ“'@‘Ù³g_¿~ȸzõêÂ… 1y÷î]ˆâ>½´uëÖcÇŽÁMøóçO}}½¯¯ïâÅ‹¥Õ¤I“._¾ ÿüùsUUÕß¿ÉçÖ­[@`Ê&F ™Ë–-›ÒѼ}ãªÝOžïgU:̪¾•Mú›øÍŸ"oo3².?ÚÕþÌ)ôJzÖU ßݽýÿÿ? ƒ €XˆTwçÎÖÖV £8P^^2”••555¡søða`d–••¥xyy½¼¼€Ztuuá&œ>}:77˜¢¢¢ää䘘˜€îééÙµk׳gϘ™™ /Ô²&&&ÁÑ «7lxóàÉž›[ÿ1òK3+J2‰>eggaýÿAýï3ÁŸœ|×~‹Þ9ùgñÑÇš3«©ý7Va××ááã–•eçæáæ$)8ˆØààááQWW:èî9sæ$&&âQ T#** Ì2Àp XXÔ ÊÔÔT`vww¯[·...( ,¸b`¨\¸|åç¿á1Ñúg]¾±ã*ËŸÓ ïþy|÷?';#?ûFAvVN=–Ï\JýýÌzñŸäõK_÷ß`ý¸ö×ï÷r|ÿy9ÿëè y™0É*°rˆ ÉK±rpã÷&@!!!ö‰'Ž= ¯¡á~ÀÁÁa°²²«4)))`šÌ2ööö˜õ¿ž¶–¢œÜ?†ÿ?ï­ÿs;èày>•Íìò/~ýþø÷Å“ßOÖÿ}ÉÈÀ´•]މ_ŒEÒœé;ëqÖ,² _¾~ù÷å:»ÜïZGÜÙpùàY¡GLºÂL"¼R&¬œŒŒX €"68~þüùâÅ X@= ¥¥Œy`VúdóæÍ@ïaÖá?~ü@9wî܃€¡T_\\ ‰ŒŒ,**rtt„„° QUU&+¨ËXX@V%=ú÷yúµgO}þ{ýãï;v¡ïìo¾ÿþ÷öü¿ï/þ¾½ÿëìq†?ŒŒ‚BŒüŒlߘ$¤™lÙYßþ[÷ÞÀéïÃ{ßEïüÐT8÷ºðÒu/NWÍÿ‚*†üÒpGQÁô9°ÀÖŠX•*))S{zzúòåËXÁXŽ nnnSSÓ &ìܹÓÝÝRïkßœœ`1±³³  æ©S§Bl™?~rr2<8à€]>5ó½¯çûƒ[¥Vï×:rùínŽ_ìŸþ³²³ü÷bz΢øŸUæ1Ãÿwÿ¾?ÿÿëÝ`ûäþ­¿ÿÿÿõ‘‘Møÿ¡Íÿ¿=þ%æËðòòC.‘»¿¬Å?2~øûñÍ3Öoûï=ãc°“SòçÚ@µJ%+¤¤À* l71‚²°~ „ ` L˜‰ »uÿþ}ýòñãÝóßoÿ³ü—ãï½ïØt˜þúýå?#+'3Ã'&.&¶L,Ϲÿ1ü8Ä .Êð‘õß÷Ûÿ9˜þ}øÏ$ðë,»fì.qfIvvF†ÿ~þäÒõŠ™t@ X#}÷îÝ………ÀšÅÃÃT½¿ÿüùöéãßï~ðëùß½çî¾öÿÝŽŸ‹ýá~ø‡…õϯŸ9¿ü}ÃÆñô¿€îï·¹9Y¿þüÍÎÅõó÷/A®2Ìì‘L?M¹þ}aüøƒ]XÂÅÒ!DQp Q`ÛÀÖ'<†õ%° ä ó?.½ÿÀ"ÐñÀTóû÷/†ÿÿ|ÿñíÝ›¿?~þ{ûö˯ÿ‡nþåÿ÷—‡ùïN%A†/Œllßò‰sÈÊ1üøóçý‡?ÊÜl¼¼\\<À4t3@AM$¬]»V€M/`› X.BÊ`kXpþúõkÞ¼yÀR– €íË{÷îý:è€"!8€Å¼Ö¶AÐb Ø6sssC+€u3†1ÿþÿüöÿû§ÿ~QâtHüøñ#0‰áW ,à€õAeà bƒh0¶‘ZÀÊ…‹‹ ­r•••6çá"À–„£‹þNôÿS£û§TñO‰üŸr•?]ÎÿÌþÿ÷PöñãÇÀXm»ºº;8pKm6{0X±bDغ ¶ƒ€õ°ÊFLKK °‘&R`T4 Xµ—””ÈËËkC 2`O08ˆØàƼ‰ t1°Å¬#+ }@.0Ò^¾| ¸ Úíþäc¢‡æ"›,M€Íˆ–7BÌv  €"ÀôÀ†2<Ülˆ`›˜O!Í|`á…[ÀîË—/øƒ €ˆ `Kn.ЕÁGÁkY`×¥2üüü`‰ûÇß™1ÿÎù÷ðÂÿ×÷ÿÝ>ò·Ó eC”Û`]§N‚Ä3°‚øØŠ,]ºâUH:tØ*ŠÓ)$¼€KxÛ×Çǧ¡¡ÁÚÚž¢Ý(üÁ@ÄÇĉá«§OŸB‘ûì[¶l[ðö80£æã?ÿ?¿ý÷øò¿«{þÎŽƒÇ–6ˆ$0‘CtmذÈ9s&„ ¬‰A ÌAÀÄŸÀüò A÷jRRDWcc#ÄXHÒKxÿþ=þà bë9`ŒAÀt+&&owÃK `3¾rå ¼ydxÿ”).ï`xó€áïo”GÁ€§ 'Q ì@CülÝÍ?{ö,d˜ÆÂ0Œ€YjðT iø°' ϹÈåV@,D¶>®°ŒŒà…“'OBÀâ Fð€VÀ Ô÷è¿é _ÞƒAVQÎ[èÿÞ) ~10³2Ê@Ô«©©Á[«“&MæD Ø©Ôb± –Öð€ƒ`¹ôêóçÏU;$tàAvæÌÃÒÒ’ Oˆ¨à¦±Û·oÃG«àÍ­óçÏ£ "‡¢¢"$Œþ¯¯…0!xW2¹002ýxþÿ®~"E^Q´ÔôÄ '+**àÖAÀ‚cÙ²eh-1HRº’0õôô€õDöøñãÄ@5Lî ²Ï5ÈÇ ‡ÑϯÿŸ_Gä `·Øâ8µ‚ìFED² t·k×.`3° ¯Îà#IÀÖàÂ… !Þæ©U«V ËàáeøàÜçÀçÒ¥K¶••AŸQ©XtAœœœpg!‡‘¹¹9„LáÀ¤Ž,l ì< _߃æs¥´þ¿ºÃðù-4€”Á!##4Ød‚D5°dõ÷÷‡Ë=ì »ÈÀ¶oBB°ï TüõëW bqqq`:ÂÀòõõë×@°dgF< €ˆJ@C¹Á˜á¥Ñ…  ‚‚‚‚@qˆ 0*€…DF̬L>• lœàNΧÿÏ®3ZÅ3Ë2°°ƒ¢rqt1;Í& Hµ ¯&-±ÔÔTHsÀF0Ûcyyy„póæM ^ àÁÌwÀ" (hkkKL¿ €ˆêÂ}úô 'ÒØÂƒ]I±@GÃ'€:`ŒÁ›=ÿ¼{üÿé`Tprò3|~É, |â H®¶»íKHÐ`|ÀÕ\»v H= ,Võ¤^V+*HA<ÿ € `ôðóóœv ÑY8”à ¦ÑP@4ŠP@€„Z¤':ævrIEND®B`‚uima-as-2.3.1/uima-as/issuesFixed/images/newwindow.png000066400000000000000000000003341160020716200226670ustar00rootroot00000000000000‰PNG  IHDR Óº&gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe< PLTEuuu™ÿÿÿÿÿÿ€8ÉÙtRNSÿÿÿ@*©ôFIDATxÚb`fff„f€b±™@€‘ €€Æ „8@!³™ @`6Ô€±L€Ø& ±´Â^IEND®B`‚uima-as-2.3.1/uima-as/issuesFixed/jira-report.html000066400000000000000000000663011160020716200220250ustar00rootroot00000000000000 JIRA Report - JIRA Report

JIRA Report

Type Key Status Summary
Bug UIMA-1298 Closed A shared remote CM hangs when one of its clients runs out of memory
Bug UIMA-1680 Closed Async Scaleout Monitor has many issues
Bug UIMA-1728 Closed UIMA AS Service logs falsely Stopping Collocated Delegate Cas Multiplier message
Bug UIMA-1734 Closed UIMA-AS Deployment Descriptor doesn't work with Eclipse 3.4.2
Bug UIMA-1742 Closed UIMA AS Aggregate not exposing number of consumer threads on its delegate's reply queues
Bug UIMA-1743 Closed UIMA AS aggregate may hang when one of its primitive delgates fails during initialization
Bug UIMA-1751 Closed Fix NPE while looking up MessageProducer
Bug UIMA-1754 Closed Incorrect description of getCAS() method in UIMA AS documentation
Bug UIMA-1766 Closed Fix Memory Leak in UIMA AS Service
Bug UIMA-1770 Closed UIMA AS Aggregate Client sends FreeCas requests to a wrong broker
Bug UIMA-1772 Closed Fix UIMA AS Aggregate Log Entry When Executing Flow Controller step
Bug UIMA-1781 Closed UIMA AS Client sends a CPC request too soon
Bug UIMA-1786 Closed UIMA AS aggregate CM hangs due to client not sending Free Cas Request
Bug UIMA-1791 Closed UIMA AS logs Timeouts at INFO level instead of WARNING
Bug UIMA-1792 Closed UIMA AS dumps debug messages to stdout
Bug UIMA-1797 Closed UIMA AS processParentLast logic is not working correctly
Bug UIMA-1800 Closed UIMA AS should block msg submitter thread if a thread pool is empty
Bug UIMA-1801 Closed UIMA AS Aggregate sends STOP message to colocated delegate during shutdown
Bug UIMA-1807 Closed UIMA AS jmx monitor throws javax.management.AttributeNotFoundException while collecting stats
Bug UIMA-1831 Closed UIMA AS test deployment descriptors contain absolute paths instead of relative paths
Bug UIMA-1844 Closed add exclude for release.properties to those poms that override the default apache-rat-plugin configuration of excludes
Bug UIMA-1846 Closed Correct issues around building eclipse plugins and update site
Bug UIMA-1847 Closed Eclipse plugins not working with more recent version of maven-bundle-plugin
Bug UIMA-1849 Closed Deployment file in UIMA AS extended tests uses absolute instead of relative path
Bug UIMA-1850 Closed UIMA AS process error handler incorrectly handles a CAS that arrives after a timeout
Bug UIMA-1851 Closed Fix UIMA AS jUnit test to generate files into uimaj-as-activemq/target/temp directory
Bug UIMA-1854 Closed fixup uima-as eclipse plugins for deployeditor and add to eclipse update site
Bug UIMA-1855 Closed Address problems reported by Findbugs in UIMA AS
Bug UIMA-1856 Closed Restore RunRemoteAsyncAE in UIMA AS examples to its original state
Bug UIMA-1872 Closed UIMA AS Primitive Service ResourceInitializationException is Silently Handled
Bug UIMA-1883 Closed UIMA shell scripts (e.g. cvd.sh) do not support space in filenames
Bug UIMA-1902 Closed UIMA AS detection of missing client reply queue is not working leading to client timeouts
Bug UIMA-1915 Closed UIMA AS client code synchronizes same critical region twice
Bug UIMA-1936 Closed UIMA AS code base should log all trace msgs instead dumping to stdout
Bug UIMA-1937 Closed UIMA AS JMX Monitor throws javax.management.AttributeNotFoundException: No such attribute: AvailableInstances
Bug UIMA-1942 Closed Our batch scripts can't handle the default path for 32bit software on Win64 machines as it contains parentheses
Bug UIMA-1944 Closed change build parenting poms to introduce additional parent, add top level build point for multi-module projects
Bug UIMA-1955 Closed remove unused dependency on missing activemq artifact
Bug UIMA-1960 Closed enable uima-as to check for proper version of base UIMA
Bug UIMA-1971 Closed AggregateAnalysisEngineController should disable Delta CAS serialization if a remote delegate replies with a full CAS
Bug UIMA-1973 Closed Add getTaskExecutor() method to UimaDefaultMessageListenerContainer
Bug UIMA-1974 Closed UIMA AS assembly script creates bogus folders in bin directory
Bug UIMA-1975 Closed UIMA AS extended tests import mx4j classes for no reason
Bug UIMA-1976 Closed Deprecate BrokerDeployer in UIMA AS
Bug UIMA-1979 Closed UIMA AS allows concurrent access to JMS Session instance
Bug UIMA-1980 Closed UIMA AS extended test testTerminateOnFlowControllerExceptionOnDisable() fails
Bug UIMA-1981 Closed UIMA AS releases parent CAS prematurely
Bug UIMA-1986 Closed Fix Synchronization on Long could deadlock Reported by Findbugs
Bug UIMA-1994 Closed Fix NPE in UIMA AS Client When Running with Log Level > INFO
Bug UIMA-1995 Closed AMQ 5.4.1 Broker from UIMA AS 2.3.1 not starting on Linux
Bug UIMA-1996 Closed Remove deprecated destroyApplicationContextOnStop property from activemq-nojournal.xml
Bug UIMA-1997 Closed UIMA AS build does not generate distribution for linux (*.tar.gz)
Bug UIMA-2001 Closed Fix UIMA AS deployment desciptor from extended tests
Bug UIMA-2005 Closed Binary assembly script for UIMA AS doesnt copy AMQ README.txt
Bug UIMA-2007 Closed uima-as-osgi plugin is missing most of its content
Bug UIMA-2010 Closed Rollback UIMA AS poms to 2.3.1 SNAPSHOT
Bug UIMA-2027 Closed UIMA AS binary assembly script doesnt include uima as docs in a distribution
Bug UIMA-2030 Closed Fix invalid paths in various uima as scripts
Bug UIMA-2031 Closed FileSystemCollectionReader.xml in UIMA AS examples doesnt specify Language parameter
Bug UIMA-2033 Closed some parent poms putting apache snapshot repo for plugins under wrong xml element
Bug UIMA-2038 Closed UIMA AS process does not terminate reliably
Bug UIMA-2044 Closed UIMA AS Spring Container throws ava.lang.IllegalArgumentException: Display name must not be empty
Bug UIMA-2058 Closed UIMA AS example program RunRemoteAsyncAE calls System.exit()
Bug UIMA-2063 Closed UIMA AS Build Requires spring-aop-3.0.3.RELEASE.jar
Bug UIMA-2064 Closed UIMA AS client doesnt always throw ResourceProcessException
Bug UIMA-2069 Closed Remove hardcoded port numbers from UIMA AS tests
Bug UIMA-2072 Closed Fix UIMA AS log message
Bug UIMA-2075 Closed UIMA AS deploy script Deploy_NoOpAnotatorWithCpCDelay contains wrong AE descriptor name
Bug UIMA-2076 Closed Modify maven-failsafe-plugin in uimaj-as-activemq pom.xml to use UTF-8 encoding
Bug UIMA-2080 Closed UIMA AS serice ShutdownHook dumps message to stderr
Bug UIMA-2081 Closed UIMA-AS extended test intermittent failure - message InvalidDestinationException: Cannot publish to a deleted Destination: temp-queue ...
Bug UIMA-2083 Closed UIMA AS service always uses binary serialization
Bug UIMA-2085 Closed UIMA AS source distribution contains plain vanilla versions of LICENCE and NOTICE files
Bug UIMA-2087 Closed UIMA AS assembly script includes an incorrect version of .classpath
Bug UIMA-2088 Closed UIMA AS .classpath for examples contains duplicate jar entries
Bug UIMA-2090 Closed UIMA AS eclipse launch scripts not setup correctly
Bug UIMA-2091 Closed UIMA AS assembly script should copy project file from base uima examples
Improvement UIMA-1542 Closed dd2spring error messages specifying descriptor Keys should include parents
Improvement UIMA-1667 Closed UIMA AS should also log the ActiveMQ version on startup
Improvement UIMA-1779 Closed UimaAsynchronousEngine should have javadoc for constants
Improvement UIMA-1798 Closed Add exclusion of uima-cpe in uimaj-as-activemq pom
Improvement UIMA-1799 Closed UIMA AS should provide a way to increase prefetch size on a reply queue
Improvement UIMA-1865 Closed lock down transitive dependency version for Eclipse components
Improvement UIMA-1868 Closed cleanup distribution assembly
Improvement UIMA-1869 Closed Remove KEYS files from source and bin distributions
Improvement UIMA-1876 Closed Upgrade UIMA AS to a new version of ActiveMQ
Improvement UIMA-1885 Closed Allow placeholders for endpoint names in deployment descriptors
Improvement UIMA-1935 Closed update eclipse feature projects for 2.3.1
Improvement UIMA-1952 Closed Change UIMA-AS binary build to include base UIMA
Improvement UIMA-1978 Closed Copy runUimaClass.* scripts from uimaj to uima-as
Improvement UIMA-1999 Closed Modify UIMA AS poms to move RAT plugins to a new pluginManagement section
Improvement UIMA-2004 Closed Cleanup UIMA AS binary assembly
Improvement UIMA-2024 Closed Add to uima-as project a new file containing AMQ components excluded from UIMA AS release
Improvement UIMA-2025 Closed Merge uima-as and uima-as-distr projects
Improvement UIMA-2029 Closed Modify RunRemoteAsyncAE status message on service startup
Improvement UIMA-2048 Closed UIMA AS should identify a delegate service in a Timeout Exception
Improvement UIMA-2059 Closed Modify UIMA AS assembly script to include version in the base directory name
Improvement UIMA-2065 Closed UIMA AS client needs ShutdownHook to close broker connection
Improvement UIMA-2071 Closed Change the specification of sorting keys to correspond to the sequence needed by the latest Jira upgrade
Improvement UIMA-2079 Closed UIMA-AS Service logs a pid on startup, it should be separated with a space
Improvement UIMA-2084 Closed Extend UIMA AS service JMX API to dump service state
New Feature UIMA-1794 Closed Add error handling option for UIMA AS services accessed by core UIMA
New Feature UIMA-1818 Closed Provide simple mechanism to capture all CASes input to specified delegate
New Feature UIMA-1938 Closed Modify UIMA AS Primitive Service to optionally dump JVM stack if process() method takes too long
Task UIMA-1843 Closed update poms to refer to released version of parent-pom-eclipse-plugins-ibm-notice
Task UIMA-1988 Closed Update uima-website KEYS file with a new Public Key for JC
Task UIMA-1989 Closed Update UIMA AS README for the new 2.3.1 release
Task UIMA-1998 Closed Update LICENSE and NOTICE files for UIMA AS
Task UIMA-2000 Closed Remove Docbook Processing from uima-as-parent pom.xml
Task UIMA-2009 Closed Modify Eclipse update site scripts
Task UIMA-2055 Closed Refactor UIMA AS JmsOutputChannel code

uima-as-2.3.1/uima-as/pom.xml000066400000000000000000000470001160020716200157160ustar00rootroot00000000000000 4.0.0 org.apache.uima uima-as-parent 2.3.1 ../uima-as-parent/pom.xml uima-as pom 2.3.1 UIMA-AS: ${project.artifactId} The top project for UIMA-AS ${uimaWebsiteUrl} scm:svn:http://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/uima-as scm:svn:https://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/uima-as http://svn.apache.org/viewvc/uima/uima-as/tags/uima-as-2.3.1-rc7/uima-as 12315335 ${project.artifactId} uima-as-${project.version} org.apache.uima uimaj-distr zip bin ${uimajDependencyVersion} org.apache.uima uimaj-as-core ${project.version} org.apache.uima uimaj-as-activemq ${project.version} org.apache.uima uimaj-as-jms ${project.version} org.apache.uima uimaj-as-camel ${project.version} org.apache.uima uimaj-ep-deployeditor ${project.version} org.apache.uima uimaj-ep-runtime-deployeditor ${project.version} org.apache.uima uimaj-as-osgi-runtime ${project.version} org.apache.uima uimaj-test-util ${uimajDependencyVersion} commons-collections commons-collections 3.2.1 commons-pool commons-pool 1.5.4 commons-logging commons-logging 1.1.1 commons-codec commons-codec 1.2 commons-httpclient commons-httpclient 3.1 org.springframework spring-core 3.0.3.RELEASE org.springframework spring-asm 3.0.3.RELEASE org.springframework spring-aop 3.0.3.RELEASE org.springframework spring-beans 3.0.3.RELEASE org.springframework spring-context 3.0.3.RELEASE org.springframework spring-expression 3.0.3.RELEASE org.springframework spring-tx 3.0.3.RELEASE org.springframework spring-jms 3.0.3.RELEASE org.apache.activemq activemq-all 5.4.1 org.apache.activemq activemq-jaas 5.4.1 org.apache.activemq activemq-web 5.4.1 org.apache.activemq activemq-spring 5.4.1 org.apache.activemq activemq-optional 5.4.1 org.apache.activemq kahadb 5.4.1 org.apache.geronimo.specs geronimo-jms_1.1_spec 1.1 org.apache.geronimo.specs geronimo-j2ee-management_1.1_spec 1.0.1 org.apache.geronimo.specs geronimo-servlet_2.5_spec 1.2 org.eclipse.jetty.aggregate jetty-all-server 7.0.1.v20091125 xmlpull xmlpull 1.1.3.4d_b4_min com.thoughtworks.xstream xstream 1.3.1 commons-beanutils commons-beanutils 1.6.1 commons-dbcp commons-dbcp 1.2.2 org.apache.geronimo.specs geronimo-j2ee-connector_1.5_spec 2.0.0 log4j log4j 1.2.14 org.apache.xbean xbean-spring 3.7 org.apache.maven.plugins maven-dependency-plugin unpackUimajBin prepare-package unpack true org.apache.uima uimaj-distr ${uimajDependencyVersion} zip bin ${project.build.directory}/uimaj maven-javadoc-plugin javadocs-distr prepare-package javadoc true Packages * ../uimaj-as-core/src/main/java:../uimaj-as-activemq/src/main/java:../uimaj-as-camel/src/main/java:../uima-as-jms/src/main/java org.apache.uima *.uima.aae: *.aae.controller: *.aae.deploymentDescriptor: *.aae.error: *.aae.error.handler: *.aae.handler: *.aae.handler.input: *.aae.jmx: *.aae.message: *.aae.monitor: *.aae.monitor.statistics ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/jmx/monitor/BasicUimaJmxMonitorListener.java ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/jmx/monitor/JmxMonitorListener.java ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/jmx/monitor/ServiceMetrics.java ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/jmx/monitor/SingleLineUimaJmxMonitorListener.java ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/client/UimaAsynchronousEngine.java ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/client/UimaASStatusCallbackListener.java ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/client/UimaASProcessStatus.java ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/error/ErrorResult.java ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/error/ErrorResultComponentPath.java ${basedir}/../uimaj-as-core/src/main/java/org/apache/uima/aae/error/ErrorResultTDs.java Apache UIMA Async Scaleout Java SDK ${project.version} User-Level API Documentation Apache UIMA-AS Java SDK ${project.version} User-Level API Documentation maven-deploy-plugin true maven-antrun-plugin generate checksums for binary artifacts run verify maven-resources-plugin 2.5 copy-resources process-resources copy-resources true target/maven-shared-archive-resources/META-INF . LICENSE NOTICE org.apache.rat apache-rat-plugin default-cli src/test/resources/deploy/expected/*.* src/test/resources/deploy/expected/envVar/*.* src/main/examples/run_configuration/*.launch release.properties README* RELEASE_NOTES* issuesFixed/** LicNoticeAnalysisActiveMQ.txt src/main/resources/docbook-shared/titlepage/*.xsl marker-file-identifying-* DEPENDENCIES apache-release maven-deploy-plugin true maven-antrun-plugin generate checksums for source-release run verify maven-changes-plugin default-cli ${jiraVersion} Status, Key, Type ../uima-as-parent ../aggregate-uima-as uima-as-2.3.1/uima-as/src/000077500000000000000000000000001160020716200151675ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/000077500000000000000000000000001160020716200161135ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/assembly/000077500000000000000000000000001160020716200177325ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/assembly/bin.xml000066400000000000000000000345201160020716200212300ustar00rootroot00000000000000 bin tar.gz zip apache-uima-as-${project.version} true org.apache.uima:uimaj-as-activemq org.apache.uima:uimaj-as-core org.apache.uima:uimaj-as-jms org.apache.uima:uimaj-as-camel ${artifact.artifactId}.jar lib false 644 755 org.apache.activemq:activemq-all false apache-activemq-5.4.1 false 644 755 commons-logging:commons-logging org.springframework:spring-core org.apache.activemq:activemq-camel org.apache.activemq:kahadb org.apache.activemq:activemq-console org.apache.activemq:activemq-core org.apache.activemq:activemq-spring org.apache.geronimo.specs:geronimo-jms_1.1_spec org.apache.geronimo.specs:geronimo-j2ee-management_1.1_spec org.springframework:spring-asm org.springframework:spring-aop org.springframework:spring-context org.springframework:spring-tx org.springframework:spring-beans org.springframework:spring-expression org.springframework:spring-jms org.apache.xbean:xbean-spring false apache-activemq-5.4.1/lib false 644 755 commons-codec:commons-codec commons-httpclient:commons-httpclient org.eclipse.jetty.aggregate:jetty-all-server com.thoughtworks.xstream:xstream xmlpull:xmlpull org.apache.geronimo.specs:geronimo-servlet_2.5_spec log4j:log4j false apache-activemq-5.4.1/lib/optional false 644 755 org.apache.uima:uimaj-ep-deployeditor org.apache.uima:uimaj-ep-runtime-deployeditor org.apache.uima:uimaj-as-osgi-runtime eclipsePlugins ${artifact.build.finalName}.jar false 644 755 target/uimaj/apache-uima/lib lib 644 755 uimaj-examples.jar target/uimaj/apache-uima/examples examples descriptors/collection_reader/FileSystemCollectionReader.xml .classpath 644 755 target/uimaj/apache-uima/eclipsePlugins eclipsePlugins 644 755 target/uimaj/apache-uima/bin *.sh setUimaClassPath.* runUimaClass.* bin 755 755 target/uimaj/apache-uima/bin *.sh runUimaClass.* setUimaClassPath.* bin 644 755 target/uimaj/apache-uima/config config target/uimaj/apache-uima/issuedFixed issuesFixed.uimaj 644 755 target/uimaj/apache-uima/docs docs 644 755 src/main/readme 644 755 . 644 755 LicNoticeAnalysisActiveMQ.txt README* readme* RELEASE_NOTES* Release-Notes* issuesFixed/** src/main/scripts bin **/*.sh 755 755 src/main/scripts bin **/*.sh 644 755 src/main/config as_config 644 755 target/site/apidocs docs/d/api-uima-as options packages files argfile 644 755 ../uima-as-docbooks/target/site/d docs/d css/* 644 755 src/main/examples examples deploy/as/* descriptors/as/* run_configuration/* .classpath 644 755 ../uimaj-as-activemq/src/main/java/org/apache/uima/examples/as examples/src/org/apache/uima/examples/as 644 755 src/main/apache-activemq-5.4.1 apache-activemq-5.4.1 conf/** README.txt 644 755 src/main/apache-activemq-5.4.1 apache-activemq-5.4.1 bin/* bin/**/* 755 755 src/main/saxon saxon 644 755 target/uimaj/apache-uima/README README.uimaj.txt 644 target/uimaj/apache-uima/examples/.project examples 644 target/uimaj/apache-uima/RELEASE_NOTES.html RELEASE_NOTES.uimaj.html 644 target/uimaj/apache-uima/LICENSE LICENSE.uimaj.txt 644 target/uimaj/apache-uima/NOTICE NOTICE.uimaj.txt 644 src/main/eclipseProject/classpath examples .classpath 644 ../uimaj-as-activemq/src/test/resources/descriptors/collection_reader/FileSystemCollectionReader.xml examples/descriptors/collection_reader 644 uima-as-2.3.1/uima-as/src/main/assembly/src.xml000066400000000000000000000203041160020716200212420ustar00rootroot00000000000000 src tar.gz zip apache-uima-as true . uima-as src/** pom.xml src/**/*.sh src/main/apache-activemq-5.4.1/bin/** 644 . uima-as src/**/*.sh src/main/apache-activemq-5.4.1/bin/** src/main/apache-activemq-5.4.1/bin/**/*.bat src/main/apache-activemq-5.4.1/bin/**/*.jar src/main/apache-activemq-5.4.1/bin/**/*.conf src/main/apache-activemq-5.4.1/bin/**/*.jnilib 755 . uima-as src/main/apache-activemq-5.4.1/bin/**/*.bat src/main/apache-activemq-5.4.1/bin/**/*.jar src/main/apache-activemq-5.4.1/bin/**/*.conf src/main/apache-activemq-5.4.1/bin/**/*.jnilib 644 src/main/readme README LICENSE NOTICE 644 src/main/readme_src 644 ../uima-as-docbooks uima-as-docbooks target/** .*/** 644 ../uimaj-ep-deployeditor uimaj-ep-deployeditor src/** pom.xml META-INF icons/** plugin.xml 644 ../uimaj-ep-runtime-deployeditor uimaj-ep-runtime-deployeditor src/** pom.xml META-INF 644 ../uimaj-eclipse-feature-deployeditor /uimaj-eclipse-feature-deployeditor target/** .*/** 644 ../uimaj-as-osgi-runtime uimaj-as-osgi-runtime pom.xml 644 ../uimaj-as uimaj-as pom.xml eclipse-plugin-superPom/* 644 ../uimaj-as-activemq uimaj-as-activemq src/** pom.xml 644 ../uimaj-as-camel uimaj-as-camel src/** pom.xml 644 ../uimaj-as-core uimaj-as-core src/** pom.xml 644 ../uimaj-as-jms uimaj-as-jms src/** pom.xml 644 uima-as-2.3.1/uima-as/src/main/build/000077500000000000000000000000001160020716200172125ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/build/changeVersion.xml000066400000000000000000000202121160020716200225240ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/main/build/extractAndBuild.bat000066400000000000000000000047071160020716200227670ustar00rootroot00000000000000@echo off REM Licensed to the Apache Software Foundation (ASF) under one REM or more contributor license agreements. See the NOTICE file REM distributed with this work for additional information REM regarding copyright ownership. The ASF licenses this file REM to you under the Apache License, Version 2.0 (the REM "License"); you may not use this file except in compliance REM with the License. You may obtain a copy of the License at REM REM http://www.apache.org/licenses/LICENSE-2.0 REM REM Unless required by applicable law or agreed to in writing, REM software distributed under the License is distributed on an REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY REM KIND, either express or implied. See the License for the REM specific language governing permissions and limitations REM under the License. REM Run with -notest to skip the unit tests @echo on @if "%~1"=="" goto usage @if not "%4"=="" goto usage @if "%~1"=="trunk" goto trunk @set leveldir=uima-as-%~1-%~2 @set svnloc=tags/uima-as-%~1/%leveldir% @goto checkargs @:trunk @set leveldir=trunk @set svnloc=trunk @goto checkargs @:checkargs @set jvmarg= @set mvnCommand=clean install @if "%~3"=="" goto execute @if "%~3"=="-notest" goto notest @if "%~3"=="-deploy" goto deploy @goto usage @:usage @echo off echo Run this command in the same directory where all the base uima projects live echo Running this command in a directory produces an extract as a subdirectory of that directory; echo whose contents are then copied into this directory (required for the build) echo Usage: extractAndBuild.bat level release-candidate [-notest] [-deploy] echo (-notest and -deploy cannot be used together) echo Examples of the 1st 2 arguments, level release-candidate, are trunk trunk or 2.2.2 01 echo If trunk, use the word "trunk" for the 2nd argument, e.g. extractAndBuild.bat trunk trunk @echo on @goto exit @:notest @set jvmarg="-Dmaven.test.skip=true" @goto execute @:deploy @set jvmarg="-DsignArtifacts=true" @set mvnCommand=clean deploy @goto execute @:execute svn export -r HEAD http://svn.apache.org/repos/asf/incubator/uima/uima-as/%svnloc% xcopy %leveldir%\* . /E rmdir /S /Q %leveldir% cd uimaj-as call mvn %jvmarg% %mvnCommand% REM keep these next 2 "cd"s as two separate lines - got strange behavior when combining 2009 REM cd .. REM cd uima-as-distr call mvn clean install @:exit uima-as-2.3.1/uima-as/src/main/build/extractAndBuild.sh000066400000000000000000000046061160020716200226310ustar00rootroot00000000000000#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # Bourne shell syntax, this should hopefully run on pretty much anything. usage() { echo "Run this command in the same directory where all the base uima projects live" echo "Running this command in a directory produces an extract as a subdirectory of that directory;" echo " whose contents are then copied into this directory (required for the build)" echo "Usage: extractAndBuild.sh [-notest] [-deploy]" echo " (-notest and -deploy cannot be used together)" echo " the 1st 2 arguments, level release-candidate: trunk trunk or 2.2.2 01" echo " If trunk, use the word \"trunk\" for the 2nd argument, e.g. extractAndBuild.bat trunk trunk" } jvmargs="" mvnCommand="clean install" # Check arguments if [ $# -eq 0 -o $# -gt 3 ] then usage exit 1 fi if [ "$1" = "trunk" ] then svnloc=trunk leveldir=trunk else leveldir=uima-as-$1-$2 svnloc=tags/uima-as-$1/$leveldir fi if [ -n "$3" ] then # Check for -notest switch. If present, add the no-test define to the mvn command line. if [ "$3" = "-notest" ] then jvmargs="-Dmaven.test.skip=true" # Check for -deploy switch. If present, change maven command to deploy artifacts to remote Maven repo elif [ "$3" = "-deploy" ] then jvmargs="-DsignArtifacts=true" mvnCommand="source:jar deploy" else usage exit 1 fi fi svn export -r HEAD http://svn.apache.org/repos/asf/incubator/uima/uima-as/$svnloc cp -r $leveldir/* . cd uimaj-as mvn ${jvmargs} $mvnCommand # cd ../uima-as-distr mvn clean install uima-as-2.3.1/uima-as/src/main/build/signRelease.sh000066400000000000000000000051141160020716200220100ustar00rootroot00000000000000#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # Bourne shell syntax, this should hopefully run on pretty much anything. usage() { echo "run on Windows inside Cygwin, or on Linux" echo "Usage: cd to uimaj-as-distr, then do src/main/build/signRelease.sh (e.g., src/main/build/signRelease.sh uima-as-2.2.0-incubating-SNAPSHOT \"Your passphrase\")" } if [ -n "$2" ] then release=$1 passphrase=$2 else usage exit 1 fi # Create PGP signatures for i in target/${release}*.zip; do gpg --passphrase "$passphrase" --output $i.asc --detach-sig --armor $i; done for i in target/${release}*.gz; do gpg --passphrase "$passphrase" --output $i.asc --detach-sig --armor $i; done #for i in target/${release}*.bz2; do gpg --passphrase "$passphrase" --output $i.asc --detach-sig --armor $i; done # Create MD5 checksums for i in target/${release}*.zip; do md5sum --binary $i > $i.md5; done for i in target/${release}*.gz; do md5sum --binary $i > $i.md5; done #for i in target/${release}*.bz2; do md5sum --binary $i > $i.md5; done # Create SHA1 checksums for i in target/${release}*.zip; do sha1sum --binary $i > $i.sha1; done for i in target/${release}*.gz; do sha1sum --binary $i > $i.sha1; done #for i in target/${release}*.bz2; do sha1sum --binary $i > $i.sha1; done # for eclipse update site #for i in ../uimaj-eclipse-update-site/target/eclipse-update-site/features/org.apache.uima.*.jar; do gpg --passphrase "$passphrase" --output $i.asc --detach-sig --armor $i; done #for i in ../uimaj-eclipse-update-site/target/eclipse-update-site/plugins/org.apache.uima.*.jar; do gpg --passphrase "$passphrase" --output $i.asc --detach-sig --armor $i; done #for i in ../uimaj-eclipse-update-site/target/eclipse-update-site/plugins/org.apache.uima.*.jar.pack.gz; do gpg --passphrase "$passphrase" --output $i.asc --detach-sig --armor $i; done uima-as-2.3.1/uima-as/src/main/build/tag.bat000066400000000000000000000046051160020716200204620ustar00rootroot00000000000000@echo off REM Licensed to the Apache Software Foundation (ASF) under one REM or more contributor license agreements. See the NOTICE file REM distributed with this work for additional information REM regarding copyright ownership. The ASF licenses this file REM to you under the Apache License, Version 2.0 (the REM "License"); you may not use this file except in compliance REM with the License. You may obtain a copy of the License at REM REM http://www.apache.org/licenses/LICENSE-2.0 REM REM Unless required by applicable law or agreed to in writing, REM software distributed under the License is distributed on an REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY REM KIND, either express or implied. See the License for the REM specific language governing permissions and limitations REM under the License. REM The form %~1 (as opposed to %1) removes surrounding quotes @echo on @if "%~1"=="" goto usage @if "%~4"=="" goto usage @if not "%5"=="" goto usage @goto execute @:usage @echo off echo Run this command in any directory to tag a uima-as release echo This will copy the HEAD in the repository for several projects echo This command doesn't modify any local directories or files REM the period following echo inserts a blank line echo. echo Usage: tag level release-candidate core-uima-tag-base core-uima-tag-release-candidate echo. echo example tag 2.2.2 01 2.2.2 05 @echo on @goto exit @:execute @setlocal @set asLastDir=uima-as-%~1-%~2 @set asSvnloc=tags/uima-as-%~1/%asLastDir% @set baseURL=https://svn.apache.org/repos/asf/incubator/uima/uimaj/tags/uimaj-%3/uimaj-%3-%4 @set asURL=https://svn.apache.org/repos/asf/incubator/uima/sandbox/trunk @set tagURL=https://svn.apache.org/repos/asf/incubator/uima/sandbox/%asSvnloc% @set commitMsg=Create Tag for uima-as-%1-%2 release candidate based on uimaj-%3-%4 svn copy %asURL%/uima-as %tagURL% -m "%commitMsg%" svn copy %baseURL%/uimaj %tagURL%/uimaj -m "%commitMsg%" svn copy %baseURL%/uimaj-distr %tagURL%/uimaj-distr -m "%commitMsg%" svn copy %baseURL%/uimaj-examples %tagURL%/uimaj-examples -m "%commitMsg%" svn copy %baseURL%/uima-docbooks %tagURL%/uima-docbooks -m "%commitMsg%" svn copy %baseURL%/uima-docbook-tool %tagURL%/uima-docbook-tool -m "%commitMsg%" @:exit uima-as-2.3.1/uima-as/src/main/build/versions.properties000066400000000000000000000036751160020716200232130ustar00rootroot00000000000000# *************************************************************** # * Licensed to the Apache Software Foundation (ASF) under one # * or more contributor license agreements. See the NOTICE file # * distributed with this work for additional information # * regarding copyright ownership. The ASF licenses this file # * to you under the Apache License, Version 2.0 (the # * "License"); you may not use this file except in compliance # * with the License. You may obtain a copy of the License at # * # * http://www.apache.org/licenses/LICENSE-2.0 # * # * Unless required by applicable law or agreed to in writing, # * software distributed under the License is distributed on an # * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # * KIND, either express or implied. See the License for the # * specific language governing permissions and limitations # * under the License. # *************************************************************** ############################################################ # UIMA Version strings # # Unlike other Ant property assignments, in the case of # duplicates, the last one wins. # So - don't have duplicate values in this file # # A set consists of # a) what the new values should be # b) what the previous values were # # The previous values are used to compare against, to find # the string to replace. ############################################################ # set this to -SNAPSHOT to have the snapshot suffix # otherwise set to [nothing] uima.as.version.snapshot= uima.version.snapshot= uima.version.base=2.3.0 uima.version.major=2 uima.version.minor=3 uima.version.buildRevision=0 uima.as.version.base=2.3.0 uima.as.prev.version.snapshot=-SNAPSHOT uima.prev.version.snapshot=-SNAPSHOT uima.prev.version.base=2.3.0 uima.prev.version.major=2 uima.prev.version.minor=3 uima.prev.version.buildRevision=0 uima.as.prev.version.base=2.3.0 uima-as-2.3.1/uima-as/src/main/config/000077500000000000000000000000001160020716200173605ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/config/activemq-nojournal.xml000066400000000000000000000131661160020716200237270ustar00rootroot00000000000000 file:${activemq.home}/conf/credentials.properties uima-as-2.3.1/uima-as/src/main/config/log4j.properties000066400000000000000000000037651160020716200225300ustar00rootroot00000000000000## --------------------------------------------------------------------------- ## Licensed to the Apache Software Foundation (ASF) under one or more ## contributor license agreements. See the NOTICE file distributed with ## this work for additional information regarding copyright ownership. ## The ASF licenses this file to You under the Apache License, Version 2.0 ## (the "License"); you may not use this file except in compliance with ## the License. You may obtain a copy of the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ## See the License for the specific language governing permissions and ## limitations under the License. ## --------------------------------------------------------------------------- # # # #log4j.rootLogger=WARN, out log4j.rootLogger=INFO, out, stdout log4j.logger.org.apache.activemq.spring=WARN log4j.logger.org.springframework=WARN log4j.logger.org.apache.xbean.spring=WARN # When debugging or reporting problems to the ActiveMQ team, # comment out the above lines and uncomment the next. #log4j.rootLogger=DEBUG, out, stdout #The logging properties used during tests.. # CONSOLE appender not used by default log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%-5p %-30.30c{1} - %m%n log4j.appender.stdout.threshold=INFO # File appender log4j.appender.out=org.apache.log4j.RollingFileAppender log4j.appender.out.file=${activemq.base}/activemq-data/activemq.log log4j.appender.out.maxFileSize=1024KB log4j.appender.out.maxBackupIndex=5 log4j.appender.out.append=true log4j.appender.out.layout=org.apache.log4j.PatternLayout log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n uima-as-2.3.1/uima-as/src/main/config/uimaAsLog4j.properties000066400000000000000000000022151160020716200236150ustar00rootroot00000000000000## --------------------------------------------------------------------------- ## Licensed to the Apache Software Foundation (ASF) under one or more ## contributor license agreements. See the NOTICE file distributed with ## this work for additional information regarding copyright ownership. ## The ASF licenses this file to You under the Apache License, Version 2.0 ## (the "License"); you may not use this file except in compliance with ## the License. You may obtain a copy of the License at ## ## http://www.apache.org/licenses/LICENSE-2.0 ## ## Unless required by applicable law or agreed to in writing, software ## distributed under the License is distributed on an "AS IS" BASIS, ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ## See the License for the specific language governing permissions and ## limitations under the License. ## --------------------------------------------------------------------------- # Log4j configuration used by Spring and AMQ log4j.rootLogger=WARN, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout uima-as-2.3.1/uima-as/src/main/eclipseProject/000077500000000000000000000000001160020716200210665ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/eclipseProject/classpath000066400000000000000000000122171160020716200227760ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/main/examples/000077500000000000000000000000001160020716200177315ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/examples/deploy/000077500000000000000000000000001160020716200212255ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/examples/deploy/as/000077500000000000000000000000001160020716200216305ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/examples/deploy/as/Deploy_MeetingDetectorTAE.xml000066400000000000000000000032111160020716200272770ustar00rootroot00000000000000 Meeting Detector TAE Deploys Meeting Detector Aggregate AE with all its delegates in the same JVM. uima-as-2.3.1/uima-as/src/main/examples/deploy/as/Deploy_MeetingDetectorTAE_3MeetingAnnotators.xml000066400000000000000000000036501160020716200331120ustar00rootroot00000000000000 Meeting Detector TAE Deploys Meeting Detector Aggregate AE with 3 instances of the MeetingAnnotator. uima-as-2.3.1/uima-as/src/main/examples/deploy/as/Deploy_MeetingDetectorTAE_RemoteRoomNumber.xml000066400000000000000000000037501160020716200326300ustar00rootroot00000000000000 Meeting Detector TAE Deploys Meeting Detector Aggregate AE that uses remotely deployed RoomNumberAnnotator. uima-as-2.3.1/uima-as/src/main/examples/deploy/as/Deploy_MeetingDetectorTAE_Sync_3Instances.xml000066400000000000000000000035341160020716200323750ustar00rootroot00000000000000 Meeting Detector TAE Deploys 3 instances of the Meeting Detector as a Synchronous Aggregate (meaning the delegate AEs do not each get their own input queue). uima-as-2.3.1/uima-as/src/main/examples/deploy/as/Deploy_MeetingDetectorTAE_Whiteboard.xml000066400000000000000000000032521160020716200314540ustar00rootroot00000000000000 Meeting Detector TAE Whiteboard Deploys Meeting Detector Aggregate AE using the whiteboard Flow Controller. uima-as-2.3.1/uima-as/src/main/examples/deploy/as/Deploy_MeetingFinder.xml000066400000000000000000000042721160020716200264130ustar00rootroot00000000000000 MeetingFinder CPE Deploys Meeting Finder Aggregate as an asynchronous collection processing engine. uima-as-2.3.1/uima-as/src/main/examples/deploy/as/Deploy_RoomNumberAnnotator.xml000066400000000000000000000031551160020716200276450ustar00rootroot00000000000000 Room Number Annotator Deploys the Room Number Annotator Primitive AE uima-as-2.3.1/uima-as/src/main/examples/deploy/as/MeetingFinderAggregate.xml000066400000000000000000000070141160020716200267030ustar00rootroot00000000000000 org.apache.uima.java false Meeting Finder Aggregate Implements a collection processing engine including collection reader, analysis engines and cas consumer. CollectionReader TokenAndSentence MeetingDetector CasConsumer org.apache.uima.examples.tokenizer.Sentence org.apache.uima.examples.tokenizer.Token org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true false false uima-as-2.3.1/uima-as/src/main/examples/descriptors/000077500000000000000000000000001160020716200222725ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/examples/descriptors/as/000077500000000000000000000000001160020716200226755ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/examples/descriptors/as/MeetingDetectorAsyncAE.xml000066400000000000000000000025171160020716200277120ustar00rootroot00000000000000 org.apache.uima.aae.jms_adapter.JmsAnalysisEngineServiceAdapter uima-as-2.3.1/uima-as/src/main/examples/run_configuration/000077500000000000000000000000001160020716200234645ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/examples/run_configuration/UIMA Deploy AS Service.launch000066400000000000000000000314211160020716200304760ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/main/examples/run_configuration/UIMA Run Remote Async AE.launch000066400000000000000000000311001160020716200306530ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/main/readme/000077500000000000000000000000001160020716200173505ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/readme/LICENSE000066400000000000000000001636301160020716200203660ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ========================================================================= == APACHE ACTIVEMQ DEPENDENCIES == ========================================================================= The Apache ActiveMQ message broker includes a number of dependencies, many of them optional, with separate copyright notices and license terms. Your use of the source code for the these subcomponents is subject to the terms and conditions of the following licenses. ========================================================================= == For the Jetty library ========================================================================= Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ (See first license) ========================================================================= == For the xmlpull library == ========================================================================= XMLPULL API IS FREE ------------------- All of the XMLPULL API source code, compiled code, and documentation contained in this distribution *except* for tests (see separate LICENSE_TESTS.txt) are in the Public Domain. XMLPULL API comes with NO WARRANTY or guarantee of fitness for any purpose. Initial authors: Stefan Haustein Aleksander Slominski 2001-12-12 ========================================================================= == For the spring library == ========================================================================= Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ (See first license above) ========================================================================= == For the xstream library == ========================================================================= (BSD Style License) Copyright (c) 2003-2004, Joe Walnes All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of XStream nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ========================================================================= == For the behaviour.js library == ========================================================================= Copyright (c) 2005, Ben Nolan All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Ben Nolan nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ========================================================================= == For the prototype.js library == ========================================================================= Copyright (c) 2005 Sam Stephenson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ========================================================================= == For the Java Service Wrapper == ========================================================================= Copyright (c) 1999, 2006 Tanuki Software, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the Java Service Wrapper and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sub-license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Portions of the Software have been derived from source code developed by Silver Egg Technology under the following license: BEGIN Silver Egg Techology License ----------------------------------- Copyright (c) 2001 Silver Egg Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sub-license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. END Silver Egg Techology License ------------------------------------- ========================================================================= == For Saxon 8.9 == ========================================================================= MOZILLA PUBLIC LICENSE Version 1.0 1. Definitions. 1.1. ``Contributor'' means each entity that creates or contributes to the creation of Modifications. 1.2. ``Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. ``Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. ``Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. ``Executable'' means Covered Code in any form other than Source Code. 1.6. ``Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. ``Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. ``License'' means this document. 1.9. ``Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. ``Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.11. ``Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. ``You'' means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, ``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, ``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``Utilize'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. 2.2. Contributor Grant. Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims. If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled ``LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. 6. Versions of the License. 6.1. New Versions. Netscape Communications Corporation (``Netscape'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works. If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a ``commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and ``commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the United States of America: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Santa Clara County, California, under the auspices of JAMS/EndDispute; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. EXHIBIT A. ``The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________.'' ========================================================================= == For jaxb-api and jaxb-impl (CDDL) == == Source code is at java.net == ========================================================================= COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 * 1. Definitions. o 1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications. o 1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. o 1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. o 1.4. “Executable” means the Covered Software in any form other than Source Code. o 1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License. o 1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. o 1.7. “License” means this document. o 1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. o 1.9. “Modifications” means the Source Code and Executable form of any of the following: + A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; + B. Any new file that contains any part of the Original Software or previous Modification; or + C. Any new file that is contributed or otherwise made available under the terms of this License. o 1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License. o 1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. o 1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. o 1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. * 2. License Grants. o 2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). + (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. o 2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. * 3. Distribution Obligations. o 3.1. Availability of Source Code. Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. o 3.2. Modifications. The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. o 3.3. Required Notices. You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. o 3.4. Application of Additional Terms. You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients’ rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. o 3.5. Distribution of Executable Versions. You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient’s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. o 3.6. Larger Works. You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. * 4. Versions of the License. o 4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. o 4.2. Effect of New Versions. You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. o 4.3. Modified Versions. When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. * 5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. * 6. TERMINATION. o 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. o 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. o 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. * 7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. * 8. U.S. GOVERNMENT END USERS. The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. * 9. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction’s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. * 10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. ========================================================================= == SVG Icons == ========================================================================= This product contains icons from the SVG Icons project. The icons are licensed under the BSD license, but the actual license text is not provided by the SVG Icons project. Here's the generic BSD license template. BSD License Copyright (c) , All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. uima-as-2.3.1/uima-as/src/main/readme/NOTICE000066400000000000000000000067611160020716200202660ustar00rootroot00000000000000Apache UIMA-AS Copyright 2008, 2009 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). Portions of UIMA-AS were originally developed by International Business Machines Corporation and are licensed to the Apache Software Foundation under the "Software Grant License Agreement", informally known as the "IBM UIMA-EE License Agreement". Copyright (c) 2007, 2008 IBM Corporation ------------------- www.ibatis.com Notice ------- This product also includes software developed by Clinton Begin (http://www.ibatis.com). ----------- ActiveMQ + Spring Notice -------------- This product includes software, Apache ActiveMQ, developed at the Apache Software Foundation (http://www.apache.org/). The end-user documentation included with a redistribution, if any, must include the following acknowledgement: "This product includes software developed by the Spring Framework Project (http://www.springframework.org)." Alternately, this acknowledgement may appear in the software itself, if and wherever such third-party acknowledgements normally appear. The names "Spring" and "Spring Framework" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact rod.johnson@interface21.com or juergen.hoeller@interface21.com. This product includes software, XBean::Spring, developed at The Apache Software Foundation (http://www.apache.org/). This product includes software, QDox, developed by ThoughtWorks, Inc (http://www.thoughtworks.com/). This product includes software, Spring Framework: Core, developed by Spring Framework (http://www.springframework.org/). This product includes software, Spring Framework: Web, developed by Spring Framework (http://www.springframework.org/). ---------- Saxon Notice -------- This product includes software known as "The Saxon XSLT and XQuery Processor from Saxonica Limited", whose home page URL is http://www.saxonica.com/ Saxon includes the org.apache.xerces.util.XMLChar module from the Apache Xerces product, renamed as net.sf.saxon.om.XMLChar but otherwise unchanged. See the copyright statements included in the source code of that module for conditions of use. Saxon includes code for performing Unicode normalization that is derived from the sample code published for this purpose by the Unicode consortium. For the terms of use of this code, see http://www.unicode.org/terms_of_use.html, which should be regarded as forming part of these conditions of use, and part of the Saxon documentation. ------- Jetty Notice ---------- This product includes software, Jetty, developed at The Apache Software Foundation (http://www.apache.org/) and Mort Bay Consulting Pty Ltd. The javax.servlet package used by Jetty is copyright Sun Microsystems, Inc and Apache Software Foundation. It is distributed under the Common Development and Distribution License. You can obtain a copy of the license at https://glassfish.dev.java.net/public/CDDLv1.0.html. Some portions of the code are Copyright: 2006 Tim Vernum 1999 Jason Gilbert The UnixCrypt.java code ~Implements the one way cryptography used by Unix systems for simple password protection. Copyright 1996 Aki Yoshida, modified April 2001 by Iris Van den Broeke, Daniel Deville. -------SVG Icons Notice ------------------------ This product contains icons developed by the SVG Icons project (http://sourceforge.net/projects/svgicons), licensed under the BSD license (see LICENSE file).uima-as-2.3.1/uima-as/src/main/readme_src/000077500000000000000000000000001160020716200202175ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/readme_src/LICENSE000066400000000000000000001040471160020716200212320ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ========================================================================= == For the Java Service Wrapper == ========================================================================= Copyright (c) 1999, 2006 Tanuki Software, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the Java Service Wrapper and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sub-license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Portions of the Software have been derived from source code developed by Silver Egg Technology under the following license: BEGIN Silver Egg Techology License ----------------------------------- Copyright (c) 2001 Silver Egg Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sub-license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. END Silver Egg Techology License ------------------------------------- ========================================================================= == For Saxon 8.9 == ========================================================================= MOZILLA PUBLIC LICENSE Version 1.0 1. Definitions. 1.1. ``Contributor'' means each entity that creates or contributes to the creation of Modifications. 1.2. ``Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. ``Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. ``Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. ``Executable'' means Covered Code in any form other than Source Code. 1.6. ``Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. ``Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. ``License'' means this document. 1.9. ``Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. ``Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.11. ``Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. ``You'' means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, ``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, ``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``Utilize'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. 2.2. Contributor Grant. Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims. If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled ``LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. 6. Versions of the License. 6.1. New Versions. Netscape Communications Corporation (``Netscape'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works. If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a ``commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and ``commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the United States of America: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Santa Clara County, California, under the auspices of JAMS/EndDispute; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. EXHIBIT A. ``The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________.'' ========================================================================= == SVG Icons == ========================================================================= This product contains icons from the SVG Icons project. The icons are licensed under the BSD license, but the actual license text is not provided by the SVG Icons project. Here's the generic BSD license template. BSD License Copyright (c) , All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. uima-as-2.3.1/uima-as/src/main/readme_src/NOTICE000066400000000000000000000027071160020716200211310ustar00rootroot00000000000000Apache UIMA-AS Copyright 2008, 2009 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). Portions of UIMA-AS were originally developed by International Business Machines Corporation and are licensed to the Apache Software Foundation under the "Software Grant License Agreement", informally known as the "IBM UIMA-EE License Agreement". Copyright (c) 2007, 2008 IBM Corporation This product includes software, Apache ActiveMQ, developed at the Apache Software Foundation (http://www.apache.org/). This product includes software known as "The Saxon XSLT and XQuery Processor from Saxonica Limited", whose home page URL is http://www.saxonica.com/ Saxon includes the org.apache.xerces.util.XMLChar module from the Apache Xerces product, renamed as net.sf.saxon.om.XMLChar but otherwise unchanged. See the copyright statements included in the source code of that module for conditions of use. Saxon includes code for performing Unicode normalization that is derived from the sample code published for this purpose by the Unicode consortium. For the terms of use of this code, see http://www.unicode.org/terms_of_use.html, which should be regarded as forming part of these conditions of use, and part of the Saxon documentation. This product contains icons developed by the SVG Icons project (http://sourceforge.net/projects/svgicons), licensed under the BSD license (see LICENSE file).uima-as-2.3.1/uima-as/src/main/readme_src/README000066400000000000000000000052761160020716200211110ustar00rootroot00000000000000For instructions on building Apache UIMA-AS please refer to: http://incubator.apache.org/uima/svn.html#building.with.maven Those instructions will enable building the uima core, which is needed by this project. To build this project, first build the UIMA core, and then do the following steps: 1) either check out of SVN the following projects into the same "workspace" directory that you checked out the base UIMA: - uima-as-docbooks - uimaj-as - uimaj-as-activemq - uimaj-as-camel - uimaj-as-core - uimaj-as-jms - uimaj-as-osgi-runtime - uimaj-ep-deployeditor - uimaj-ep-runtime-deployeditor or, unzip the source distribution into the same workspace. 2) cd to the uimaj-as project, and do mvn install 3) To work with eclipse, following step 2), do mvn eclipse:eclipse 4) To build the distribution, follow the setup instructions on http://incubator.apache.org/uima/svn.html#build.distribution and then cd to uima-as and do mvn assembly:assembly ------------------------- If you have installed both the Apache UIMA-AS binary distribution and the Apache UIMA-AS source distribution, you can run the addSourceJars.bat (or .sh) script to add the source code to the jar files in the UIMA_HOME/lib directory. This may make it more convenient to access the UIMA Source Code (and JavaDocs) from an IDE such as Eclipse. See the NOTICE file for licensing information. Crypto Notice ------------- This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See for more information. The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code. The following provides more details on the included cryptographic software: This distribution includes portions of Apache ActiveMQ, which, in turn, is classified as being controlled under ECCN 5D002. uima-as-2.3.1/uima-as/src/main/readme_src/addSourceToJars.bat000066400000000000000000000022231160020716200237420ustar00rootroot00000000000000@echo off REM Licensed to the Apache Software Foundation (ASF) under one REM or more contributor license agreements. See the NOTICE file REM distributed with this work for additional information REM regarding copyright ownership. The ASF licenses this file REM to you under the Apache License, Version 2.0 (the REM "License"); you may not use this file except in compliance REM with the License. You may obtain a copy of the License at REM REM http://www.apache.org/licenses/LICENSE-2.0 REM REM Unless required by applicable law or agreed to in writing, REM software distributed under the License is distributed on an REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY REM KIND, either express or implied. See the License for the REM specific language governing permissions and limitations REM under the License. @echo on cd uimaj-as-activemq\src\main\java jar -uvf %UIMA_HOME%\lib\uimaj-as-activemq.jar * cd ..\..\..\..\uimaj-as-core\src\main\java jar -uvf %UIMA_HOME%\lib\uimaj-as-core.jar * cd ..\..\..\..\uimaj-as-jms\src\main\java jar -uvf %UIMA_HOME%\lib\uimaj-as-jms.jar * cd ..\..\..\..uima-as-2.3.1/uima-as/src/main/readme_src/addSourceToJars.sh000066400000000000000000000021141160020716200236050ustar00rootroot00000000000000#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. cd uimaj-as-activemq/src/main/java jar -uvf $UIMA_HOME/lib/uimaj-as-activemq.jar * cd ../../../../uimaj-as-core/src/main/java jar -uvf $UIMA_HOME/lib/uimaj-as-core.jar * cd ../../../../uimaj-as-jms/src/main/java jar -uvf $UIMA_HOME/lib/uimaj-as-jms.jar * cd ../../../.. uima-as-2.3.1/uima-as/src/main/scripts/000077500000000000000000000000001160020716200176025ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/main/scripts/dd2spring.bat000066400000000000000000000030041160020716200221630ustar00rootroot00000000000000@echo off @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @REM distributed with this work for additional information @REM regarding copyright ownership. The ASF licenses this file @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM @REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @REM KIND, either express or implied. See the License for the @REM specific language governing permissions and limitations @REM under the License. @setlocal if not defined UIMA_HOME goto USAGE_UIMA if "%1" == "" goto usage goto RUN :USAGE_UIMA echo UIMA_HOME environment variable is not set goto EXIT :usage echo USAGE: dd2spring source-deployment-descriptor output-file-path echo for instance: %%UIMA_HOME%%\bin\dd2spring %%UIMA_HOME%%\examples\deploy\as\Deploy_MeetingDetectorTAE.xml c:\temp\dd2so.xml goto EXIT :RUN set UIMA_CLASSPATH=%UIMA_CLASSPATH%;%UIMA_HOME%\saxon\saxon8.jar set UIMA_JVM_OPTS=%UIMA_JVM_OPTS% -Xmx256M @call "%UIMA_HOME%\bin\runUimaClass.bat" net.sf.saxon.Transform -l -s "%1" -o "%2" "%UIMA_HOME%\bin\dd2spring.xsl" %3 %4 %5 %6 %7 %8 %9 :EXITuima-as-2.3.1/uima-as/src/main/scripts/dd2spring.sh000066400000000000000000000025571160020716200220430ustar00rootroot00000000000000#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. if [ "$UIMA_HOME" = "" ] then echo UIMA_HOME environment variable is not set exit 1 fi if [ "$1" = "" ] then echo USAGE: dd2spring source-deployment-descriptor output-file-path echo for instance: \$UIMA_HOME/bin/dd2spring \$UIMA_HOME/examples/deploy/as/Deploy_MeetingDetectorTAE.xml /tmp/dd2so.xml exit 1 fi export UIMA_CLASSPATH=$UIMA_CLASSPATH:$UIMA_HOME/saxon/saxon8.jar export "UIMA_JVM_OPTS=$UIMA_JVM_OPTS -Xmx256M" "$UIMA_HOME/bin/runUimaClass.sh" net.sf.saxon.Transform -l -s "$1" -o "$2" "$UIMA_HOME/bin/dd2spring.xsl" $3 $4 $5 $6 $7 $8 $9 uima-as-2.3.1/uima-as/src/main/scripts/dd2spring.xsl000066400000000000000000004352601160020716200222400ustar00rootroot00000000000000 *** line-number: uima-as-2.3.1/uima-as/src/main/scripts/deployAsyncService.cmd000066400000000000000000000027151160020716200241070ustar00rootroot00000000000000@REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @REM distributed with this work for additional information @REM regarding copyright ownership. The ASF licenses this file @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM @REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @REM KIND, either express or implied. See the License for the @REM specific language governing permissions and limitations @REM under the License. @echo off @if not defined UIMA_HOME goto USAGE_UIMA @goto RUN :USAGE_UIMA @echo UIMA_HOME environment variable is not set @goto end :RUN @if .%1 == . goto usage @if NOT exist %1 goto usage @rem call common script that will launch the Uima AS service @call "%UIMA_HOME%\bin\runUimaClass.bat" org.apache.uima.adapter.jms.service.UIMA_Service -saxonURL "file:%UIMA_HOME%\saxon\saxon8.jar" -xslt "%UIMA_HOME%\bin\dd2spring.xsl" -dd %* @goto end :usage @echo Deployment descriptor %1 not found @echo Usage: deployAsyncService file-path-of-deployment-descriptor [another-dd ...] :end uima-as-2.3.1/uima-as/src/main/scripts/deployAsyncService.sh000066400000000000000000000025061160020716200237540ustar00rootroot00000000000000#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. if [ "$UIMA_HOME" = "" ] then echo UIMA_HOME environment variable is not set exit 1 fi if [ $# -lt 1 ] then echo "You must specify one or more deployment descriptors. Usage: deployAsyncService.sh file-path-of-deployment-descriptor [another-dd ...]" exit 1; fi; if [ ! -f $1 ] then echo "File '"$1"' does not exist"; exit 1; fi; "$UIMA_HOME/bin/runUimaClass.sh" org.apache.uima.adapter.jms.service.UIMA_Service -saxonURL "file:$UIMA_HOME/saxon/saxon8.jar" -xslt "$UIMA_HOME/bin/dd2spring.xsl" -dd $@ uima-as-2.3.1/uima-as/src/main/scripts/runRemoteAsyncAE.cmd000066400000000000000000000021371160020716200234560ustar00rootroot00000000000000@REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @REM distributed with this work for additional information @REM regarding copyright ownership. The ASF licenses this file @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM @REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @REM KIND, either express or implied. See the License for the @REM specific language governing permissions and limitations @REM under the License. @echo off if not defined UIMA_HOME goto USAGE_UIMA goto RUN :USAGE_UIMA echo UIMA_HOME environment variable is not set goto EXIT :RUN @call "%UIMA_HOME%\bin\runUimaClass.bat" org.apache.uima.examples.as.RunRemoteAsyncAE %* :EXITuima-as-2.3.1/uima-as/src/main/scripts/runRemoteAsyncAE.sh000066400000000000000000000017451160020716200233310ustar00rootroot00000000000000#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. if [ "$UIMA_HOME" = "" ] then echo UIMA_HOME environment variable is not set exit 1 fi "$UIMA_HOME/bin/runUimaClass.sh" org.apache.uima.examples.as.RunRemoteAsyncAE $@ uima-as-2.3.1/uima-as/src/main/scripts/runUimaClass.bat000066400000000000000000000060501160020716200227010ustar00rootroot00000000000000@echo off @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @REM distributed with this work for additional information @REM regarding copyright ownership. The ASF licenses this file @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM @REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @REM KIND, either express or implied. See the License for the @REM specific language governing permissions and limitations @REM under the License. @if not defined UIMA_HOME ( @echo UIMA_HOME environment variable is not set @exit /B 1 ) @setlocal @rem Set ActiveMQ home @if "%ACTIVEMQ_HOME%"=="" (set "ACTIVEMQ_HOME=%UIMA_HOME%\apache-activemq-5.4.1") @if "%JAVA_HOME%"=="" (set UIMA_JAVA_CALL=java) else (set "UIMA_JAVA_CALL=%JAVA_HOME%\bin\java") @rem Set jar search order of: UIMA_CLASSPATH uima activemq(optional) tomcat(optional) CLASSPATH @set UIMA_CLASSPATH=%UIMA_CLASSPATH%;%UIMA_HOME%\examples\resources @set UIMA_CLASSPATH=%UIMA_CLASSPATH%;%UIMA_HOME%\lib @if EXIST "%ACTIVEMQ_HOME%" (set "UIMA_CLASSPATH=%UIMA_CLASSPATH%;%ACTIVEMQ_HOME%;%ACTIVEMQ_HOME%\lib;%ACTIVEMQ_HOME%\lib\optional") @if NOT "%CATALINA_HOME%"=="" (set "UIMA_CLASSPATH=%UIMA_CLASSPATH%;%CATALINA_HOME%\webapps\axis\WEB-INF\lib;%CATALINA_HOME%\webapps\axis\WEB-INF\classes") @set UIMA_CLASSPATH=%UIMA_CLASSPATH%;%CLASSPATH% @rem Set path to support running C++ annotators @if "%UIMACPP_HOME%"=="" set UIMACPP_HOME=%UIMA_HOME%\uimacpp @set PATH=%UIMACPP_HOME%\bin;%UIMACPP_HOME%\examples\tutorial\src;%PATH% @rem Set VNS_HOST and VNS_PORT to default values if they are not specified @if "%VNS_HOST%"=="" set VNS_HOST=localhost @if "%VNS_PORT%"=="" set VNS_PORT=9000 @rem Set default for logger properties @if "%UIMA_LOGGER_CONFIG_FILE%"=="" set UIMA_LOGGER_CONFIG_FILE=%UIMA_HOME%\config\Logger.properties @rem Set default JVM opts @if "%UIMA_JVM_OPTS%"=="" set UIMA_JVM_OPTS=-Xms128M -Xmx800M @rem Check if Uima AS is installed, and if so set the default log4j configuration file @if EXIST "%UIMA_HOME%"\as_config (set "LOG4J_CONFIG_FILE=-Dlog4j.configuration=file:%UIMA_HOME%\as_config\uimaAsLog4j.properties") else (set LOG4J_CONFIG_FILE=-DNoOp) @if "%UIMA_CVDMAN%"=="" set UIMA_CVDMAN=-Duima.tools.cvd.manpath.notset @rem Finally load the jars and run the class @"%UIMA_JAVA_CALL%" -DVNS_HOST=%VNS_HOST% -DVNS_PORT=%VNS_PORT% "-Duima.home=%UIMA_HOME%" "-Duima.datapath=%UIMA_DATAPATH%" "-Djava.util.logging.config.file=%UIMA_LOGGER_CONFIG_FILE%" "%UIMA_CVDMAN%" %UIMA_JVM_OPTS% "%LOG4J_CONFIG_FILE%" -DUimaBootstrapSuppressClassPathDisplay -Dorg.apache.uima.jarpath="%UIMA_CLASSPATH%" -jar "%UIMA_HOME%\lib\uimaj-bootstrap.jar" %* uima-as-2.3.1/uima-as/src/main/scripts/runUimaClass.sh000066400000000000000000000067361160020716200225600ustar00rootroot00000000000000#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. if [ "$UIMA_HOME" = "" ] then echo UIMA_HOME environment variable is not set exit 1 fi # set default ActiveMQ home if [ "$ACTIVEMQ_HOME" = "" ] then ACTIVEMQ_HOME=$UIMA_HOME/apache-activemq-5.4.1 fi if [ "$JAVA_HOME" = "" ] then UIMA_JAVA_CALL=java else UIMA_JAVA_CALL="$JAVA_HOME/bin/java" fi #Set jar search order of: UIMA_CLASSPATH uima activemq(optional) tomcat(optional) CLASSPATH UIMA_CLASSPATH=$UIMA_CLASSPATH:$UIMA_HOME/examples/resources UIMA_CLASSPATH=$UIMA_CLASSPATH:$UIMA_HOME/lib if [ -e "$ACTIVEMQ_HOME" ] then UIMA_CLASSPATH=$UIMA_CLASSPATH:$ACTIVEMQ_HOME:$ACTIVEMQ_HOME/lib:$ACTIVEMQ_HOME/lib/optional fi # -n: true if string has non-zero length if [ -n "$CATALINA_HOME" ] then UIMA_CLASSPATH=$UIMA_CLASSPATH:$CATALINA_HOME/webapps/axis/WEB-INF/lib:$CATALINA_HOME/webapps/axis/WEB-INF/classes fi UIMA_CLASSPATH=$UIMA_CLASSPATH:$CLASSPATH #set LD_LIBRARY_PATH to support running C++ annotators if [ "$UIMACPP_HOME" = "" ] then UIMACPP_HOME=$UIMA_HOME/uimacpp fi # The exports here are done in 2 lines because on some shells (dash) # (used by Ubuntu) blanks in the substitutions (e.g., a dir whose name # includes a blank) causes a failure PATH=$UIMACPP_HOME/bin:$UIMACPP_HOME/examples/tutorial/src:$PATH export PATH LD_LIBRARY_PATH=$UIMACPP_HOME/lib:$UIMACPP_HOME/examples/tutorial/src:$LD_LIBRARY_PATH export LD_LIBRARY_PATH #also set DYLD_LIBRARY_PATH, used by Mac OSX DYLD_LIBRARY_PATH=$UIMACPP_HOME/lib:$UIMACPP_HOME/examples/tutorial/src:$DYLD_LIBRARY_PATH export DYLD_LIBRARY_PATH #also set default values for VNS_HOST and VNS_PORT if [ "$VNS_HOST" = "" ]; then VNS_HOST=localhost fi if [ "$VNS_PORT" = "" ]; then VNS_PORT=9000 fi #also set default vlaue for UIMA_LOGGER_CONFIG_FILE if [ "$UIMA_LOGGER_CONFIG_FILE" = "" ] then UIMA_LOGGER_CONFIG_FILE=$UIMA_HOME/config/Logger.properties fi #set default JVM opts if [ "$UIMA_JVM_OPTS" = "" ] then UIMA_JVM_OPTS="-Xms128M -Xmx800M" fi # Check if Uima AS is installed, and if so set the default log4j configuration file if [ -e "$UIMA_HOME"/as_config ] then LOG4J_CONFIG_FILE=-Dlog4j.configuration=file:$UIMA_HOME/as_config/uimaAsLog4j.properties else # Define a variable with an arbitrary no op value LOG4J_CONFIG_FILE=-DNoOp fi if [ "$UIMA_CVDMAN" = "" ] then UIMA_CVDMAN=-Duima.tools.cvd.manpath.notset fi # Finally load the jars and run the class "$UIMA_JAVA_CALL" -DVNS_HOST=$VNS_HOST -DVNS_PORT=$VNS_PORT "-Duima.home=$UIMA_HOME" "-Duima.datapath=$UIMA_DATAPATH" "-Djava.util.logging.config.file=$UIMA_LOGGER_CONFIG_FILE" "$UIMA_CVDMAN" $UIMA_JVM_OPTS "$LOG4J_CONFIG_FILE" -DUimaBootstrapSuppressClassPathDisplay -Dorg.apache.uima.jarpath="$UIMA_CLASSPATH" -jar "$UIMA_HOME/lib/uimaj-bootstrap.jar" $@ uima-as-2.3.1/uima-as/src/main/scripts/startBroker.bat000066400000000000000000000036051160020716200226000ustar00rootroot00000000000000@echo off REM Licensed to the Apache Software Foundation (ASF) under one REM or more contributor license agreements. See the NOTICE file REM distributed with this work for additional information REM regarding copyright ownership. The ASF licenses this file REM to you under the Apache License, Version 2.0 (the REM "License"); you may not use this file except in compliance REM with the License. You may obtain a copy of the License at REM REM http://www.apache.org/licenses/LICENSE-2.0 REM REM Unless required by applicable law or agreed to in writing, REM software distributed under the License is distributed on an REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY REM KIND, either express or implied. See the License for the REM specific language governing permissions and limitations REM under the License. @if not defined UIMA_HOME goto USAGE_UIMA @goto RUN :USAGE_UIMA @echo UIMA_HOME environment variable is not set @goto EXIT :RUN @echo on @REM ActiveMQ needs a HOME @setlocal @if "%ACTIVEMQ_HOME%" == "" ( set "ACTIVEMQ_HOME=%UIMA_HOME%\apache-activemq-5.4.1" ) @REM ActiveMQ needs a writable directory for the log files and derbydb @REM watchout! it appears that ACTIVEMQ_BASE cannot contain backslashes! @if "%ACTIVEMQ_BASE%" == "" ( set ACTIVEMQ_BASE=amq ) @REM If directory missing create it @if not exist "%ACTIVEMQ_BASE%" ( mkdir "%ACTIVEMQ_BASE%" mkdir "%ACTIVEMQ_BASE%\conf" ) @REM If config file not there, copy it @if not exist "%ACTIVEMQ_BASE%\conf\activemq-nojournal.xml" ( copy "%UIMA_HOME%\as_config\log4j.properties" "%ACTIVEMQ_BASE%\conf" copy "%UIMA_HOME%\as_config\activemq-nojournal.xml" "%ACTIVEMQ_BASE%\conf" copy "%ACTIVEMQ_HOME%\conf\*" "%ACTIVEMQ_BASE%\conf" ) call "%ACTIVEMQ_HOME%\bin\activemq.bat" "xbean:file:%ACTIVEMQ_BASE%/conf/activemq-nojournal.xml" :EXIT uima-as-2.3.1/uima-as/src/main/scripts/startBroker.sh000066400000000000000000000033251160020716200224430ustar00rootroot00000000000000#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. if [ "$UIMA_HOME" = "" ]; then echo UIMA_HOME environment variable is not set exit 1 fi # ActiveMQ needs a HOME if [ -z "$ACTIVEMQ_HOME" ] ; then export ACTIVEMQ_HOME=$UIMA_HOME/apache-activemq-5.4.1 fi # ActiveMQ needs a writeable directory for the log files and derbydb. if [ -z "$ACTIVEMQ_BASE" ] ; then export ACTIVEMQ_BASE=amq fi # If the directory doesn't exist, make it if [ ! -d "$ACTIVEMQ_BASE" ] ; then mkdir "$ACTIVEMQ_BASE" mkdir "$ACTIVEMQ_BASE/conf" fi # If the config file isn't there, copy it if [ ! -f "$ACTIVEMQ_BASE/conf/activemq-nojournal.xml" ] ; then cp "$UIMA_HOME/as_config/activemq-nojournal.xml" "$ACTIVEMQ_BASE/conf/" cp "$UIMA_HOME/as_config/log4j.properties" "$ACTIVEMQ_BASE/conf/" fi if [ ! -x "$ACTIVEMQ_HOME/bin/activemq" ]; then chmod +x "$ACTIVEMQ_HOME/bin/activemq" fi "$ACTIVEMQ_HOME/bin/activemq" "start xbean:file:$ACTIVEMQ_BASE/conf/activemq-nojournal.xml" uima-as-2.3.1/uima-as/src/test/000077500000000000000000000000001160020716200161465ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/java/000077500000000000000000000000001160020716200170675ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/java/org/000077500000000000000000000000001160020716200176565ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/java/org/apache/000077500000000000000000000000001160020716200210775ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/java/org/apache/uima/000077500000000000000000000000001160020716200220325ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/java/org/apache/uima/as/000077500000000000000000000000001160020716200224355ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/java/org/apache/uima/as/dd/000077500000000000000000000000001160020716200230245ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/java/org/apache/uima/as/dd/Dd2SpringTest.java000066400000000000000000000225501160020716200263270ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.as.dd; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.PrintStream; import java.util.regex.Pattern; import junit.framework.TestCase; import org.apache.uima.adapter.jms.service.Dd2spring; import org.apache.uima.test.junit_extension.FileCompare; import org.apache.uima.test.junit_extension.TeePrintStream; public class Dd2SpringTest extends TestCase{ private static String dd2SpringXsltFilePath = "src/main/scripts/dd2spring.xsl"; private static String saxonClasspath = "file:src/main/saxon/saxon8.jar"; private static String pathToDds = "src/test/resources/deploy/"; private static String pathToExpected = "src/test/resources/deploy/expected/"; // get rid of parts of generated file that are specific to the regen, which are // the header which includes the path to the file, and the date of generation private static String sourceFileCommentPattern = // match start-of-line, spaces, "" "^\\s*[ \\t]*$"; // followed by some other non-newline chars, and then --> at end of line // get rid of uniqifiers that are generated private static String uniquifiersPattern = // sample: 9.67.165.27-44fb4c2a:1165912164d:-8000 // another: 9.2.34.65754d945a:11bfaf7fad7:-7fff "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.?[\\-0-9a-fA-F]{6,12}\\:[0-9a-fA-F]{8,12}\\:\\-[0-9a-fA-F]{4,4}" ; // get rid of part of file name that is system specific // get rid of variable length comment header lines private static String sourceFileCommentBorder = // match start-of-line, spaces, "" "^\\s*[ \\t]*$"; /* pattern to remove installation-specific paths * file:/C:/a/Eclipse/3.3/apache/uima-as/src/test/resources/descriptors/tutorial/ex2/RoomNumberAnnotator.xml */ private static String specificPaths = "\\\"file:[\\w/:\\-\\.]*?src/test/resources/"; private static Pattern compareFilter = Pattern.compile( // turn on multiline mode (?m) so ^ and $ match for each line "(?m)(" + sourceFileCommentPattern + ")|(" + uniquifiersPattern + ")|(" + sourceFileCommentBorder + ")|(" + specificPaths + ")"); private static Pattern nevermatch = Pattern.compile(" "); private static Dd2spring dd2SpringInstance = new Dd2spring(); protected void setUp() { } protected void tearDown() { } public void testAggregateWithInnerAggregateErMsgKeys() throws Exception { checkDd2SpringErrMsg("aggregateWithInnerAggregateErMsgKeys.xml", "running test aggregateWithInnerAggregateErMsgKeys.xml: \n" + " *** ERROR: line-number: 44 deployment descriptor for analysisEngine: MeetingDetectorAggregate/NoOp " + "specifies a casMultiplier element, but the analysisEngine is not a CAS multiplier" ); } public void testDd2Spring_dfltPrimMultiInstanceSame() throws Exception { checkDd2Spring("defaultingPrimAEMultInstanceSameCasPool.xml"); } public void testDd2Spring_dfltPrimMultiInstanceDiff() throws Exception { // checkDd2Spring("defaultingPrimAEMultInstanceDiffCasPool.xml"); checkDd2SpringErrMsg( "defaultingPrimAEMultInstanceDiffCasPool.xml", "running test defaultingPrimAEMultInstanceDiffCasPool.xml: \n" + " *** WARN: line-number: 26 Top level Async Primitive specifies a scaleout of numberOfInstances=\"40\", but also specifies a Cas Pool size of numberOfCASes=\"30\". The Cas Pool size is being forced to be the same as the scaleout."); } public void testAggregateWithInnerAggregateCM() throws Exception { checkDd2Spring("aggregateWithInnerAggregateCM.xml"); } public void testDd2Spring_BrokerURL_params() throws Exception { checkDd2Spring("defaultingAEwithBrokerParms.xml"); } public void testDd2Spring_Bad_Window() throws Exception { checkDd2Spring("TestThresholdWindow.xml"); } public void testDd2Spring_Deploy_AggregateUsingRemoteTempQueueNoBroker() throws Exception { checkDd2Spring("Deploy_AggregateUsingRemoteTempQueueNoBroker.xml"); } public void testDd2Spring_defaultingAENoBroker() throws Exception { checkDd2Spring("defaultingAENoBroker.xml"); } public void testDd2Spring_var1() throws Exception { checkDd2Spring("var1.xml"); } public void testDd2Spring_CMAggregateWithCollocatedCM() throws Exception { checkDd2Spring("Deploy_CMAggregateWithCollocatedCM.xml"); } public void testDd2Spring_complex_inner_CM_colocated() throws Exception { checkDd2Spring("Deploy_ComplexAggregateWithInnerAggregateCM.xml"); } public void testDd2Spring_remoteSerializer() throws Exception { checkDd2Spring("remoteSerializer.xml"); } public void testDd2Spring_deployAggrUsingRmtTempQ() throws Exception { checkDd2Spring("Deploy_AggregateUsingRemoteTempQueue.xml"); } public void testDd2Spring_concurRemoteConsumers() throws Exception { checkDd2Spring("aggrRmtConcurrentReply.xml"); } public void testVmBkrBad() throws Exception { checkDd2Spring("vmBkrBad.xml"); } public void testDd2Spring_inputQueueScaleout3() throws Exception { checkDd2Spring("iq3.xml"); } public void testDd2Spring_inputQueueScaleout2g2() throws Exception { checkDd2Spring("iq2AEg2.xml"); } public void testDd2Spring_inputQueueScaleout2g() throws Exception { checkDd2Spring("iq2AEg.xml"); } public void testDd2Spring_inputQueueScaleout2() throws Exception { checkDd2Spring("iq2AE.xml"); } public void testDd2Spring_inputQueueScaleout1() throws Exception { checkDd2Spring("iq1AE.xml"); } public void testDd2Spring_multiLevelAsyncDefaulting() throws Exception { checkDd2Spring("Deploy_MeetingFinder.xml"); } public void testDd2Spring_dfltPrimMultiInstance() throws Exception { checkDd2Spring("defaultingPrimAEMultInstance.xml"); } public void testDd2Spring_tempQ() throws Exception { checkDd2Spring("tempQ1.xml"); } public void testDd2Spring_NotCPP() throws Exception { checkDd2SpringErrMsg( "envVar/envVarNotCPP.xml", "running test envVar/envVarNotCPP.xml: \n *** ERROR: line-number: 28 Service element contains an environmentVariables element, \n" + " but the referenced top-level descriptor isn't a C++ component"); } public void testDd2Spring_defaults_aggr_async() throws Exception { checkDd2Spring("defaultingAEaggrAsync.xml"); } public void testDd2Spring_defaults_aggr() throws Exception { checkDd2Spring("defaultingAEaggr.xml"); } public void testDd2Spring_defaults() throws Exception { checkDd2Spring("defaultingAE.xml"); } public void testDd2Spring_envVarCPP() throws Exception { checkDd2Spring("envVar/envVarCPP.xml"); } public void testDd2Spring_envVarCPP1() throws Exception { checkDd2Spring("envVar/envVarCPP1.xml"); } public void testDd2Spring_CPPwrongProtocol() throws Exception { checkDd2SpringErrMsg( "envVar/envVarCPPwrongProtocol.xml", "running test envVar/envVarCPPwrongProtocol.xml: \n *** ERROR: line-number: 31 broker protocol of vm://localhost not supported"); } private void checkDd2SpringErrMsg(String dd, String errmsg) throws Exception { PrintStream err = System.err; try { ByteArrayOutputStream errOut = new ByteArrayOutputStream(); System.setErr(new TeePrintStream(new PrintStream(errOut), err)); checkDd2Spring(dd); assertTrue(FileCompare.compareStringsWithFilter( errmsg, errOut.toString(), nevermatch)); } finally { System.setErr(err); } } private void checkDd2Spring(String dd) throws Exception { System.err.print("running test " + dd + ": "); File springContextFile = dd2SpringInstance.convertDd2Spring(pathToDds + dd, dd2SpringXsltFilePath, saxonClasspath, ""); assertTrue (FileCompare.compareWithFilter(springContextFile.getAbsolutePath(), pathToExpected + dd, compareFilter)); } public static void main(String[] args) { junit.textui.TestRunner.run(Dd2SpringTest.class); System.out.println ("done"); // dummy line to have breakpoint } } uima-as-2.3.1/uima-as/src/test/resources/000077500000000000000000000000001160020716200201605ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/deploy/000077500000000000000000000000001160020716200214545ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/deploy/Deploy_AggregateAnnotator.xml000066400000000000000000000047711160020716200272770ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/Deploy_AggregateUsingRemoteTempQueue.xml000066400000000000000000000050021160020716200314120ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/Deploy_AggregateUsingRemoteTempQueueNoBroker.xml000066400000000000000000000047421160020716200330660ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/Deploy_CMAggregateWithCollocatedCM.xml000066400000000000000000000065071160020716200306760ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/Deploy_ComplexAggregateWithInnerAggregateCM.xml000066400000000000000000000046511160020716200326150ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/Deploy_MeetingFinder.xml000066400000000000000000000043371160020716200262410ustar00rootroot00000000000000 MeetingFinder CPE Deploys Meeting Finder Aggregate as an asynchronous collection processing engine. uima-as-2.3.1/uima-as/src/test/resources/deploy/TestThresholdWindow.xml000066400000000000000000000043341160020716200261660ustar00rootroot00000000000000 MeetingFinder CPE Deploys Meeting Finder Aggregate as an asynchronous collection processing engine. uima-as-2.3.1/uima-as/src/test/resources/deploy/aggrRmtConcurrentReply.xml000066400000000000000000000036571160020716200266730ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/aggregateWithInnerAggregateCM.xml000066400000000000000000000046411160020716200300100ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/aggregateWithInnerAggregateErMsgKeys.xml000066400000000000000000000045241160020716200313620ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/coLocatedCasMultiplier.xml000066400000000000000000000032771160020716200266020ustar00rootroot00000000000000 remote Cas Multiplier uima-as-2.3.1/uima-as/src/test/resources/deploy/createExpected.cmd000066400000000000000000000034001160020716200250630ustar00rootroot00000000000000@echo off @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @REM distributed with this work for additional information @REM regarding copyright ownership. The ASF licenses this file @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM @REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @REM KIND, either express or implied. See the License for the @REM specific language governing permissions and limitations @REM under the License. @setlocal if not defined UIMA_HOME goto USAGE_UIMA goto RUN :USAGE_UIMA echo UIMA_HOME environment variable is not set goto EXIT :RUN @call "%UIMA_HOME%\bin\setUimaClassPath" @if "%JAVA_HOME%"=="" (set UIMA_JAVA_CALL=java) else (set UIMA_JAVA_CALL=%JAVA_HOME%\bin\java) @if not exist expected ( @echo need to run this from directory .../uima-as/src/test/resources/deploy goto EXIT ) @for %%f in (envVar\*) do ( @echo ...processing %%f... @"%UIMA_JAVA_CALL%" -cp "%UIMA_CLASSPATH%;%cd%\..\..\..\main\saxon\saxon8.jar" -Xmx256M net.sf.saxon.Transform -l -s %%f -o expected\%%f "%cd%\..\..\..\main\scripts\dd2spring.xsl" ) @for %%f in (*) do ( @echo ...processing %%f... @"%UIMA_JAVA_CALL%" -cp "%UIMA_CLASSPATH%;%cd%\..\..\..\main\saxon\saxon8.jar" -Xmx256M net.sf.saxon.Transform -l -s %%f -o expected\%%f "%cd%\..\..\..\main\scripts\dd2spring.xsl" ) :EXIT uima-as-2.3.1/uima-as/src/test/resources/deploy/createExpected1.cmd000066400000000000000000000031361160020716200251520ustar00rootroot00000000000000@echo off @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @REM distributed with this work for additional information @REM regarding copyright ownership. The ASF licenses this file @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM @REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @REM KIND, either express or implied. See the License for the @REM specific language governing permissions and limitations @REM under the License. @REM runs dd2spring on one file passed as argument @REM TODO: 1) merge with other script @REM TODO: 2) have it take more than 1 name @setlocal if not defined UIMA_HOME goto USAGE_UIMA goto RUN :USAGE_UIMA echo UIMA_HOME environment variable is not set goto EXIT :RUN @call "%UIMA_HOME%\bin\setUimaClassPath" @if "%JAVA_HOME%"=="" (set UIMA_JAVA_CALL=java) else (set UIMA_JAVA_CALL=%JAVA_HOME%\bin\java) @if not exist expected ( @echo need to run this from directory .../uima-as/src/test/resources/deploy goto EXIT ) @"%UIMA_JAVA_CALL%" -cp "%UIMA_CLASSPATH%;%cd%\..\..\..\main\saxon\saxon8.jar" -Xmx256M net.sf.saxon.Transform -l -s %1 -o expected\%1 "%cd%\..\..\..\main\scripts\dd2spring.xsl" :EXIT uima-as-2.3.1/uima-as/src/test/resources/deploy/defaultingAE.xml000066400000000000000000000032301160020716200245240ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/defaultingAENoBroker.xml000066400000000000000000000031671160020716200261770ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/defaultingAEaggr.xml000066400000000000000000000031271160020716200253720ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/defaultingAEaggrAsync.xml000066400000000000000000000031771160020716200263750ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/defaultingAEwithBrokerParms.xml000066400000000000000000000032771160020716200276030ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/defaultingPrimAEMultInstance.xml000066400000000000000000000032271160020716200277110ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/defaultingPrimAEMultInstanceDiffCasPool.xml000066400000000000000000000033241160020716200317610ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/defaultingPrimAEMultInstanceSameCasPool.xml000066400000000000000000000033251160020716200317770ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/envVar/000077500000000000000000000000001160020716200227155ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/deploy/envVar/cppDescr.xml000066400000000000000000000025041160020716200252030ustar00rootroot00000000000000 org.apache.uima.cpp true someDll.dll uima-as-2.3.1/uima-as/src/test/resources/deploy/envVar/envVarCPP.xml000066400000000000000000000032261160020716200252460ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/envVar/envVarCPP1.xml000066400000000000000000000034531160020716200253310ustar00rootroot00000000000000 some text uima-as-2.3.1/uima-as/src/test/resources/deploy/envVar/envVarCPPwrongProtocol.xml000066400000000000000000000031721160020716200300450ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/envVar/envVarNotCPP.xml000066400000000000000000000031701160020716200257250ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/000077500000000000000000000000001160020716200232555ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/Deploy_AggregateUsingRemoteTempQueue.xml000066400000000000000000000464521160020716200332310ustar00rootroot00000000000000 Deploy_AggregateUsingRemoteTempQueueNoBroker.xml000066400000000000000000000477551160020716200346230ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/deploy/expected uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/Deploy_CMAggregateWithCollocatedCM.xml000066400000000000000000000561211160020716200324740ustar00rootroot00000000000000 Deploy_ComplexAggregateWithInnerAggregateCM.xml000066400000000000000000000560241160020716200343400ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/deploy/expected uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/Deploy_MeetingFinder.xml000066400000000000000000000515201160020716200300360ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/TestThresholdWindow.xml000066400000000000000000000514761160020716200300000ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/aggrRmtConcurrentReply.xml000066400000000000000000000536151160020716200304730ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/aggregateWithInnerAggregateCM.xml000066400000000000000000000557741160020716200316260ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/aggregateWithInnerAggregateErMsgKeys.xml000066400000000000000000000560121160020716200331620ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/coLocatedCasMultiplier.xml000066400000000000000000000242301160020716200303730ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/defaultingAE.xml000066400000000000000000000242541160020716200263360ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/defaultingAENoBroker.xml000066400000000000000000000242241160020716200277750ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/defaultingAEaggr.xml000066400000000000000000000242671160020716200272030ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/defaultingAEaggrAsync.xml000066400000000000000000000436221160020716200301750ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/defaultingAEwithBrokerParms.xml000066400000000000000000000246051160020716200314020ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/defaultingPrimAEMultInstance.xml000066400000000000000000000243371160020716200315170ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/defaultingPrimAEMultInstanceDiffCasPool.xml000066400000000000000000000243611160020716200335660ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/defaultingPrimAEMultInstanceSameCasPool.xml000066400000000000000000000243611160020716200336030ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/envVar/000077500000000000000000000000001160020716200245165ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/envVar/cppDescr.xml000066400000000000000000000000001160020716200267710ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/envVar/envVarCPP.xml000066400000000000000000000042011160020716200270410ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/envVar/envVarCPP1.xml000066400000000000000000000045261160020716200271340ustar00rootroot00000000000000 some text uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/envVar/envVarCPPwrongProtocol.xml000066400000000000000000000042101160020716200316400ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/envVar/envVarNotCPP.xml000066400000000000000000000244601160020716200275330ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/iq1AE.xml000066400000000000000000000242151160020716200247030ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/iq2AE.xml000066400000000000000000000242151160020716200247040ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/iq2AEg.xml000066400000000000000000000435361160020716200250620ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/iq2AEg2.xml000066400000000000000000000435421160020716200251410ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/iq3.xml000066400000000000000000000505371160020716200245050ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/remoteCasMultiplier.xml000066400000000000000000000471251160020716200300010ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/remoteSerializer.xml000066400000000000000000000536001160020716200273300ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/tempQ1.xml000066400000000000000000000521701160020716200251530ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/var1.xml000066400000000000000000000503151160020716200246540ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/expected/vmBkrBad.xml000066400000000000000000000520351160020716200254740ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/iq1AE.xml000066400000000000000000000032111160020716200230730ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/iq2AE.xml000066400000000000000000000032401160020716200230760ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/iq2AEg.xml000066400000000000000000000032371160020716200232530ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/iq2AEg2.xml000066400000000000000000000032471160020716200233360ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/iq3.xml000066400000000000000000000037471160020716200227050ustar00rootroot00000000000000 remote Cas Multiplier uima-as-2.3.1/uima-as/src/test/resources/deploy/remoteCasMultiplier.xml000066400000000000000000000035701160020716200261740ustar00rootroot00000000000000 remote Cas Multiplier uima-as-2.3.1/uima-as/src/test/resources/deploy/remoteSerializer.xml000066400000000000000000000037321160020716200255300ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/deploy/tempQ1.xml000066400000000000000000000034771160020716200233600ustar00rootroot00000000000000 uima-as-2.3.1/uima-as/src/test/resources/deploy/var1.xml000066400000000000000000000037341160020716200230560ustar00rootroot00000000000000 remote Cas Multiplier uima-as-2.3.1/uima-as/src/test/resources/deploy/vmBkrBad.xml000066400000000000000000000036051160020716200236720ustar00rootroot00000000000000 Meeting Detector TAE uima-as-2.3.1/uima-as/src/test/resources/descriptors/000077500000000000000000000000001160020716200225215ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/analysis_engine/000077500000000000000000000000001160020716200256715ustar00rootroot00000000000000ComplexAggregateWithInnerAggregateCM.xml000066400000000000000000000054551160020716200354420ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Complex Top Level Aggregate TAE Detects Meetings and Room Numbers TestMultiplier MeetingDetectorAggregate org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/analysis_engine/NoOpAnnotator.xml000066400000000000000000000055721160020716200311650ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 0 ProcessDelay 0 true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/analysis_engine/SimpleTestAggregate.xml000066400000000000000000000045551160020716200323240ustar00rootroot00000000000000 org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true false SimpleTestAggregateCasMultiplier.xml000066400000000000000000000045541160020716200347420ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true true SimpleTestCMAggregateWithCollocatedCM.xml000066400000000000000000000051511160020716200355240ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Nested Aggregate TAE Detects Nothing InnerTestMultiplier RemoteNoOp NoOpCC en true true true SimpleTokenAndSentenceAnnotator.xml000066400000000000000000000054601160020716200345710ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.examples.tokenizer.SimpleTokenAndSentenceAnnotator Simple Token and Sentence Annotator Annotates tokens and sentences. 1.0 The Apache Software Foundation org.apache.uima.examples.tokenizer.Token uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence org.apache.uima.examples.tokenizer.Token en true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/cas_multiplier/000077500000000000000000000000001160020716200255355ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/cas_multiplier/Segment_Annotate_Merge_AE.xml000066400000000000000000000123721160020716200332030ustar00rootroot00000000000000 org.apache.uima.java false Segment, Annotate, and Merge Example AE Splits a document into pieces and runs the tokenizer and name recognizer on each piece independently. Then runs the merger to reassemble the document, keeping the name annotations in the merged document but discarding the tokens. By default the intermediate segments are dropped after being processed by the merger, and are not output from the aggregate. This behavior is configurable via the ActionForIntermediateSegments parameter. 1.0 The Apache Software Foundation Segmenter Tokenizer NameRecognizer Merger AnnotationTypesToPreserve Names of annotation types to be preserved in the merged CAS. String true true Merger/AnnotationTypesToCopy ActionForIntermediateSegments Tells the flow controller what to do with intermediate segments after they are input to the merger. Valid values are: continue - the CAS continues on to the next element in the flow stop - the CAS will no longer continue in the flow, and will be returned from the aggregate if possible. drop - the CAS will no longer continue in the flow, and will be dropped (not returned from the aggregate) if possible. dropIfNewCasProduced (the default) - if the CAS multiplier produced a new CAS as a result of processing this CAS, then this CAS will be dropped. If not, then this CAS will continue. String false false FixedFlowController/ActionAfterCasMultiplier AnnotationTypesToPreserve example.Name ActionForIntermediateSegments drop org.apache.uima.examples.tokenizer.Sentence org.apache.uima.examples.tokenizer.Token example.Name en true true true uima-as-2.3.1/uima-as/src/test/resources/descriptors/cas_multiplier/SegmenterAndTokenizerAE.xml000066400000000000000000000050071160020716200327360ustar00rootroot00000000000000 org.apache.uima.java false Segmenter and Tokenizer Splits a document into pieces and runs tokenization on each piece independently. All segments are output. Segmenter Tokenizer org.apache.uima.examples.tokenizer.Sentence org.apache.uima.examples.tokenizer.Token en true true true uima-as-2.3.1/uima-as/src/test/resources/descriptors/cas_multiplier/SimpleTextMerger.xml000066400000000000000000000064571160020716200315330ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.examples.casMultiplier.SimpleTextMerger Simple Text Merger Merges text documents into larger ones, producing a merged CAS. Also copies selected annotation types to the merged CAS. The input CAS requires an instance of the type org.apache.uima.examples.SourceDocumentInformation (which is produced by the FileSystemCollectionReader and SimpleTextSegmenter examples). Input CASes will be merged until a CAS is encountered whose SourceDocumentInformation FS has its lastSegment feature set to true. At that point a merged CAS will be output which includes the content up to and including that CAS. If additional CASes are then received, a second merged CAS will be built, including all content from that point until the next CAS with lastSegment = true, and so on. 1.0 The Apache Software Foundation AnnotationTypesToCopy Names of annotation types to be copied from source CASes into the merged CAS. String true true AnnotationTypesToCopy org.apache.uima.examples.SourceDocumentInformation false true true uima-as-2.3.1/uima-as/src/test/resources/descriptors/cas_multiplier/SimpleTextSegmenter.xml000066400000000000000000000053671160020716200322420ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.examples.casMultiplier.SimpleTextSegmenter Simple Text Segmenter Splits a text document into pieces. Approximate size of the segments as determined by the SegmentSize parameter, but the break between segments will always occur at a newline character, so segments will not be exactly that size. 1.0 The Apache Software Foundation SegmentSize Approximate number of characters that should be in each segment. Integer false true SegmentSize 100000 false true true uima-as-2.3.1/uima-as/src/test/resources/descriptors/meetingFinder/000077500000000000000000000000001160020716200253015ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/meetingFinder/FileSystemCollectionReader.xml000066400000000000000000000112101160020716200332410ustar00rootroot00000000000000 org.apache.uima.java org.apache.uima.examples.cpe.FileSystemCollectionReader File System Collection Reader Reads files from the filesystem. This CollectionReader may be used with or without a CAS Initializer. If a CAS Initializer is supplied, it will be passed an InputStream to the file and must populate the CAS from that InputStream. If no CAS Initializer is supplied, this CollectionReader will read the file itself and set treat the entire contents of the file as the document to be inserted into the CAS. 1.0 The Apache Software Foundation InputDirectory Directory containing input files String false true Encoding Character encoding for the documents. If not specified, the default system encoding will be used. Note that this parameter only applies if there is no CAS Initializer provided; otherwise, it is the CAS Initializer's responsibility to deal with character encoding issues. String false false Language ISO language code for the documents String false false InputDirectory C:/Program Files/apache-uima-as/examples/data Language en org.apache.uima.examples.SourceDocumentInformation true false true uima-as-2.3.1/uima-as/src/test/resources/descriptors/meetingFinder/MeetingAnnotator.xml000066400000000000000000000064501160020716200313060ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex4.MeetingAnnotator Meeting Annotator Detects meetings from co-occurrences of room numbers, dates, and times 1.0 The Apache Software Foundation WindowSize Maximum number of characters within which a room number, a date, and two times must occur for a meeting annotation to be created. Integer false true WindowSize 200 org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.Meeting en true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/meetingFinder/MeetingDetectorTAE.xml000066400000000000000000000055041160020716200314430ustar00rootroot00000000000000 org.apache.uima.java false Meeting Detector TAE Detects Room Numbers, Times, and Dates in text, and annotates the combination of all three as a meeting. RoomNumber DateTime Meeting org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/meetingFinder/MeetingFinderAggregate.xml000066400000000000000000000066101160020716200323550ustar00rootroot00000000000000 org.apache.uima.java false Meeting Finder Aggregate Implements a collection processing engine including collection reader, analysis engines and cas consumer. CollectionReader TokenAndSentence MeetingDetector CasConsumer org.apache.uima.examples.tokenizer.Sentence org.apache.uima.examples.tokenizer.Token org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true false false SimpleTokenAndSentenceAnnotator.xml000066400000000000000000000054601160020716200342010ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/meetingFinder org.apache.uima.java true org.apache.uima.examples.tokenizer.SimpleTokenAndSentenceAnnotator Simple Token and Sentence Annotator Annotates tokens and sentences. 1.0 The Apache Software Foundation org.apache.uima.examples.tokenizer.Token uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence org.apache.uima.examples.tokenizer.Token en true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/meetingFinder/SourceDocumentInformation.xml000066400000000000000000000067061160020716200332010ustar00rootroot00000000000000 org.apache.uima.examples.SourceDocumentInformation Defines a type for storing information about the original source document from which the current CAS was initialized 1.0 The Apache Software Foundation org.apache.uima.examples.SourceDocumentInformation Stores detailed information about the original source document from which the current CAS was initialized. All information (like size) refers to the source document and not to the document in the CAS which may be converted and filtered by a CAS Initializer. For example this information will be written to the Semantic Search index so that the original document contents can be retrieved by queries. uima.tcas.Annotation uri URI of document. (For example, file:///MyDirectory/myFile.txt for a simple file or http://uima.apache.org/index.html for content from a web source.) uima.cas.String offsetInSource Byte offset of the start of document content within original source file or other input source. Only used if the CAS document was retrieved from an source where one physical source file contained several conceptual documents. Zero otherwise. uima.cas.Integer documentSize Size of original document in bytes before processing by CAS Initializer. Either absolute file size of size within file or other source. uima.cas.Integer lastSegment For a CAS that represents a segment of a larger source document, this flag indicates whether this CAS is the final segment of the source document. This is useful for downstream components that want to take some action after having seen all of the segments of a particular source document. uima.cas.Boolean uima-as-2.3.1/uima-as/src/test/resources/descriptors/meetingFinder/TutorialTypeSystem.xml000066400000000000000000000074151160020716200317040ustar00rootroot00000000000000 TutorialTypeSystem Type System Definition for the tutorial examples - as of Exercise 4 The Apache Software Foundation 1.0 org.apache.uima.tutorial.RoomNumber uima.tcas.Annotation building Building containing this room uima.cas.String org.apache.uima.tutorial.DateTimeAnnot uima.tcas.Annotation shortDateString uima.cas.String org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.Meeting uima.tcas.Annotation room org.apache.uima.tutorial.RoomNumber date org.apache.uima.tutorial.DateAnnot startTime org.apache.uima.tutorial.TimeAnnot endTime org.apache.uima.tutorial.TimeAnnot org.apache.uima.examples.tokenizer.Token uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence uima.tcas.Annotation uima-as-2.3.1/uima-as/src/test/resources/descriptors/meetingFinder/XmiWriterCasConsumer.xml000066400000000000000000000053651160020716200321310ustar00rootroot00000000000000 org.apache.uima.java org.apache.uima.examples.xmi.XmiWriterCasConsumer Xmi Writer CAS Consumer Writes the CAS to XMI format 1.0 The Apache Software Foundation OutputDirectory Directory where the XMI files will be written String false true OutputDirectory temp-uima-output/xmi_output org.apache.uima.examples.SourceDocumentInformation false true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/multiplier/000077500000000000000000000000001160020716200247075ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/multiplier/SimpleCasGenerator.xml000066400000000000000000000170341160020716200311650ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasGenerator Simple Text Segmenter Generates specified number of CASes. 1.0 The Apache Software Foundation NumberToGenerate Approximate number of CASes to create. Integer false true StringOne document text String false true StringTwo document text String false true InputFile document text String false true NumberToGenerate 1 StringOne Upcoming UIMA Seminars April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. StringTwo UIMA Summer School August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH InputFile data/IBM_LifeSciences.xml false true true uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/000077500000000000000000000000001160020716200243645ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex1/000077500000000000000000000000001160020716200250615ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex1/RoomNumberAnnotator.xml000066400000000000000000000045311160020716200315610ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex1.RoomNumberAnnotator Room Number Annotator An example annotator that searches for room numbers in the IBM Watson research buildings. 1.0 The Apache Software Foundation org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.RoomNumber:building true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex1/TutorialTypeSystem.xml000066400000000000000000000033061160020716200314570ustar00rootroot00000000000000 TutorialTypeSystem Type System Definition for the tutorial examples - as of Exercise 1 The Apache Software Foundation 1.0 org.apache.uima.tutorial.RoomNumber uima.tcas.Annotation building Building containing this room uima.cas.String uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex2/000077500000000000000000000000001160020716200250625ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex2/RoomNumberAnnotator.xml000066400000000000000000000067711160020716200315720ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex2.RoomNumberAnnotator Room Number Annotator An example annotator that searches for room numbers in the IBM Watson research buildings. 1.0 The Apache Software Foundation Patterns List of room number regular expression pattterns. String true true Locations List of locations corresponding to the room number expressions specified by the Patterns parameter. String true true Patterns \b[0-4]\d-[0-2]\d\d\b \b[G1-4][NS]-[A-Z]\d\d\b \bJ[12]-[A-Z]\d\d\b Locations Watson - Yorktown Watson - Hawthorne I Watson - Hawthorne II org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.RoomNumber:building true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex3/000077500000000000000000000000001160020716200250635ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex3/RoomNumberAndDateTime.xml000066400000000000000000000051051160020716200317330ustar00rootroot00000000000000 org.apache.uima.java false Aggregate TAE - Room Number and DateTime Annotators Detects Room Numbers, Dates, and Times RoomNumber DateTime org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex3/TutorialDateTime.xml000066400000000000000000000053431160020716200310320ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex3.TutorialDateTime TutorialDateTime Annotator Finds dates and times 1.0 The Apache Software Foundation org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateAnnot en true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex3/TutorialTypeSystem.xml000066400000000000000000000047601160020716200314660ustar00rootroot00000000000000 TutorialTypeSystem Type System Definition for the tutorial examples - as of Exercise 3 The Apache Software Foundation 1.0 org.apache.uima.tutorial.RoomNumber uima.tcas.Annotation building Building containing this room uima.cas.String org.apache.uima.tutorial.DateTimeAnnot uima.tcas.Annotation shortDateString uima.cas.String org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.DateTimeAnnot uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex4/000077500000000000000000000000001160020716200250645ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex4/MeetingAnnotator.xml000066400000000000000000000064501160020716200310710ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex4.MeetingAnnotator Meeting Annotator Detects meetings from co-occurrences of room numbers, dates, and times 1.0 The Apache Software Foundation WindowSize Maximum number of characters within which a room number, a date, and two times must occur for a meeting annotation to be created. Integer false true WindowSize 200 org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.Meeting en true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex4/MeetingDetectorTAE.xml000066400000000000000000000054621160020716200312310ustar00rootroot00000000000000 org.apache.uima.java false Meeting Detector TAE Detects Room Numbers, Times, and Dates in text, and annotates the combination of all three as a meeting. RoomNumber DateTime Meeting org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex4/TutorialTypeSystem.xml000066400000000000000000000074151160020716200314670ustar00rootroot00000000000000 TutorialTypeSystem Type System Definition for the tutorial examples - as of Exercise 4 The Apache Software Foundation 1.0 org.apache.uima.tutorial.RoomNumber uima.tcas.Annotation building Building containing this room uima.cas.String org.apache.uima.tutorial.DateTimeAnnot uima.tcas.Annotation shortDateString uima.cas.String org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.Meeting uima.tcas.Annotation room org.apache.uima.tutorial.RoomNumber date org.apache.uima.tutorial.DateAnnot startTime org.apache.uima.tutorial.TimeAnnot endTime org.apache.uima.tutorial.TimeAnnot org.apache.uima.examples.tokenizer.Token uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence uima.tcas.Annotation uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex5/000077500000000000000000000000001160020716200250655ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex5/RoomNumberAnnotator.xml000066400000000000000000000074751160020716200315770ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex5.RoomNumberAnnotator Room Number Annotator An example annotator that searches for room numbers in the IBM Watson research buildings. 1.0 The Apache Software Foundation Patterns List of room number regular expression pattterns. String true true Locations List of locations corresponding to the room number expressions specified by the Patterns parameter. String true true Patterns \b[0-4]\d-[0-2]\d\d\b \b[G1-4][NS]-[A-Z]\d\d\b \bJ[12]-[A-Z]\d\d\b (foo Locations Watson - Yorktown Watson - Hawthorne I Watson - Hawthorne II org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.RoomNumber:building true true false uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex6/000077500000000000000000000000001160020716200250665ustar00rootroot00000000000000uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex6/TutorialTypeSystem.xml000066400000000000000000000105061160020716200314640ustar00rootroot00000000000000 TutorialTypeSystem Type System Definition for the tutorial examples - as of Exercise 6 1.0 The Apache Software Foundation org.apache.uima.tutorial.RoomNumber uima.tcas.Annotation building Building containing this room uima.cas.String org.apache.uima.tutorial.DateTimeAnnot uima.tcas.Annotation shortDateString uima.cas.String org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.Meeting uima.tcas.Annotation room org.apache.uima.tutorial.RoomNumber date org.apache.uima.tutorial.DateAnnot startTime org.apache.uima.tutorial.TimeAnnot endTime org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.UimaAcronym uima.tcas.Annotation expandedForm uima.cas.String org.apache.uima.tutorial.UimaMeeting org.apache.uima.tutorial.Meeting org.apache.uima.examples.tokenizer.Token uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence uima.tcas.Annotation uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex6/UimaAcronymAnnotator.xml000066400000000000000000000064641160020716200317340ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex6.UimaAcronymAnnotator UIMA Acronym Annotator Annotates UIMA Acronyms and provides their expanded form. 1.0 The Apache Software Foundation org.apache.uima.tutorial.UimaAcronym en true true false AcronymTable Table of acronyms and their expanded forms. org.apache.uima.tutorial.ex6.StringMapResource UimaAcronymTableFile A table containing UIMA acronyms and their expanded forms. file:org/apache/uima/tutorial/ex6/uimaAcronyms.txt org.apache.uima.tutorial.ex6.StringMapResource_impl AcronymTable UimaAcronymTableFile uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex6/UimaMeetingAnnotator.xml000066400000000000000000000055311160020716200317060ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex6.UimaMeetingAnnotator UIMA Meeting Annotator Iterates over Meeting annotations and annotates a meeting as a UimaMeeting if a UIMA acronym occurs in close proximity to that meeting. 1.0 The Apache Software Foundation org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.UimaMeeting en true true false UimaTermTable Map whose keps are UIMA terms. org.apache.uima.tutorial.ex6.StringMapResource false uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex6/UimaMeetingDetectorTAE.xml000066400000000000000000000076641160020716200320550ustar00rootroot00000000000000 org.apache.uima.java false UIMA Meeting Detector TAE Annotates meeting notices, and also marks those meetings whose topic is likely to be related to UIMA. Also annotates all UIMA acronyms and provides their expanded form. This TAE also demonstrates using the Resource Manager to share data between annotators. Both the UimaMeetingAnnotator and UimaAcronymAnnotator share a common resource file. MeetingDetector UimaMeetingAnnotator UimaAcronymAnnotator org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.UimaMeeting org.apache.uima.tutorial.UimaAcronym en true true false UimaAcronymTableFile A table containing UIMA acronyms and their exanded forms. file:org/apache/uima/tutorial/ex6/uimaAcronyms.txt org.apache.uima.tutorial.ex6.StringMapResource_impl UimaAcronymAnnotator/AcronymTable UimaAcronymTableFile UimaMeetingAnnotator/UimaTermTable UimaAcronymTableFile uima-as-2.3.1/uima-as/src/test/resources/descriptors/tutorial/ex6/resourceSpecifierSchema.xsd000066400000000000000000000573501160020716200324220ustar00rootroot00000000000000 Schema for UIMA Resource Specifiers. This includes Analysis Engine Descriptors, Collection Processing Component Descriptors, and Service Specifiers (client descriptors). CPE Descriptors are currently not covered by this schema. uima-as-2.3.1/uimaj-as-activemq/000077500000000000000000000000001160020716200163615ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/pom.xml000066400000000000000000000216671160020716200177120ustar00rootroot00000000000000 4.0.0 org.apache.uima uima-as-parent 2.3.1 ../uima-as-parent/pom.xml uimaj-as-activemq 2.3.1 UIMA-AS: ${project.artifactId} UIMA-AS ActiveMQ incorporation ${uimaWebsiteUrl} scm:svn:http://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/uimaj-as-activemq scm:svn:https://svn.apache.org/repos/asf/uima/uima-as/tags/uima-as-2.3.1-rc7/uimaj-as-activemq http://svn.apache.org/viewvc/uima/uima-as/tags/uima-as-2.3.1-rc7/uimaj-as-activemq ${project.artifactId} ${ibmNoticeText} org.apache.uima uimaj-core ${uimajDependencyVersion} compile org.apache.activemq activemq-all 5.4.1 org.apache.activemq activemq-jaas 5.4.1 org.apache.activemq activemq-web 5.4.1 org.apache.activemq activemq-spring 5.4.1 org.apache.activemq activemq-optional 5.4.1 org.apache.activemq kahadb 5.4.1 org.springframework spring-core 3.0.3.RELEASE org.springframework spring-asm 3.0.3.RELEASE org.springframework spring-aop 3.0.3.RELEASE org.springframework spring-beans 3.0.3.RELEASE org.springframework spring-context 3.0.3.RELEASE org.springframework spring-expression 3.0.3.RELEASE org.springframework spring-tx 3.0.3.RELEASE org.springframework spring-jms 3.0.3.RELEASE org.apache.geronimo.specs geronimo-jms_1.1_spec 1.1 org.apache.geronimo.specs geronimo-j2ee-management_1.1_spec 1.0.1 org.apache.geronimo.specs geronimo-servlet_2.5_spec 1.2 org.eclipse.jetty.aggregate jetty-all-server 7.0.1.v20091125 org.apache.uima uimaj-as-core ${project.version} compile org.apache.uima uimaj-as-jms ${project.version} compile org.apache.uima uimaj-cpe org.apache.uima uimaj-examples ${uimajDependencyVersion} test org.apache.uima uimaj-test-util ${uimajDependencyVersion} test ${project.artifactId} org.apache.maven.plugins maven-surefire-plugin -Xmx300M **/TestUimaASBasic.java org.apache.rat apache-rat-plugin default-cli release.properties src/test/resources/data/DoubleByteText.txt extended-test org.apache.maven.plugins maven-failsafe-plugin 2.7.2 integration-test integration-test verify verify -Xmx1024M UTF-8 **/TestUimaASExtended.java uima-as-2.3.1/uimaj-as-activemq/src/000077500000000000000000000000001160020716200171505ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/000077500000000000000000000000001160020716200200745ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/000077500000000000000000000000001160020716200210155ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/000077500000000000000000000000001160020716200216045ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/000077500000000000000000000000001160020716200230255ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/000077500000000000000000000000001160020716200237605ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/aae/000077500000000000000000000000001160020716200245065ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/aae/jms_adapter/000077500000000000000000000000001160020716200267775ustar00rootroot00000000000000JmsAnalysisEngineServiceAdapter.java000066400000000000000000000050171160020716200357730ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/aae/jms_adapter/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.aae.jms_adapter; import java.util.Map; import org.apache.uima.analysis_engine.service.impl.AnalysisEngineServiceAdapter; import org.apache.uima.resource.CustomResourceSpecifier; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.resource.ResourceSpecifier; /** * Implementation of {@link AnalysisEngineServiceAdapter} for JMS. * * */ public class JmsAnalysisEngineServiceAdapter extends AnalysisEngineServiceAdapter { /** * @see org.apache.uima.resource.Resource#initialize(ResourceSpecifier, Map) */ public boolean initialize(ResourceSpecifier aSpecifier, Map aAdditionalParams) throws ResourceInitializationException { // aSpecifier must be a CustomResourceSpecifier if (!(aSpecifier instanceof CustomResourceSpecifier)) { return false; } // create proxy to service setStub(new JmsAnalysisEngineServiceStub(this, ((CustomResourceSpecifier) aSpecifier) .getParameters())); // do superclass initialization, which among other things initializes UimaContext. // note we need to establish connection to service before calling this, since // superclass initialization depends on having access to the component metadata. super.initialize(aSpecifier, aAdditionalParams); // Sofa mappings are currently not implemented for remote AEs. Catch this // and report an error. if (getUimaContextAdmin().getSofaMap().size() > 0) { throw new ResourceInitializationException( ResourceInitializationException.SOFA_MAPPING_NOT_SUPPORTED_FOR_REMOTE, new Object[] { getMetaData().getName() }); } return true; } } JmsAnalysisEngineServiceStub.java000066400000000000000000000240011160020716200353220ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/aae/jms_adapter/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.aae.jms_adapter; import java.util.HashMap; import java.util.Map; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.client.UimaASStatusCallbackListener; import org.apache.uima.aae.client.UimaAsBaseCallbackListener; import org.apache.uima.aae.client.UimaAsynchronousEngine; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.adapter.jms.activemq.JmsOutputChannel; import org.apache.uima.adapter.jms.client.BaseUIMAAsynchronousEngine_impl; import org.apache.uima.analysis_engine.AnalysisEngineServiceStub; import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData; import org.apache.uima.cas.CAS; import org.apache.uima.collection.EntityProcessStatus; import org.apache.uima.resource.Parameter; import org.apache.uima.resource.Resource; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.resource.ResourceProcessException; import org.apache.uima.resource.ResourceServiceException; import org.apache.uima.resource.metadata.ProcessingResourceMetaData; import org.apache.uima.resource.metadata.ResourceMetaData; import org.apache.uima.util.Level; public class JmsAnalysisEngineServiceStub extends UimaAsBaseCallbackListener implements AnalysisEngineServiceStub { private static final Class CLASS_NAME = JmsAnalysisEngineServiceStub.class; public static final String PARAM_BROKER_URL = "brokerUrl"; public static final String PARAM_ENDPOINT = "endpoint"; public static final String PARAM_TIMEOUT = "timeout"; public static final String PARAM_GETMETA_TIMEOUT = "getmetatimeout"; public static final String PARAM_CPC_TIMEOUT = "cpctimeout"; public static final String PARAM_BIN_SERIALIZTION = "binary_serialization"; public static final String PARAM_IGNORE_PROCESS_ERRORS = "ignore_process_errors"; private Object mux = new Object(); private boolean cpcReceived; private boolean ignoreErrors = false; private UimaAsynchronousEngine uimaEEEngine; public JmsAnalysisEngineServiceStub(Resource owner, Parameter[] parameters) throws ResourceInitializationException { // read parameters String brokerUrl = null; String endpoint = null; int timeout = 0; int getMetaTimeout = 0; int cpcTimeout = 0; String binary_serialization = null; for (int i = 0; i < parameters.length; i++) { if (PARAM_BROKER_URL.equalsIgnoreCase(parameters[i].getName())) { brokerUrl = parameters[i].getValue(); } else if (PARAM_ENDPOINT.equalsIgnoreCase(parameters[i].getName())) { endpoint = parameters[i].getValue(); } else if (PARAM_TIMEOUT.equalsIgnoreCase(parameters[i].getName())) { timeout = Integer.parseInt(parameters[i].getValue()); } else if (PARAM_BIN_SERIALIZTION.equalsIgnoreCase(parameters[i].getName())) { binary_serialization = parameters[i].getValue(); } else if (PARAM_GETMETA_TIMEOUT.equalsIgnoreCase(parameters[i].getName())) { getMetaTimeout = Integer.parseInt(parameters[i].getValue()); } else if (PARAM_CPC_TIMEOUT.equalsIgnoreCase(parameters[i].getName())) { cpcTimeout = Integer.parseInt(parameters[i].getValue()); } else if (PARAM_IGNORE_PROCESS_ERRORS.equalsIgnoreCase(parameters[i].getName())) { ignoreErrors = parameters[i].getValue().equalsIgnoreCase("true"); } } // initialize UIMA EE Engine Map appCtxt = new HashMap(); appCtxt.put(UimaAsynchronousEngine.ServerUri, brokerUrl); appCtxt.put(UimaAsynchronousEngine.Endpoint, endpoint); appCtxt.put(UimaAsynchronousEngine.CasPoolSize, 0); if (timeout > 0) { appCtxt.put(UimaAsynchronousEngine.Timeout, timeout); } if (getMetaTimeout > 0) { appCtxt.put(UimaAsynchronousEngine.GetMetaTimeout, getMetaTimeout); } if (cpcTimeout > 0) { appCtxt.put(UimaAsynchronousEngine.CpcTimeout, cpcTimeout); } if (binary_serialization != null && binary_serialization.equalsIgnoreCase("true")) { appCtxt.put(UimaAsynchronousEngine.SerializationStrategy, "binary"); } uimaEEEngine = new BaseUIMAAsynchronousEngine_impl(); uimaEEEngine.addStatusCallbackListener(this); uimaEEEngine.initialize(appCtxt); } /** * @see org.apache.uima.resource.service.ResourceServiceStub#callGetMetaData() */ public ResourceMetaData callGetMetaData() throws ResourceServiceException { // metadata already retrieved during initialization try { //return uimaEEEngine.getMetaData(); ResourceMetaData rmd = uimaEEEngine.getMetaData(); if ( rmd != null ) { ((ProcessingResourceMetaData)rmd).getOperationalProperties().setMultipleDeploymentAllowed(true); return rmd; } } catch (ResourceInitializationException e) { throw new ResourceServiceException(e); } throw new ResourceServiceException(new Exception("Uima AS getMetaData() call failed.")); } /** * @see org.apache.uima.analysis_engine.service.AnalysisEngineServiceStub#callGetAnalysisEngineMetaData() */ public AnalysisEngineMetaData callGetAnalysisEngineMetaData() throws ResourceServiceException { return (AnalysisEngineMetaData) callGetMetaData(); } /** * @see org.apache.uima.analysis_engine.service.AnalysisEngineServiceStub#callProcess(CAS) */ public void callProcess(CAS aCAS) throws ResourceServiceException { try { uimaEEEngine.sendAndReceiveCAS(aCAS); } catch (ResourceProcessException e) { if (!ignoreErrors) throw new ResourceServiceException(e); } } /** * @see CasObjectProcessorServiceStub#callProcessCas(CAS) */ public void callProcessCas(CAS aCAS) throws ResourceServiceException { callProcess(aCAS); } /** * @see org.apache.uima.resource.service.impl.ResourceServiceStub#destroy() */ public void destroy() { try { uimaEEEngine.stop(); } catch (Exception e) { if (UIMAFramework.getLogger().isLoggable(Level.WARNING)) { UIMAFramework.getLogger().log(Level.WARNING, e.getMessage(), e); } } } /** * @see org.apache.uima.collection.impl.service.CasObjectProcessorServiceStub#callBatchProcessComplete() */ public void callBatchProcessComplete() throws ResourceServiceException { // Not supported. Do nothing, rather than throw an exception, since this is called // in the normal course of CPE processing. } /** * @see org.apache.uima.collection.impl.service.CasObjectProcessorServiceStub#callCollectionProcessComplete() */ public void callCollectionProcessComplete() throws ResourceServiceException { try { cpcReceived = false; uimaEEEngine.collectionProcessingComplete(); // make this routine synchronous synchronized (mux) { while (!cpcReceived) { try { mux.wait(); } catch (InterruptedException e) { // Only here if something interrupts this thread if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "callCollectionProcessComplete", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } } catch (ResourceProcessException e) { throw new ResourceServiceException(e); } } /* * (non-Javadoc) * * @see * org.apache.uima.aae.client.UimaASStatusCallbackListener#collectionProcessComplete(org.apache * .uima.collection.EntityProcessStatus) */ public void collectionProcessComplete(EntityProcessStatus aStatus) { synchronized (mux) { cpcReceived = true; mux.notifyAll(); } } /* * (non-Javadoc) * * @see * org.apache.uima.aae.client.UimaASStatusCallbackListener#entityProcessComplete(org.apache.uima * .cas.CAS, org.apache.uima.collection.EntityProcessStatus) */ public void entityProcessComplete(CAS aCas, EntityProcessStatus aStatus) { // not used } /* * (non-Javadoc) * * @see * org.apache.uima.aae.client.UimaASStatusCallbackListener#initializationComplete(org.apache.uima * .collection.EntityProcessStatus) */ public void initializationComplete(EntityProcessStatus aStatus) { // not used } } uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/aae/jmx/000077500000000000000000000000001160020716200253045ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/aae/jmx/RemoteJMXServer.java000066400000000000000000000204301160020716200311470ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.aae.jmx; import java.io.IOException; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.jms.JMSException; import javax.management.MBeanServerConnection; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; import javax.management.QueryExp; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import org.apache.activemq.broker.jmx.QueueViewMBean; import org.apache.uima.UIMAFramework; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.util.Level; import org.springframework.jmx.JmxException; public class RemoteJMXServer { private static final Class CLASS_NAME = RemoteJMXServer.class; private MBeanServerConnection brokerMBeanServer = null; private ConcurrentHashMap queueMBeanMap = new ConcurrentHashMap(); private String brokerName; private JMXConnector jmxc = null; private volatile boolean initialized = false; public boolean isInitialized() { return initialized; } /** * Creates a connection to an MBean Server identified by * remoteJMXServerHostName and remoteJMXServerPort * * @param remoteJMXServerHostName * - MBeanServer host name * @param remoteJMXServerPort * - MBeanServer port * @return - none * * @throws Exception */ public void initialize(String jmxDomain, String remoteJMXServerHostname, String remoteJMXServerPort) throws Exception { // Construct connect string to the JMX MBeanServer String remoteJmxUrl = "service:jmx:rmi:///jndi/rmi://" + remoteJMXServerHostname + ":" + remoteJMXServerPort + "/jmxrmi"; JMXServiceURL url = new JMXServiceURL(remoteJmxUrl); jmxc = JMXConnectorFactory.connect(url, null); brokerMBeanServer = jmxc.getMBeanServerConnection(); // Its possible that the above code succeeds even though the broker runs // with no JMX Connector. At least on windows the above does not throw an // exception as expected. It appears that the broker registers self JVMs MBeanServer // but it does *not* register any Connections, nor Queues. The code below // checks if the MBean server we are connected to has any QueueMBeans registered. // A broker with jmx connector should have queue mbeans registered and thus // the code below should always succeed. Conversely, a broker with no jmx connector // reports no queue mbeans. // Query broker MBeanServer for QueueMBeans Set queueSet = brokerMBeanServer.queryNames(new ObjectName(jmxDomain + ":*,Type=Queue"), (QueryExp) null); if ( queueSet.isEmpty() ) { // No QueueMBeans, meaning no JMX support throw new JmxException("ActiveMQ Broker Not Configured With JMX Support"); } // Query JMX Server for Broker MBean. We need the broker's name from an MBean to construct // queue query string. for (Object nameObject : brokerMBeanServer.queryNames(new ObjectName(jmxDomain + ":*,Type=Broker"), (QueryExp) null)) { ObjectName brokerObjectName = (ObjectName) nameObject; if (brokerObjectName.getCanonicalName().endsWith("Type=Broker")) { // Extract just the name from the canonical name brokerName = brokerObjectName.getCanonicalName().substring(0, brokerObjectName.getCanonicalName().indexOf(",")); initialized = true; break; // got the broker name } } } /** * Disconnects from MBeanServer */ public void disconnect() { if (jmxc != null) { try { jmxc.close(); brokerMBeanServer = null; queueMBeanMap.clear(); } catch (IOException e) { } } } /** * Tries to fetch total number of MBeans in the MBeanServer. The real goal here is to check if the * server responds. Failure here indicates failed server connection. * * @return */ public boolean isServerAvailable() { try { brokerMBeanServer.getMBeanCount(); return true; } catch (Exception e) { return false; } } public void attachToTempQueue(String tempQueueName) throws Exception { if (!queueMBeanMap.containsKey(tempQueueName)) { ObjectName uimaServiceTempReplyQueuePattern = composeObjectName("TempQueue", tempQueueName); QueueViewMBean replyQueueMBean = getQueueMBean(tempQueueName, uimaServiceTempReplyQueuePattern); if (replyQueueMBean != null) { queueMBeanMap.put(tempQueueName, replyQueueMBean); } } } private ObjectName composeObjectName(String queueType, String queueName) throws Exception { ObjectName n = new ObjectName(brokerName + ",Type=" + queueType + ",Destination=" + queueName); return n; } /** * Checks if a given queue name exists in remote MBeanServer's registry. * NOTE: The code returns true in case the MBeanServer is not available. * * @param queueName * - queue to lookup in the MBeanServer * @return - true if queue exists, false otherwise */ public boolean isClientReplyQueueAvailable(String queueName) { try { ObjectName uimaServiceTempReplyQueuePattern = composeObjectName("TempQueue", queueName); // Tests if queue exists. If a client terminates, the reply queue will be removed and we // expect null from getQueueMBean() if (isServerAvailable() && getQueueMBean(queueName, uimaServiceTempReplyQueuePattern) == null) { return false; } } catch (Exception e) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "isClientReplyQueueAvailable", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } return true; // returns true, in case the MBeanServer is not available or the queue exists } /** * Creates proxy to a queue MBean using given match pattern * * @param key * @param matchPattern * @return * @throws Exception */ private QueueViewMBean getQueueMBean(String key, ObjectName matchPattern) throws Exception { // Fetch queue names matching a given pattern. Set queues = new HashSet(brokerMBeanServer.queryNames(matchPattern, null)); for (ObjectName name : queues) { // Create and return a proxy to the queue's MBean return (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(brokerMBeanServer, name, QueueViewMBean.class, true); } return null; } /** * Replaces ':' with '_'. JMX queries containing ':' are illegal. * * @param destinationName * @return */ public String normalize(String destinationName) { String qN = destinationName.substring(destinationName.indexOf("ID")); return qN.replaceAll(":", "_"); } public static void main(String[] args) { try { RemoteJMXServer broker = new RemoteJMXServer(); broker.initialize("org.apache.activemq", args[0], args[1]); if (broker.isClientReplyQueueAvailable(args[2])) { System.out.println("TempQueue:" + args[2] + " Exists"); } else { System.out.println("TempQueue:" + args[2] + " Does not Exist"); } } catch (Exception e) { e.printStackTrace(); } } } uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/aae/jmx/monitor/000077500000000000000000000000001160020716200267735ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/aae/jmx/monitor/JmxMonitor.java000066400000000000000000000717211160020716200317540ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.aae.jmx.monitor; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.lang.management.RuntimeMXBean; import java.lang.management.ThreadMXBean; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.management.MBeanServerConnection; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import org.apache.activemq.broker.jmx.QueueViewMBean; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.jmx.ServiceInfoMBean; import org.apache.uima.aae.jmx.ServicePerformanceMBean; import org.apache.uima.aae.spi.transport.vm.UimaVmQueueMBean; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.util.Level; import org.apache.uima.util.impl.CasPoolManagementImplMBean; /** * Collects metrics from UIMA-AS Service MBeans at defined intervals and passes the metrics for * formatting to the registered {@link JmxMonitorListener} * */ public class JmxMonitor implements Runnable { private static final Class CLASS_NAME = JmxMonitor.class; public static final String SamplingInterval = "uima.jmx.monitor.interval"; public static final String FormatterListener = "uima.jmx.monitor.formatter"; private boolean running = false; private MBeanServerConnection mbsc; private ObjectName uimaServicePattern; private ObjectName uimaServiceQueuePattern; private ObjectName uimaServiceTempQueuePattern; private Set servicePerformanceNames; private long interval; private ConcurrentHashMap stats = new ConcurrentHashMap(); private long startTime = System.nanoTime(); private List listeners = new ArrayList(); private int maxNameLength = 0; private boolean verbose = false; private ThreadMXBean threads = null; private RuntimeMXBean runtime = null; private OperatingSystemMXBean os = null; private int serviceCount = 0; /** * Creates a connection to an MBean Server identified by remoteServerURI * * @param remoteServerURI * - URI to MBeanServer * @return - connection to MBeanServer * * @throws Exception */ private MBeanServerConnection getServerConnection(String remoteServerURI) throws Exception { JMXServiceURL url = new JMXServiceURL(remoteServerURI); JMXConnector jmxc = JMXConnectorFactory.connect(url, null); MBeanServerConnection server = jmxc.getMBeanServerConnection(); return server; } /** * Registers custom {@link JmxMonitorListener} * * @param listener * - listener to receive metrics for formatting */ public void addJmxMonitorListener(JmxMonitorListener listener) { listeners.add(listener); } private void showServerEnvironment(RuntimeMXBean runtime) { echo("\nRemote JVM Info: \n\tJVM::" + runtime.getVmName() + "\n\tJVM Vendor::" + runtime.getVmVendor() + "\n\tJVM Version::" + runtime.getVmVersion() + "\n\n"); } /** * Passes metrics to all registered {@link JmxMonitorListener} objects * * @param uptime * - time when the metrics were collected * @param metrics * - current metrics */ public void notifyListeners(long uptime, ServiceMetrics[] metrics) { for (JmxMonitorListener listener : listeners) { listener.onNewMetrics(uptime, metrics); } } public boolean isVerbose() { return verbose; } public void setVerbose() { verbose = true; } // Should be called after initialize() public int getMaxServiceNameLength() { return maxNameLength; } private CasPoolManagementImplMBean getServiceCasPoolMBean(String labelToMatch, Set names) { for (ObjectName name : names) { // Check if the current name is the Service Performance MBean if (name.toString().endsWith(labelToMatch.trim())) { return (CasPoolManagementImplMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, name, CasPoolManagementImplMBean.class, true); } } return null; // not found } /** * Connects to a remote JMX server identified by given remoteServerURI. Creates * proxies for all UIMA AS ServicePerformance MBeans found in the JMX server registry. If UIMA AS * service MBean indicates a remote service, this method connects to a remote Broker and creates a * proxy to an input queue for that service. * * * @param remoteServerURI * @param samplingInterval * @throws Exception */ public void initialize(String remoteServerURI, long samplingInterval) throws Exception { interval = samplingInterval; // Connect to the remote JMX Server try { mbsc = getServerConnection(remoteServerURI); } catch (Exception e) { System.out.println("Unable to Connect To Jmx Server. URL:" + remoteServerURI); throw e; } System.out.println(">>> Connected To Jmx Server. URL:" + remoteServerURI); // Fetch remote JVM's MXBeans ObjectName runtimeObjName = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME); ObjectName threadObjName = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME); ObjectName osObjName = new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME); Set mbeans = mbsc.queryNames(threadObjName, null); mbeans = mbsc.queryNames(runtimeObjName, null); for (ObjectName name : mbeans) { runtime = (RuntimeMXBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, name, RuntimeMXBean.class, true); } mbeans = mbsc.queryNames(osObjName, null); for (ObjectName name : mbeans) { os = (OperatingSystemMXBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, name, OperatingSystemMXBean.class, true); } System.out.println(runtime.getVmName() + "::" + runtime.getVmVendor() + "::" + runtime.getVmVersion()); // Construct query string to fetch UIMA-AS MBean names from the JMX Server registry uimaServicePattern = new ObjectName("org.apache.uima:type=ee.jms.services,*"); // Construct query string to fetch Queue MBean names from the JMX Server registry uimaServiceQueuePattern = new ObjectName( "org.apache.activemq:BrokerName=localhost,Type=Queue,*"); uimaServiceTempQueuePattern = new ObjectName( "org.apache.activemq:BrokerName=localhost,Type=TempQueue,*"); // Fetch UIMA AS MBean names from the JMX Server that match the name pattern Set names = new HashSet(mbsc.queryNames(uimaServicePattern, null)); String key = ""; if (verbose) System.out.println("\nFound UIMA AS Services Managed by JMX Server:" + remoteServerURI); // Find all Service Performance MBeans for (ObjectName name : names) { // Set up a key for matching Service Performance MBean names String perfKey = "_Service Performance"; // Check if the current name is the Service Performance MBean if (name.toString().endsWith(perfKey)) { if (servicePerformanceNames == null) { servicePerformanceNames = new HashSet(); } // Reduce the Set to Service Performance MBeans only servicePerformanceNames.add(name); // Create a proxy object for the Service Performance MBean ServicePerformanceMBean perfMBeanProxy = (ServicePerformanceMBean) MBeanServerInvocationHandler .newProxyInstance(mbsc, name, ServicePerformanceMBean.class, true); // Extract the service name from the MBean name int beginIndx = name.toString().indexOf(perfKey); key = name.toString().substring(0, beginIndx); int nameLen = name.getKeyProperty("name").length(); if (nameLen > maxNameLength) { maxNameLength = nameLen; } // Create a proxy object to the Service Info MBean ServiceInfoMBean infoMBeanProxy = getServiceInfoMBean(names, key); key = key.substring(key.indexOf(",name=") + ",name=".length()); // Create a proxy to the service CasPool object. CasPoolManagementImplMBean casPoolMBeanProxy = null; // Get Service CAS Pool MBean Proxy. This only make sense for top level service. // This is a Cas Pool for deserializing CASes from remote clients if (infoMBeanProxy.isTopLevel()) { if (infoMBeanProxy.isAggregate()) { casPoolMBeanProxy = getServiceCasPoolMBean("AggregateContext", names); } else { casPoolMBeanProxy = getServiceCasPoolMBean("PrimitiveAEService", names); } } StatEntry entry = null; if (casPoolMBeanProxy != null) { entry = new StatEntry(perfMBeanProxy, infoMBeanProxy, casPoolMBeanProxy); } else { entry = new StatEntry(perfMBeanProxy, infoMBeanProxy); } String location = "Collocated"; // If a service is co-located in the same JVM fetch the service queue proxy if (infoMBeanProxy.getBrokerURL().startsWith("Embedded Broker")) { // Get Co-located CM Cas Pool if (infoMBeanProxy.isCASMultiplier()) { // Create a proxy to the Cas Multiplier CasPool object. CasPoolManagementImplMBean casPoolMBean = getServiceCasPoolMBean(infoMBeanProxy.getCmRegisteredName(), names); if (casPoolMBean != null) { entry.setCasPoolMBean(casPoolMBean); } } // Create a proxy to the service queue MBean UimaVmQueueMBean queueProxy = getQueueMBean(mbsc, infoMBeanProxy.getInputQueueName()); if (queueProxy != null) { entry.setInputQueueInfo(queueProxy); } UimaVmQueueMBean replyQueueProxy = getQueueMBean(mbsc, infoMBeanProxy.getReplyQueueName()); if (replyQueueProxy != null) { entry.setReplyQueueInfo(replyQueueProxy); } } else { // The MBean is for a remote service. Connect to this service Broker and create a proxy // to an input queue for the service. Assumption: the broker registers JMX server on // port 1099. location = "Remote"; int spos = infoMBeanProxy.getBrokerURL().indexOf("//"); int endpos = infoMBeanProxy.getBrokerURL().lastIndexOf(":"); String remoteHostname = infoMBeanProxy.getBrokerURL().substring(spos + 2, endpos); if (verbose) System.out.println("Connecting to a remote JMX Server: " + remoteHostname + " key:" + key); String remoteJMX = "service:jmx:rmi:///jndi/rmi://" + remoteHostname + ":1099/jmxrmi"; MBeanServerConnection remoteServer = getServerConnection(remoteJMX); QueueViewMBean inputQueueProxy = getQueueMBean(remoteServer, infoMBeanProxy .getInputQueueName(), uimaServiceQueuePattern); if (inputQueueProxy != null) { entry.setInputQueueInfo(inputQueueProxy); } else { System.out.println("Unable to find Input Queue:" + infoMBeanProxy.getInputQueueName() + " In JMX Registry:" + remoteJMX); } QueueViewMBean replyQueueProxy = null; if (infoMBeanProxy.isAggregate()) { replyQueueProxy = getQueueMBean(mbsc, infoMBeanProxy.getReplyQueueName(), uimaServiceQueuePattern); } else { replyQueueProxy = getQueueMBean(remoteServer, infoMBeanProxy.getReplyQueueName(), uimaServiceTempQueuePattern); } if (replyQueueProxy != null) { entry.setReplyQueueInfo(replyQueueProxy); } else { System.out.println("Unable to find Reply Queue:" + infoMBeanProxy.getReplyQueueName() + " In JMX Registry:" + remoteJMX); } } if (verbose) System.out.println("\nUIMA AS Service:" + key + "[>>> " + location + " <<<]\n\tService Broker:" + infoMBeanProxy.getBrokerURL() + "\n\tQueue Name:" + infoMBeanProxy.getInputQueueName()); serviceCount++; stats.put(name, entry); } } } protected int getServiceCount() { return serviceCount; } /** * Returns a proxy object to an UIMA-AS Service Info MBean identified by a key * * @param names * - list of MBean names * @param key * - target name to find in the list of MBeans * @return - proxy to MBean identified by key */ private ServiceInfoMBean getServiceInfoMBean(Set names, String key) { String target = key + "_Service Info"; for (ObjectName name : names) { if (name.toString().equals(target)) { return (ServiceInfoMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, name, ServiceInfoMBean.class, true); } } return null; } private CasPoolManagementImplMBean getCasPoolMBean(Set names, String target) { for (ObjectName name : names) { if (name.toString().endsWith(target)) { return (CasPoolManagementImplMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, name, CasPoolManagementImplMBean.class, true); } } return null; } private QueueViewMBean getQueueMBean(MBeanServerConnection server, String key, ObjectName matchPattern) throws Exception { Set queues = new HashSet(server.queryNames(matchPattern, null)); String target = "Destination=" + key; for (ObjectName name : queues) { if (name.toString().endsWith(target)) { System.out.println("Creating Proxy for Queue:" + name.toString()); return (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(server, name, QueueViewMBean.class, true); } } return null; } private UimaVmQueueMBean getQueueMBean(MBeanServerConnection server, String aPattern) throws Exception { ObjectName name = new ObjectName(aPattern); System.out.println("Creating Proxy for Queue:" + name.toString()); return (UimaVmQueueMBean) MBeanServerInvocationHandler.newProxyInstance(server, name, UimaVmQueueMBean.class, true); } protected ServiceMetrics[] collectStats(boolean initial, long uptime) { int cmFreeCasInstanceCount = 0; ServiceMetrics[] metrics = null; int index = 0; List metricsList = new ArrayList(); // iterate over all Performance MBeans to retrieve current metrics for (ObjectName name : servicePerformanceNames) { try { // Fetch previous metrics for service identified by 'name' StatEntry entry = stats.get(name); if (entry == null) { continue; } ServiceInfoMBean serviceInfo = entry.getServiceInfoMBeanProxy(); CasPoolManagementImplMBean getServiceCasPoolMBeanProxy = entry .getServiceCasPoolMBeanProxy(); boolean isRemote = serviceInfo.getBrokerURL().startsWith("tcp:"); boolean topLevel = serviceInfo.isTopLevel(); // Get the current reading from MBeans double idleTime = entry.getServicePerformanceMBeanProxy().getIdleTime(); double casPoolWaitTime = entry.getServicePerformanceMBeanProxy().getCasPoolWaitTime(); double shadowCasPoolWaitTime = entry.getServicePerformanceMBeanProxy() .getShadowCasPoolWaitTime(); double analysisTime = entry.getServicePerformanceMBeanProxy().getAnalysisTime(); long processCount = entry.getServicePerformanceMBeanProxy().getNumberOfCASesProcessed(); QueueViewMBean inputQueueInfo = entry.getInputQueueInfo(); QueueViewMBean replyQueueInfo = entry.getReplyQueueInfo(); cmFreeCasInstanceCount = -1; if (serviceInfo.isCASMultiplier() && !isRemote && entry.getCasPoolMBean() != null) { try { cmFreeCasInstanceCount = entry.getCasPoolMBean().getAvailableInstances(); } catch( Exception e) { //swallow this for now. } } long inputQueueDepth = -1; UimaVmQueueMBean vmInputQueueInfo = null; // if the service is colocated, get the bean object for the internal (non-jms) queue if (entry.isVmQueue) { vmInputQueueInfo = entry.getVmInputQueueInfo(); if (vmInputQueueInfo != null) { inputQueueDepth = vmInputQueueInfo.getQueueSize(); } } else { // service is top level and uses JMS queue inputQueueInfo = entry.getInputQueueInfo(); if (inputQueueInfo != null) { inputQueueDepth = inputQueueInfo.getQueueSize(); } } long replyQueueDepth = -1; // -1 means not available UimaVmQueueMBean vmReplyQueueInfo = null; if (entry.isVmQueue) { vmReplyQueueInfo = entry.getVmReplyQueueInfo(); if (vmReplyQueueInfo != null) { replyQueueDepth = vmReplyQueueInfo.getQueueSize(); } } else { replyQueueInfo = entry.getReplyQueueInfo(); if (replyQueueInfo != null) { replyQueueDepth = replyQueueInfo.getQueueSize(); } } // compute the delta idle time by subtracting previously reported idle time from the // current idle time double deltaIdleTime = 0; if (initial == false) { deltaIdleTime = idleTime - entry.getIdleTime(); } double deltaAnalysisTime = 0; if (analysisTime > 0) { deltaAnalysisTime = analysisTime - entry.getAnalysisTime(); } ServiceMetrics serviceMetrics = new ServiceMetrics(); serviceMetrics.setCasMultiplier(entry.getServiceInfoMBeanProxy().isCASMultiplier()); serviceMetrics.setServiceRemote(isRemote); serviceMetrics.setTopLevelService(topLevel); serviceMetrics.setTimestamp((double) uptime / 1000000); serviceMetrics.setIdleTime(deltaIdleTime); serviceMetrics.setServiceName(name.getKeyProperty("name")); serviceMetrics.setProcessCount(processCount - entry.getLastCASCount()); serviceMetrics.setInputQueueDepth(inputQueueDepth); serviceMetrics.setReplyQueueDepth(replyQueueDepth); serviceMetrics.setProcessThreadCount(entry.getServicePerformanceMBeanProxy() .getProcessThreadCount()); serviceMetrics.setAnalysisTime(deltaAnalysisTime); serviceMetrics.setCmFreeCasInstanceCount(cmFreeCasInstanceCount); // The service cas pool proxy is only valid for aggregates and top level primitives serviceMetrics.setSvcFreeCasInstanceCount(-1); if (getServiceCasPoolMBeanProxy != null) { try { serviceMetrics.setSvcFreeCasInstanceCount(getServiceCasPoolMBeanProxy .getAvailableInstances()); } catch( Exception e) { } } // populate shadow CAS pool metric for remote CAS multiplier. Filter out the top level // service if (entry.getServiceInfoMBeanProxy().isCASMultiplier() && isRemote && !topLevel) { serviceMetrics.setShadowCasPoolWaitTime(shadowCasPoolWaitTime - entry.getTotalSCPWaitTime()); entry.setSCPWaitTime(shadowCasPoolWaitTime); } else { // populate CAS pool metric serviceMetrics.setCasPoolWaitTime(casPoolWaitTime - entry.getTotalCPWaitTime()); entry.setCPWaitTime(casPoolWaitTime); } // Add metrics collected from the service to the array of metrics // in the current sampling (interval). The metrics array will // be provided to all listeners plugged into this monitor. // metrics[index++] = serviceMetrics; metricsList.add(serviceMetrics); // Save current metrics for the next delta entry.setIdleTime(idleTime); entry.incrementCASCount(processCount); entry.incrementAnalysisTime(analysisTime); } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "collectStats", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } // for if ( metricsList.size() > 0 ) { metrics = new ServiceMetrics[metricsList.size()]; metricsList.toArray(metrics); } return metrics; } /** * Retrieves metrics from UIMA-AS MBeans at defined interval. * */ public void run() { running = true; boolean initial = true; while (running) { long sampleStart = System.nanoTime(); long uptime = sampleStart - startTime; try { if (mbsc != null) { mbsc.getMBeanCount(); // test the server } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "run", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } ServiceMetrics[] metrics = collectStats(initial, uptime); if ( metrics != null ) { initial = false; // Notify listeners with current metrics collected from MBeans notifyListeners(uptime, metrics); } // compute wait time till next sample long sampleEnd = System.nanoTime(); long time2wait; long timeLost = (200000 + sampleEnd - sampleStart) / 1000000; if (interval > timeLost) { time2wait = interval - timeLost; } else { // Increase interval to a multiple of the requested interval long newInterval = interval * (1 + (timeLost / interval)); time2wait = newInterval - timeLost; } synchronized (this) { try { wait(time2wait); } catch (InterruptedException e) { running = false; } } } running = false; } public boolean isRunning() { return running; } public void doStop() { running = false; } /* * For simplicity, we declare "throws Exception". Real programs will usually want finer-grained * exception handling. */ public static void main(String[] args) throws Exception { JmxMonitor monitor = new JmxMonitor(); if (System.getProperty("verbose") != null) { // Shows a list of UIMA-AS services found in a given JMX server monitor.setVerbose(); } long samplingFrequency = 1000; // default sampling every 1000 ms if (args.length == 0 || args.length > 2) { printUsage(); System.exit(-1); } if (args.length == 3) { // The second parameter is the sampling frequency samplingFrequency = Long.parseLong(args[2]); } echo("\nJMX Sampling Frequency:" + samplingFrequency); // Use the URI provided in the first arg to connect to the JMX server. // Also define sampling frequency. The monitor will collect the metrics // at this interval. monitor.initialize(args[0], samplingFrequency); // Create listener BasicUimaJmxMonitorListener listener = new BasicUimaJmxMonitorListener(monitor .getMaxServiceNameLength()); // Plug in the monitor listener monitor.addJmxMonitorListener(listener); // Create and start the monitor thread Thread t = new Thread(monitor); t.start(); } private static void printUsage() { System.out .println("Usage: \njava -cp %UIMA_HOME%/lib/*;%UIMA_HOME%/apache-activemq-5.4.1/* -Djava.util.logging.config.file=%UIMA_HOME%/config/MonitorLogger.properties org.apache.uima.aae.jmx.monitor.JmxMonitor uri \nuri - jmx server URI- required\nfrequency - how often the checkpoint is done. Default: 1000ms - optional"); } private static void echo(String msg) { System.out.println(msg); } private static class StatEntry { ServicePerformanceMBean servicePerformanceMBeanProxy; ServiceInfoMBean serviceInfoMBeanProxy; QueueViewMBean inputQueueInfo; UimaVmQueueMBean vmInputQueueInfo; QueueViewMBean replyQueueInfo; UimaVmQueueMBean vmReplyQueueInfo; CasPoolManagementImplMBean casPoolMBeanProxy; CasPoolManagementImplMBean serviceCasPoolMBeanProxy; String name = ""; boolean isVmQueue = true; double lastIdleTime = 0; double waitTimeOnCMGetNext = 0; long casProcessedCount = 0; double cpWaitTime; double scpWaitTime; double analysisTime = 0.0; public StatEntry(ServicePerformanceMBean perfBean, ServiceInfoMBean infoBean) { this(perfBean, infoBean, null); } public StatEntry(ServicePerformanceMBean perfBean, ServiceInfoMBean infoBean, CasPoolManagementImplMBean casPoolMBeanProxy) { servicePerformanceMBeanProxy = perfBean; serviceCasPoolMBeanProxy = casPoolMBeanProxy; serviceInfoMBeanProxy = infoBean; if (!infoBean.getBrokerURL().startsWith("Embedded Broker")) { isVmQueue = false; // This is JMS queue } } public CasPoolManagementImplMBean getServiceCasPoolMBeanProxy() { return serviceCasPoolMBeanProxy; } public void setInputQueueInfo(QueueViewMBean queueView) { inputQueueInfo = queueView; } public void setInputQueueInfo(UimaVmQueueMBean queueView) { vmInputQueueInfo = queueView; } public QueueViewMBean getInputQueueInfo() { return inputQueueInfo; } public UimaVmQueueMBean getVmInputQueueInfo() { return vmInputQueueInfo; } public void setReplyQueueInfo(QueueViewMBean queueView) { replyQueueInfo = queueView; } public void setReplyQueueInfo(UimaVmQueueMBean queueView) { vmReplyQueueInfo = queueView; } public QueueViewMBean getReplyQueueInfo() { return replyQueueInfo; } public UimaVmQueueMBean getVmReplyQueueInfo() { return vmReplyQueueInfo; } public void setCasPoolMBean(CasPoolManagementImplMBean anMBean) { casPoolMBeanProxy = anMBean; } public CasPoolManagementImplMBean getCasPoolMBean() { return casPoolMBeanProxy; } public double getIdleTime() { return lastIdleTime; } public void incrementCASCount(long aCASCount) { casProcessedCount = +aCASCount; } public long getLastCASCount() { return casProcessedCount; } public void setIdleTime(double lastIdleTime) { this.lastIdleTime = lastIdleTime; } public ServicePerformanceMBean getServicePerformanceMBeanProxy() { return servicePerformanceMBeanProxy; } public ServiceInfoMBean getServiceInfoMBeanProxy() { return serviceInfoMBeanProxy; } public void setName(String aName) { name = aName; } public String getName() { return name; } public void incrementWaitTimeOnCMGetNext(double aWaitTimeOnCMGetNext) { waitTimeOnCMGetNext = +aWaitTimeOnCMGetNext; } public double getWaitTimeOnCMGetNext() { return waitTimeOnCMGetNext; } public double getTotalCPWaitTime() { return cpWaitTime; } public void setCPWaitTime(double aWaitTime) { cpWaitTime = aWaitTime; } public double getTotalSCPWaitTime() { return scpWaitTime; } public void setSCPWaitTime(double aWaitTime) { scpWaitTime = aWaitTime; } public double getAnalysisTime() { return analysisTime; } public void incrementAnalysisTime(double anAnalysisTime) { analysisTime = +anAnalysisTime; } } } uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/000077500000000000000000000000001160020716200254005ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/000077500000000000000000000000001160020716200261715ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/000077500000000000000000000000001160020716200300025ustar00rootroot00000000000000BrokerDeployer.java000066400000000000000000000333331160020716200335230ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import java.io.IOException; import java.net.BindException; import java.net.ServerSocket; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.ObjectName; import org.apache.activemq.broker.Broker; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.broker.TransportConnector; import org.apache.activemq.broker.jmx.ManagementContext; //import org.apache.activemq.memory.UsageListener; import org.apache.uima.UIMAFramework; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.util.Level; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextClosedEvent; /** * * @deprecated * */ public class BrokerDeployer implements ApplicationListener { private static final Class CLASS_NAME = BrokerDeployer.class; private static final int BASE_JMX_PORT = 1200; private static final int MAX_PORT_THRESHOLD = 200; private static BrokerService service = new BrokerService(); private Object semaphore = new Object(); private long maxBrokerMemory = 0; private String brokerURI; private TransportConnector tcpConnector = null; private TransportConnector httpConnector = null; private Object brokerInstanceMux = new Object(); public BrokerDeployer(long maxMemoryinBytes) throws Exception { maxBrokerMemory = maxMemoryinBytes; startInternalBroker(); } public BrokerDeployer() throws Exception { startInternalBroker(); } public BrokerService getBroker() { synchronized( brokerInstanceMux ) { return service; } } public void startInternalBroker() throws Exception { TransportConnector connector = null; synchronized (brokerInstanceMux) { if (maxBrokerMemory > 0) { System.out .println("Configuring Internal Broker With Max Memory Of:" + maxBrokerMemory); if (UIMAFramework.getLogger(CLASS_NAME) .isLoggable(Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.CONFIG, CLASS_NAME.getName(), "startInternalBroker", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_broker_memory__CONFIG", new Object[] { maxBrokerMemory }); } } String[] connectors = service.getNetworkConnectorURIs(); if (connectors != null) { for (int i = 0; i < connectors.length; i++) { System.out .println("ActiveMQ Broker Started With Connector:" + connectors[i]); } brokerURI = service.getMasterConnectorURI(); } else { String connectorList = ""; service.setPersistent(false); int startPort = BASE_JMX_PORT; if (System.getProperties().containsKey( "com.sun.management.jmxremote.port")) { startPort = Integer.parseInt(System .getProperty("com.sun.management.jmxremote.port")); } while (startPort < MAX_PORT_THRESHOLD && !openPort(startPort)) { startPort++; } if (startPort < (startPort + MAX_PORT_THRESHOLD)) { service.getManagementContext().setConnectorPort( startPort); service.setUseJmx(true); System.setProperty("com.sun.management.jmxremote.port", String.valueOf(startPort)); System.out .println("JMX Console connect URI: service:jmx:rmi:///jndi/rmi://localhost:" + startPort + "/jmxrmi"); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable( Level.CONFIG)) { UIMAFramework .getLogger(CLASS_NAME) .logrb( Level.CONFIG, CLASS_NAME.getName(), "startInternalBroker", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_jmx_uri__CONFIG", new Object[] { "service:jmx:rmi:///jndi/rmi://localhost:" + startPort + "/jmxrmi" }); } } brokerURI = generateInternalURI("tcp", 18810, true, false); // Wait until sucessfull adding connector to the broker // Sleeps for 1sec between retries until success int timeBetweenRetries = 1000; boolean tcpConnectorAcquiredValidPort = false; while (!tcpConnectorAcquiredValidPort) { try { tcpConnector = service.addConnector(brokerURI); tcpConnectorAcquiredValidPort = true; } catch (Exception e) { synchronized (this) { wait(timeBetweenRetries); } } // silence InstanceAlreadyExistsException } System.out.println("Adding TCP Connector:" + tcpConnector.getConnectUri()); if (UIMAFramework.getLogger(CLASS_NAME) .isLoggable(Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.CONFIG, CLASS_NAME.getName(), "startInternalBroker", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_adding_connector__CONFIG", new Object[] { "Adding TCP Connector", tcpConnector.getConnectUri() }); } connectorList = tcpConnector.getName(); if (System.getProperty("StompSupport") != null) { String stompURI = generateInternalURI("stomp", 61613, false, false); connector = service.addConnector(stompURI); System.out.println("Adding STOMP Connector:" + connector.getConnectUri()); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable( Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.CONFIG, CLASS_NAME.getName(), "startInternalBroker", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_adding_connector__CONFIG", new Object[] { "Adding STOMP Connector", connector.getConnectUri() }); } connectorList += "," + connector.getName(); } if (System.getProperty("HTTP") != null) { String stringPort = System.getProperty("HTTP"); int p = Integer.parseInt(stringPort); String httpURI = generateInternalURI("http", p, false, true); httpConnector = service.addConnector(httpURI); System.out.println("Adding HTTP Connector:" + httpConnector.getConnectUri()); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable( Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.CONFIG, CLASS_NAME.getName(), "startInternalBroker", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_adding_connector__CONFIG", new Object[] { "Adding HTTP Connector", httpConnector.getConnectUri() }); } connectorList += "," + httpConnector.getName(); } service.start(); System.setProperty("ActiveMQConnectors", connectorList); System.out.println("Broker Service Started - URL:" + service.getVmConnectorURI()); if (UIMAFramework.getLogger(CLASS_NAME) .isLoggable(Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.CONFIG, CLASS_NAME.getName(), "startInternalBroker", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_broker_started__CONFIG", new Object[] { service.getVmConnectorURI() }); } } } // Allow the connectors some time to start synchronized (semaphore) { semaphore.wait(1000); } // System.out.println("JMX Server Port:"+service.getManagementContext().getRmiServerPort()); // setConnectorPort(startPort); } private boolean openPort(int aPort) { ServerSocket ssocket = null; try { ssocket = new ServerSocket(aPort); return true; } catch (Exception e) { return false; } finally { try { if (ssocket != null) { ssocket.close(); } } catch (IOException ioe) { } } } /** * Generates a unique port for the Network Connector that will be plugged into the internal * Broker. This connector externalizes the internal broker so that remote delegates can reply back * to the Aggregate. This method tests port 18810 for availability and it fails increments the * port by one until a port is valid. * * @return - Broker URI with a unique port */ private String generateInternalURI(String aProtocol, int aDefaultPort, boolean cacheURL, boolean oneTry) throws Exception { boolean success = false; int openPort = aDefaultPort; ServerSocket ssocket = null; while (!success) { try { ssocket = new ServerSocket(openPort); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.CONFIG, CLASS_NAME.getName(), "generateInternalURI", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_port_available__CONFIG", new Object[] { openPort }); } String uri = aProtocol + "://" + ssocket.getInetAddress().getLocalHost().getCanonicalHostName() + ":" + openPort; success = true; if (cacheURL) { System.setProperty("BrokerURI", uri); } return uri; } catch (BindException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.CONFIG, CLASS_NAME.getName(), "generateInternalURI", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_port_not_available__CONFIG", new Object[] { openPort }); } if (oneTry) { System.out.println("Given port:" + openPort + " is not available for " + aProtocol); throw e; } openPort++; } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "generateInternalURI", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } if (oneTry) { throw e; } } finally { try { if (ssocket != null) { ssocket.close(); } } catch (IOException ioe) { } } } return null; } /** * Stops the ActiveMQ broker. This method waits for 1 second to allow the broker to cleanup * objects from JMX Server. * */ public void stop() { Object monitor = new Object(); synchronized (brokerInstanceMux) { if (service != null) { try { // if ( usageListener != null ) // { // service.getMemoryManager().removeUsageListener(usageListener); // } if (tcpConnector != null) { tcpConnector.stop(); System.out.println("Broker Connector:" + tcpConnector.getUri().toString() + " is stopped"); } if (httpConnector != null) { System.out.println("Broker Stopping HTTP Connector:" + httpConnector.getUri().toString()); httpConnector.stop(); System.out.println("Broker Connector:" + httpConnector.getUri().toString() + " is stopped"); } service.getManagementContext().stop(); service.stop(); Broker broker = service.getBroker(); while (!broker.isStopped()) { synchronized (monitor) { try { monitor.wait(20); // wait for the broker to // terminate } catch (Exception e) { } } } System.out.println("Broker is stopped"); broker = null; service = null; } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable( Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.WARNING, CLASS_NAME.getName(), "stop", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } } /** * Callback method invoked by Spring container during its lifecycle changes Ignore all events * except for ContextClosedEvent which indicates the container has shutdown. In this case, stop * the internal ActiveMQ broker. * * @param anEvent * - an event object */ public void onApplicationEvent(ApplicationEvent anEvent) { if (anEvent instanceof ContextClosedEvent) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.INFO, CLASS_NAME.getName(), "onApplicationEvent", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_container_terminated__INFO", new Object[] { ((ContextClosedEvent) anEvent).getApplicationContext() .getDisplayName() }); } stop(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "onApplicationEvent", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_broker_stopped__INFO", new Object[] { brokerURI }); } } } } ConcurrentMessageListener.java000066400000000000000000000252761160020716200357370ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import java.io.InvalidClassException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.UIMAEE_Constants; import org.apache.uima.aae.UimaAsThreadFactory; import org.apache.uima.aae.UimaBlockingExecutor; import org.apache.uima.aae.controller.AggregateAnalysisEngineController; import org.apache.uima.aae.controller.AggregateAnalysisEngineController_impl; import org.apache.uima.aae.controller.AnalysisEngineController; import org.apache.uima.aae.controller.LocalCache.CasStateEntry; import org.apache.uima.aae.delegate.Delegate; import org.apache.uima.aae.message.AsynchAEMessage; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.util.Level; import org.springframework.jms.listener.SessionAwareMessageListener; /** * Message listener injected at runtime into Aggregate to handle a race condition when multiple * threads simultaneously process messages from a Cas Multiplier. It is only used to process * messages from a Cas Multiplier and only if the reply queue has more than one consumer thread * configured in a deployment descriptor. The listener creates a pool of threads equal to the number * of concurrent consumers defined in the DD for the listener on the reply queue. Once the message * is handled in onMessage(), it is than delegated for processing to one of the available threads * from the pool. * * This listener guarantees processing order. It receives messages from Spring in a single thread * and if it finds a child CAS in the message, it increments the parent (input) CAS child count and * delegates processing to the InputChannel instance. * * The race condition: The Cas Multiplier sends the last child and the parent almost at the same * time. Both are received by the aggregate and are processed in different threads, if a scaleout is * used on the reply queue. One thread may start processing the input CAS while the other thread * (with the last child) is not yet allowed to run. The first thread takes the input CAS all the way * to the final step and since at this time, the input CAS has no children ( the thread processing * the last child has not updated the child count yet), it will be prematurely released. When the * thread with the last child is allowed to run, it finds that the parent no longer exists in the * cache. * * */ public class ConcurrentMessageListener implements SessionAwareMessageListener { private static final Class CLASS_NAME = ConcurrentMessageListener.class; private SessionAwareMessageListener delegateListener; private int concurrentThreadCount = 0; private AnalysisEngineController controller; private ThreadPoolExecutor executor = null; private UimaBlockingExecutor blockingExecutor; private LinkedBlockingQueue workQueue; private CountDownLatch controllerLatch = new CountDownLatch(1); /** * Creates a listener with a given number of process threads. This listener is injected between * Spring and JmsInputChannel to enable orderly processing of CASes. This listener is only used on * reply queues that have scale out attribute in DD greater than 1. Its main job is to increment * number of child CASes for a given input CAS. It does so in a single thread, and once it * completes the update this listener submits the CAS for further processing up to the * JmsInputChannel. The CAS is submitted to a queue where the executor assigns a free thread to * process the CAS. * * @param concurrentThreads * - number of threads to use to process CASes * @param delegateListener * - JmsInputChannel instance to delegate CAS to * @throws InvalidClassException */ public ConcurrentMessageListener(int concurrentThreads, Object delegateListener, String destination, ThreadGroup threadGroup, String threadPrefix) throws InvalidClassException { if (!(delegateListener instanceof SessionAwareMessageListener)) { throw new InvalidClassException("Invalid Delegate Listener. Expected Object of Type:" + SessionAwareMessageListener.class + " Received:" + delegateListener.getClass()); } concurrentThreadCount = concurrentThreads; this.delegateListener = (SessionAwareMessageListener) delegateListener; if (concurrentThreads > 1) { // created an unbounded queue. The throttling is controlled by the // semaphore in the UimaBlockingExecutor initialized below workQueue = new LinkedBlockingQueue(); executor = new ThreadPoolExecutor(concurrentThreads, concurrentThreads, Long.MAX_VALUE, TimeUnit.NANOSECONDS, workQueue); UimaAsThreadFactory tf = new UimaAsThreadFactory(threadGroup); tf.setDaemon(true); tf.setThreadNamePrefix(threadPrefix); executor.setThreadFactory(tf); executor.prestartAllCoreThreads(); if ( destination != null ) { blockingExecutor = new UimaBlockingExecutor(executor, concurrentThreads, destination); } else { blockingExecutor = new UimaBlockingExecutor(executor, concurrentThreads); } } } public ThreadPoolExecutor getTaskExecutor() { return executor; } public void stop() { blockingExecutor.stop(); } public void setAnalysisEngineController(AnalysisEngineController controller) { this.controller = controller; controllerLatch.countDown(); } private boolean isMessageFromCasMultiplier(final Message message) throws JMSException { return message.propertyExists(AsynchAEMessage.CasSequence); } /** * Intercept a message to increment a child count of the input CAS. This method is always called * in a single thread, guaranteeing order of processing. The child CAS will always come here * first. Once the count is updated, or this CAS is not an child, the message will be delegated to * one of the threads in the pool that will eventually call InputChannel object where the actual * processing of the message begins. * */ public void onMessage(final Message message, final Session session) throws JMSException { try { // Wait until the controller is plugged in controllerLatch.await(); } catch (InterruptedException e) { } if (isMessageFromCasMultiplier(message)) { // Check if the message came from a Cas Multiplier and it contains a new Process Request int command = message.getIntProperty(AsynchAEMessage.Command); int messageType = message.getIntProperty(AsynchAEMessage.MessageType); // Intercept Cas Process Request from a Cas Multiplier if (command == AsynchAEMessage.Process && messageType == AsynchAEMessage.Request) { String msgFrom = (String) message.getStringProperty(AsynchAEMessage.MessageFrom); if (msgFrom != null && controller instanceof AggregateAnalysisEngineController) { String delegateKey = ((AggregateAnalysisEngineController) controller) .lookUpDelegateKey(msgFrom); if (delegateKey != null) { Delegate delegate = ((AggregateAnalysisEngineController) controller) .lookupDelegate(delegateKey); delegate.setConcurrentConsumersOnReplyQueue(); } } try { String parentCasReferenceId = message .getStringProperty(AsynchAEMessage.InputCasReference); // Fetch parent CAS entry from the local cache CasStateEntry parentEntry = controller.getLocalCache().lookupEntry(parentCasReferenceId); // increment number of child CASes this parent has in play parentEntry.incrementSubordinateCasInPlayCount(); } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "onMessage", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "onMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } if (concurrentThreadCount > 1) { // Delegate meesage to the JmsInputChannel try { blockingExecutor.submitTask(new Runnable() { public void run() { try { delegateListener.onMessage(message, session); } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "onMessage", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "onMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } }); } catch( InterruptedException e) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "onMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } else { // Just handoff the message to the InputChannel object delegateListener.onMessage(message, session); } } } JmsEndpointConnection_impl.java000066400000000000000000001026351160020716200360700ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import java.io.IOException; import java.io.InterruptedIOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.concurrent.Semaphore; import javax.jms.BytesMessage; import javax.jms.Connection; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageProducer; import javax.jms.ObjectMessage; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.ActiveMQSession; import org.apache.activemq.ConnectionFailedException; import org.apache.activemq.advisory.ConsumerEvent; import org.apache.activemq.advisory.ConsumerListener; import org.apache.activemq.command.ActiveMQDestination; import org.apache.activemq.command.ActiveMQQueue; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.InputChannel; import org.apache.uima.aae.UIMAEE_Constants; import org.apache.uima.aae.controller.AggregateAnalysisEngineController; import org.apache.uima.aae.controller.AnalysisEngineController; import org.apache.uima.aae.controller.BaseAnalysisEngineController; import org.apache.uima.aae.controller.Endpoint; import org.apache.uima.aae.delegate.Delegate; import org.apache.uima.aae.error.AsynchAEException; import org.apache.uima.aae.error.DelegateConnectionLostException; import org.apache.uima.aae.error.InvalidMessageException; import org.apache.uima.aae.error.ServiceShutdownException; import org.apache.uima.aae.message.AsynchAEMessage; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.adapter.jms.activemq.JmsOutputChannel.BrokerConnectionEntry; import org.apache.uima.util.Level; public class JmsEndpointConnection_impl implements ConsumerListener { private static final Class CLASS_NAME = JmsEndpointConnection_impl.class; private Destination destination; protected Session producerSession; private MessageProducer producer; private BrokerConnectionEntry brokerDestinations; private String serverUri; private String endpoint; private String endpointName; private Endpoint delegateEndpoint; private volatile boolean retryEnabled; private AnalysisEngineController controller = null; private volatile boolean connectionAborted = false; protected static long connectionCreationTimestamp = 0L; private Object semaphore = new Object(); private boolean isReplyEndpoint; private volatile boolean failed = false; private Object lock = new Object(); private final String componentName; // Create semaphore to control creation of a JMS connection. // This semaphore is shared by all instances of this class private static Semaphore connectionSemaphore = new Semaphore(1); public JmsEndpointConnection_impl(BrokerConnectionEntry aBrokerDestinationMap, Endpoint anEndpoint, AnalysisEngineController aController) { brokerDestinations = aBrokerDestinationMap; if ( anEndpoint.isFreeCasEndpoint() && anEndpoint.isCasMultiplier() && anEndpoint.isReplyEndpoint()) { serverUri = anEndpoint.getServerURI(); } else { // If this is a reply to a client, use the same broker URL that manages this service input queue. // Otherwise this is a request so use a broker specified in the endpoint object. serverUri = (anEndpoint.isReplyEndpoint()) ? ((JmsOutputChannel) aController.getOutputChannel()).getServerURI() : anEndpoint.getServerURI(); } isReplyEndpoint = anEndpoint.isReplyEndpoint(); controller = aController; if ((anEndpoint.getCommand() == AsynchAEMessage.Stop || isReplyEndpoint) && anEndpoint.getDestination() != null && anEndpoint.getDestination() instanceof ActiveMQDestination) { endpoint = ((ActiveMQDestination) anEndpoint.getDestination()).getPhysicalName(); } else { endpoint = anEndpoint.getEndpoint(); } anEndpoint.remove(); componentName = controller.getComponentName(); delegateEndpoint = anEndpoint; } public boolean isRetryEnabled() { return retryEnabled; } public void setRetryEnabled(boolean retryEnabled) { this.retryEnabled = retryEnabled; } public boolean isOpen() { synchronized (lock) { if (failed || producerSession == null || connectionClosedOrFailed(brokerDestinations)) { return false; } return ((ActiveMQSession) producerSession).isRunning(); } } protected static boolean connectionClosedOrFailed(BrokerConnectionEntry aBrokerDestinationMap) { Connection connection = aBrokerDestinationMap.getConnection(); if (connection == null || ((ActiveMQConnection) connection).isClosed() || ((ActiveMQConnection) connection).isClosing() || ((ActiveMQConnection) connection).isTransportFailed()) { return true; } return false; } private void openChannel() throws AsynchAEException, ServiceShutdownException { openChannel(getServerUri(), componentName, endpoint, controller); } private void openChannel(String brokerUri, String aComponentName, String anEndpointName, AnalysisEngineController aController) throws AsynchAEException, ServiceShutdownException { synchronized (lock) { try { // If replying to http request, reply to a queue managed by this service broker using tcp // protocol if (isReplyEndpoint && brokerUri.startsWith("http")) { brokerUri = ((JmsOutputChannel) aController.getOutputChannel()).getServerURI(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "open", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_override_connection_to_endpoint__FINE", new Object[] { aComponentName, getEndpoint(), ((JmsOutputChannel) aController.getOutputChannel()).getServerURI() }); } } if (!isOpen()) { Connection conn = null; // Check connection status and create a new one (if necessary) as an atomic operation try { connectionSemaphore.acquire(); if (connectionClosedOrFailed(brokerDestinations)) { // Create one shared connection per unique brokerURL. if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "openChannel", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_activemq_open__FINE", new Object[] { aController.getComponentName(), anEndpointName, brokerUri }); } if ( brokerDestinations.getConnection() != null ) { try { // Close the connection to avoid leaks in the broker brokerDestinations.getConnection().close(); } catch( Exception e) { // Ignore exceptions on a close of a bad connection } } ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(brokerUri); // Create shared jms connection to a broker conn = factory.createConnection(); factory.setDispatchAsync(true); factory.setUseAsyncSend(true); factory.setCopyMessageOnSend(false); // Cache the connection. There should only be one connection in the jvm // per unique broker url. brokerDestinations.setConnection(conn); // Close and invalidate all sessions previously created from the old connection Iterator> it = brokerDestinations.endpointMap .entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = it.next(); if (entry.getValue().producerSession != null) { // Close session entry.getValue().producerSession.close(); // Since we created a new connection invalidate session that // have been created with the old connection entry.getValue().producerSession = null; } } } } catch( Exception exc) { throw exc; // rethrow } finally { connectionSemaphore.release(); } connectionCreationTimestamp = System.nanoTime(); failed = false; } Connection conn = brokerDestinations.getConnection(); if (failed) { // Unable to create a connection return; } producerSession = conn.createSession(false, Session.DUPS_OK_ACKNOWLEDGE); if ((delegateEndpoint.getCommand() == AsynchAEMessage.Stop || isReplyEndpoint) && delegateEndpoint.getDestination() != null) { producer = producerSession.createProducer(null); if (aController != null) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "openChannel", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_temp_conn_starting__FINE", new Object[] { aComponentName, anEndpointName, brokerUri }); } } } else { destination = producerSession.createQueue(getEndpoint()); producer = producerSession.createProducer(destination); if (controller != null) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "openChannel", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_conn_starting__FINE", new Object[] { aComponentName, anEndpointName, brokerUri }); } } } producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // Since the connection is shared, start it only once if (!((ActiveMQConnection) brokerDestinations.getConnection()).isStarted()) { brokerDestinations.getConnection().start(); } if (controller != null) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "openChannel", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_conn_started__FINE", new Object[] { endpoint, brokerUri }); if (controller.getInputChannel() != null) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "openChannel", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_connection_open_to_endpoint__FINE", new Object[] { aComponentName, getEndpoint(), brokerUri }); } } } failed = false; } catch (Exception e) { boolean rethrow = true; if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "openChannel", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "openChannel", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } if (e instanceof JMSException) { rethrow = handleJmsException((JMSException) e); } if (rethrow) { throw new AsynchAEException(e); } } } } public synchronized void open() throws AsynchAEException, ServiceShutdownException { open(delegateEndpoint.getEndpoint(), serverUri); } public synchronized void open(String brokerUri, String anEndpointName) throws AsynchAEException, ServiceShutdownException { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "open", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_open__FINE", new Object[] { anEndpointName, brokerUri }); } if (!connectionAborted) { openChannel(); } } public synchronized void abort() { connectionAborted = true; brokerDestinations.getConnectionTimer().stopTimer(); try { this.close(); } catch (Exception e) { } } public void close() throws Exception { synchronized (lock) { if (producer != null) { try { producer.close(); } catch (Exception e) { // Ignore we are shutting down } } if (producerSession != null) { try { producerSession.close(); } catch (Exception e) { // Ignore we are shutting down } producerSession = null; } if (destination != null) { destination = null; } } } protected String getEndpoint() { return endpoint; } protected void setEndpoint(String endpoint) { this.endpoint = endpoint; } protected void setDelegateEndpoint(Endpoint delegateEndpoint) { this.delegateEndpoint = delegateEndpoint; } protected synchronized String getServerUri() { return serverUri; } protected synchronized void setServerUri(String serverUri) { this.serverUri = serverUri; } public TextMessage produceTextMessage(String aTextMessage) throws AsynchAEException { synchronized( lock ) { if ( producerSession == null ) { throw new AsynchAEException("Controller:"+controller.getComponentName()+" Unable to create JMS Message. Producer Session Not Initialized (Null)"); } try { if (aTextMessage == null) { return producerSession.createTextMessage(""); } else { return producerSession.createTextMessage(aTextMessage); } } catch (javax.jms.IllegalStateException e) { try { open(); } catch (ServiceShutdownException ex) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "produceTextMessage", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "produceTextMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", ex); } } catch (AsynchAEException ex) { throw ex; } } catch (Exception e) { throw new AsynchAEException(e); } throw new AsynchAEException(new InvalidMessageException("Unable to produce Message Object")); } } public BytesMessage produceByteMessage(byte[] aSerializedCAS) throws AsynchAEException { synchronized( lock ) { if ( producerSession == null ) { throw new AsynchAEException("Controller:"+controller.getComponentName()+" Unable to create JMS Message. Producer Session Not Initialized (Null)"); } int retryCount = 1; while (retryCount > 0) { try { retryCount--; BytesMessage bm = producerSession.createBytesMessage(); bm.writeBytes(aSerializedCAS); return bm; } catch (javax.jms.IllegalStateException e) { try { open(); } catch (ServiceShutdownException ex) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "produceByteMessage", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "produceByteMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", ex); } } } catch (Exception e) { throw new AsynchAEException(e); } } throw new AsynchAEException( new InvalidMessageException("Unable to produce BytesMessage Object")); } } public ObjectMessage produceObjectMessage() throws AsynchAEException { synchronized( lock ) { if ( producerSession == null ) { throw new AsynchAEException("Controller:"+controller.getComponentName()+" Unable to create JMS Message. Producer Session Not Initialized (Null)"); } try { if (!((ActiveMQSession) producerSession).isRunning()) { open(); } return producerSession.createObjectMessage(); } catch (Exception e) { throw new AsynchAEException(e); } } } private boolean delayCasDelivery(int msgType, Message aMessage, int command) throws Exception { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "recoverSession", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_open_connection_to_endpoint__FINE", new Object[] { getEndpoint() }); } openChannel(); // The connection has been successful. Now check if we need to create a new listener // and a temp queue to receive replies. A new listener will be created only if the // endpoint for the delegate is marked as FAILED. This will be the case if the listener // on the reply queue for the endpoint has failed. String endpointName = delegateEndpoint.getEndpoint(); synchronized (lock) { if (controller instanceof AggregateAnalysisEngineController) { // Using the queue name lookup the delegate key String key = ((AggregateAnalysisEngineController) controller) .lookUpDelegateKey(endpointName); if (key != null && destination != null && !isReplyEndpoint) { // For Process Requests check the state of the delegate that is to receive // the CAS. If the delegate state = TIMEOUT_STATE, push the CAS id onto // delegate's list of delayed CASes. The state of the delegate was // changed to TIMEOUT when a previous CAS timed out. if (msgType != AsynchAEMessage.Request && command == AsynchAEMessage.Process) { String casReferenceId = aMessage.getStringProperty(AsynchAEMessage.CasReference); if (casReferenceId != null && ((AggregateAnalysisEngineController) controller) .delayCasIfDelegateInTimedOutState(casReferenceId, endpointName)) { return true; } } } } } return false; } public boolean send(final Message aMessage, long msgSize, boolean startTimer) { return send( aMessage, msgSize, startTimer, false); } public boolean send(final Message aMessage, long msgSize, boolean startTimer, boolean failOnJMSException) { String destinationName = ""; String target = "Delegate"; try { int msgType = aMessage.getIntProperty(AsynchAEMessage.MessageType); int command = aMessage.getIntProperty(AsynchAEMessage.Command); boolean newCAS = false; if ( aMessage.propertyExists(AsynchAEMessage.CasSequence) && aMessage.getLongProperty(AsynchAEMessage.CasSequence) > 0 ) { newCAS = true; } if ( msgType == AsynchAEMessage.Response || (msgType == AsynchAEMessage.Request && newCAS) ) { target = "Client"; } Endpoint masterEndpoint = null; if ( delegateEndpoint != null && delegateEndpoint.getDelegateKey() != null ) { masterEndpoint = ((AggregateAnalysisEngineController) controller).lookUpEndpoint( delegateEndpoint.getDelegateKey(), false); // Endpoint is marked as FAILED by the aggregate when it detects broker connection // failure. In such an event the aggregate stops the listener on the delegate // reply queue. if ( msgType == AsynchAEMessage.Request && command == AsynchAEMessage.Process && masterEndpoint != null && masterEndpoint.getStatus() == Endpoint.FAILED) { HashMap map = new HashMap(); Delegate delegate = ((AggregateAnalysisEngineController) controller).lookupDelegate(delegateEndpoint.getDelegateKey()); // Cancel Delegate timer before entering Error Handler if ( delegate != null ) { delegate.cancelDelegateTimer(); } // Handle the Connection error in the ProcessErrorHandler map.put(AsynchAEMessage.Command, AsynchAEMessage.Process); map.put(AsynchAEMessage.CasReference, aMessage.getStringProperty(AsynchAEMessage.CasReference)); map.put(AsynchAEMessage.Endpoint, masterEndpoint); Exception e = new DelegateConnectionLostException("Controller:"+controller.getComponentName()+" Lost Connection to "+target+ ":"+masterEndpoint.getDelegateKey()); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "send", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, getClass().getName(), "send", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_exception__WARNING", e); } // Handle error in ProcessErrorHandler ((BaseAnalysisEngineController)controller).handleError(map, e); return true; // return true as if this was successful send } } if ( !isOpen() ) { if (delayCasDelivery(msgType, aMessage, command)) { // Return true as if the CAS was sent return true; } } // Send a reply to a queue provided by the client // Stop messages and replies are sent to the endpoint provided in the destination object if ((command == AsynchAEMessage.Stop || command == AsynchAEMessage.ReleaseCAS || isReplyEndpoint) && delegateEndpoint.getDestination() != null) { destinationName = ((ActiveMQDestination) delegateEndpoint.getDestination()) .getPhysicalName(); if (UIMAFramework.getLogger().isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "send", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_sending_msg_to_endpoint__FINE", new Object[] { destinationName }); } logMessageSize(aMessage, msgSize, destinationName); synchronized (producer) { producer.send((Destination) delegateEndpoint.getDestination(), aMessage); } } else { destinationName = ((ActiveMQQueue) producer.getDestination()).getPhysicalName(); if (UIMAFramework.getLogger().isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "send", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_sending_msg_to_endpoint__FINE", new Object[] { destinationName }); } logMessageSize(aMessage, msgSize, destinationName); synchronized (producer) { producer.send(aMessage); } } // Starts a timer on a broker connection. Every time a new message // is sent to a destination managed by the broker the timer is // restarted. The main purpose of the timer is to close connections // that are not used. if (startTimer) { brokerDestinations.getConnectionTimer().startTimer(connectionCreationTimestamp, delegateEndpoint); } // Succeeded sending the CAS return true; } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { String key = ""; String endpointName = ""; if ( delegateEndpoint != null ) { delegateEndpoint.getDelegateKey(); endpointName = ((ActiveMQDestination) delegateEndpoint.getDestination()) .getPhysicalName(); } if ( "Client".equals(target) ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "send", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_delivery_to_client_exception__WARNING", new Object[] { controller.getComponentName(),endpointName }); } else { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "send", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_delivery_exception__WARNING",new Object[] { controller.getComponentName(), key, endpointName}); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "send", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } // If the controller has been stopped no need to send messages if (controller.isStopped()) { return true; } else { if (e instanceof JMSException) { handleJmsException((JMSException) e); // whoever called this method is interested in knowing that there was JMS Exception if ( failOnJMSException ) { return false; } } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "send", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "send", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } brokerDestinations.getConnectionTimer().stopTimer(); // Failed here return false; } private void logMessageSize(Message aMessage, long msgSize, String destinationName) { if (UIMAFramework.getLogger().isLoggable(Level.FINE)) { boolean isReply = false; if (isReplyEndpoint) { isReply = true; } String type = "Text"; if (aMessage instanceof BytesMessage) { type = "Binary"; UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "logMessageSize", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_msg_size__FINE", new Object[] { componentName, isReply == true ? "Reply" : "Request", "Binary", destinationName, msgSize }); } else if (aMessage instanceof TextMessage) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "logMessageSize", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_msg_size__FINE", new Object[] { componentName, isReply == true ? "Reply" : "Request", "XMI", destinationName, msgSize }); } } } /** * This method is called during recovery of failed connection. It is only called if the endpoint * associated with a given delegate is marked as FAILED. It is marked that way when a listener * attached to the reply queue fails. This method creates a new listener and a new temp queue. * * @param delegateKey * @throws Exception */ private void createListener(String delegateKey) throws Exception { if (controller instanceof AggregateAnalysisEngineController) { // Fetch an InputChannel that handles messages for a given delegate InputChannel iC = controller.getReplyInputChannel(delegateKey); // Create a new Listener, new Temp Queue and associate the listener with the Input Channel iC.createListener(delegateKey, null); } } private synchronized boolean handleJmsException(JMSException ex) { if (!failed) { failed = true; } try { // Check if the exception is due to deleted queue. ActiveMQ does not identify // this condition in the cause, so we need to parse the exception message and // compare against "Cannot publish to a deleted Destination" text. If match is // found, extract the name of the deleted queue from the exception and log it. if (ex.getMessage() != null && ex.getMessage().startsWith("Cannot publish to a deleted Destination")) { String destName = endpointName; int startPos = ex.getMessage().indexOf(':'); if (startPos > 0) { destName = ex.getMessage().substring(startPos); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "handleJmsException", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_send_failed_deleted_queue_INFO", new Object[] { componentName, destName, serverUri }); } return false; } if (ex instanceof ConnectionFailedException && isReplyEndpoint) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "handleJmsException", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_connection_failure__INFO", new Object[] { componentName, serverUri, delegateEndpoint.getDestination() }); return false; } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleJmsException", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleJmsException", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", ex); } } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleJmsException", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleJmsException", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } return true; } public void onConsumerEvent(ConsumerEvent arg0) { if (controller != null) { controller.handleDelegateLifeCycleEvent(getEndpoint(), arg0.getConsumerCount()); } } protected synchronized void finalize() throws Throwable { brokerDestinations.getConnectionTimer().stopTimer(); } } JmsInputChannel.java000066400000000000000000001371611160020716200336410ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; import javax.jms.Connection; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.command.ActiveMQDestination; import org.apache.activemq.command.ActiveMQMessage; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.InputChannel; import org.apache.uima.aae.UIMAEE_Constants; import org.apache.uima.aae.controller.AggregateAnalysisEngineController; import org.apache.uima.aae.controller.AnalysisEngineController; import org.apache.uima.aae.controller.Endpoint; import org.apache.uima.aae.controller.Endpoint_impl; import org.apache.uima.aae.controller.PrimitiveAnalysisEngineController; import org.apache.uima.aae.controller.BaseAnalysisEngineController.ServiceState; import org.apache.uima.aae.delegate.Delegate; import org.apache.uima.aae.error.InvalidMessageException; import org.apache.uima.aae.handler.Handler; import org.apache.uima.aae.handler.HandlerBase; import org.apache.uima.aae.jmx.RemoteJMXServer; import org.apache.uima.aae.jmx.ServiceInfo; import org.apache.uima.aae.message.AsynchAEMessage; import org.apache.uima.aae.message.MessageContext; import org.apache.uima.aae.message.UIMAMessage; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.adapter.jms.message.JmsMessageContext; import org.apache.uima.util.Level; import org.springframework.jms.listener.SessionAwareMessageListener; /** * Thin adapter for receiving JMS messages from Spring. It delegates processing of all messages to * the {@link Handler}. Each JMS Message is wrapped in transport neutral MessageContext * wrapper. * */ public class JmsInputChannel implements InputChannel, JmsInputChannelMBean, SessionAwareMessageListener { /** * */ private static final long serialVersionUID = -3318400773113552290L; private static final Class CLASS_NAME = JmsInputChannel.class; private transient final CountDownLatch msgHandlerLatch = new CountDownLatch(1); private transient final CountDownLatch controllerLatch = new CountDownLatch(1); // Reference to the first Message Handler in the Chain. private transient Handler handler; // The name of the queue this Listener is expecting to receive messages from private String endpointName; // Reference to the Controller Object private transient AnalysisEngineController controller; private int sessionAckMode; private transient UimaDefaultMessageListenerContainer messageListener; private transient Session jmsSession; private String brokerURL = ""; private ServiceInfo serviceInfo = null; private volatile boolean stopped = false; private volatile boolean channelRegistered = false; private List listenerContainerList = new ArrayList(); private Object mux = new Object(); private transient RemoteJMXServer remoteJMXServer = null; // synchronizes initialization of RemotBroker private Object brokerMux = new Object(); private ConcurrentHashMap failedListenerMap = new ConcurrentHashMap(); // A global flag that determines if we should create a connection to broker's MBeanServer to be // able to determine if client's reply queue exists before processing a CAS. public static transient boolean attachToBrokerMBeanServer=true; public AnalysisEngineController getController() { return controller; } public String getName() { return endpointName; } public void setController(AnalysisEngineController aController) throws Exception { this.controller = aController; if (!channelRegistered) { controller.addInputChannel(this); } controller.setInputChannel(this); controllerLatch.countDown(); } public void setMessageHandler(Handler aHandler) { handler = aHandler; msgHandlerLatch.countDown(); } public void setEndpointName(String anEndpointName) { endpointName = anEndpointName; if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "setEndpointName", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_service_listening__INFO", new Object[] { anEndpointName }); } } /** * Validate message type contained in the JMS header. * * @param aMessage * - jms message retrieved from queue * @param properties * - map containing message properties * @return * @throws Exception */ private boolean validMessageType(Message aMessage, Map properties) throws Exception { if (properties.containsKey(AsynchAEMessage.MessageType)) { int msgType = aMessage.getIntProperty(AsynchAEMessage.MessageType); if (msgType != AsynchAEMessage.Response && msgType != AsynchAEMessage.Request) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "validMessageType", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_invalid_msgtype_in_message__INFO", new Object[] { msgType, endpointName }); } return false; } } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "validMessageType", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_msgtype_notin_message__INFO", new Object[] { endpointName }); } return false; } return true; } private boolean isProcessRequest(Message aMessage) throws Exception { Map properties = ((ActiveMQMessage) aMessage).getProperties(); if (properties.containsKey(AsynchAEMessage.MessageType) && properties.containsKey(AsynchAEMessage.Command)) { int msgType = aMessage.getIntProperty(AsynchAEMessage.MessageType); int command = aMessage.getIntProperty(AsynchAEMessage.Command); if (msgType != AsynchAEMessage.Request || command != AsynchAEMessage.Process) { return false; } return true; } return false; } private boolean isRemoteRequest(Message aMessage) throws Exception { // Dont do checkpoints if a message was sent from a Cas Multiplier if (aMessage.propertyExists(AsynchAEMessage.CasSequence)) { return false; } Map properties = ((ActiveMQMessage) aMessage).getProperties(); if (properties.containsKey(AsynchAEMessage.MessageType) && properties.containsKey(AsynchAEMessage.Command) && properties.containsKey(UIMAMessage.ServerURI)) { int msgType = aMessage.getIntProperty(AsynchAEMessage.MessageType); int command = aMessage.getIntProperty(AsynchAEMessage.Command); boolean isRemote = aMessage.getStringProperty(UIMAMessage.ServerURI).startsWith("vm") == false; if (isRemote && msgType == AsynchAEMessage.Request && (command == AsynchAEMessage.Process || command == AsynchAEMessage.CollectionProcessComplete)) { return true; } } return false; } private boolean acceptsDeltaCas(Message aMessage) throws Exception { Map properties = ((ActiveMQMessage) aMessage).getProperties(); boolean acceptsDeltaCas = false; if (properties.containsKey(AsynchAEMessage.AcceptsDeltaCas)) { acceptsDeltaCas = aMessage.getBooleanProperty(AsynchAEMessage.AcceptsDeltaCas); } return acceptsDeltaCas; } /** * Validate command contained in the header of the JMS Message * * @param aMessage * - JMS Message received * @param properties * - Map containing header properties * @return - true if the command received is a valid one, false otherwise * @throws Exception */ private boolean validCommand(Message aMessage, Map properties) throws Exception { if (properties.containsKey(AsynchAEMessage.Command)) { int command = aMessage.getIntProperty(AsynchAEMessage.Command); if (command != AsynchAEMessage.Process && command != AsynchAEMessage.GetMeta && command != AsynchAEMessage.ReleaseCAS && command != AsynchAEMessage.Stop && command != AsynchAEMessage.Ping && command != AsynchAEMessage.ServiceInfo && command != AsynchAEMessage.CollectionProcessComplete) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "validCommand", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_invalid_command_in_message__INFO", new Object[] { command, endpointName }); } return false; } } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "validCommand", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_command_notin_message__INFO", new Object[] { endpointName }); } return false; } return true; } /** * Validates payload in the JMS Message. * * @param aMessage * - JMS Message received * @param properties * - Map containing header properties * @return - true if the payload is valid, false otherwise * @throws Exception */ private boolean validPayload(Message aMessage, Map properties) throws Exception { if (properties.containsKey(AsynchAEMessage.Command)) { int command = aMessage.getIntProperty(AsynchAEMessage.Command); if (command == AsynchAEMessage.GetMeta || command == AsynchAEMessage.CollectionProcessComplete || command == AsynchAEMessage.Stop || command == AsynchAEMessage.Ping || command == AsynchAEMessage.ServiceInfo || command == AsynchAEMessage.ReleaseCAS) { // Payload not included in GetMeta Request return true; } } if (properties.containsKey(AsynchAEMessage.Payload)) { int payload = aMessage.getIntProperty(AsynchAEMessage.Payload); if (payload != AsynchAEMessage.XMIPayload && payload != AsynchAEMessage.BinaryPayload && payload != AsynchAEMessage.CASRefID && payload != AsynchAEMessage.Exception && payload != AsynchAEMessage.Metadata) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "validPayload", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_invalid_payload_in_message__INFO", new Object[] { payload, endpointName }); } return false; } } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "validPayload", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_payload_notin_message__INFO", new Object[] { endpointName }); } return false; } return true; } private boolean isStaleMessage(Message aMessage) throws JMSException { int command = aMessage.getIntProperty(AsynchAEMessage.Command); int msgType = aMessage.getIntProperty(AsynchAEMessage.MessageType); if (isStopped() || getController() == null || getController().getInProcessCache() == null) { // Shutting down return true; } if (command == AsynchAEMessage.Process && msgType == AsynchAEMessage.Response) { String casReferenceId = aMessage.getStringProperty(AsynchAEMessage.CasReference); if (!getController().getInProcessCache().entryExists(casReferenceId)) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "isStaleMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_stale_message__FINE", new Object[] { endpointName, casReferenceId, aMessage.getStringProperty(AsynchAEMessage.MessageFrom) }); } return true; } } return false; } /** * Validates contents of the message. It checks if command, payload and message types contain * valid data. * * @param aMessage * - JMS Message to validate * @return - true if message is valid, false otherwise * @throws Exception */ public boolean validMessage(Message aMessage) throws Exception { if (aMessage instanceof ActiveMQMessage) { Map properties = ((ActiveMQMessage) aMessage).getProperties(); if (!validMessageType(aMessage, properties)) { int msgType = 0; if (properties.containsKey(AsynchAEMessage.MessageType)) { msgType = aMessage.getIntProperty(AsynchAEMessage.MessageType); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "validMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_invalid_msg_type__INFO", new Object[] { getController().getComponentName(), msgType }); } return false; } if (!validCommand(aMessage, properties)) { int command = 0; if (properties.containsKey(AsynchAEMessage.Command)) { command = aMessage.getIntProperty(AsynchAEMessage.Command); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "validMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_invalid_cmd_type__INFO", new Object[] { getController().getComponentName(), command }); } return false; } if (!validPayload(aMessage, properties)) { int payload = 0; if (properties.containsKey(AsynchAEMessage.Payload)) { payload = aMessage.getIntProperty(AsynchAEMessage.Payload); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "validMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_invalid_payload_type__INFO", new Object[] { getController().getComponentName(), payload }); } return false; } if (isStaleMessage(aMessage)) { if (sessionAckMode == Session.CLIENT_ACKNOWLEDGE) { aMessage.acknowledge(); } return false; } } return true; } public void abort() { } private String decodeIntToString(String aTypeToDecode, int aValueToDecode) { if (AsynchAEMessage.MessageType.equals(aTypeToDecode)) { switch (aValueToDecode) { case AsynchAEMessage.Request: return "Request"; case AsynchAEMessage.Response: return "Response"; } } else if (AsynchAEMessage.Command.equals(aTypeToDecode)) { switch (aValueToDecode) { case AsynchAEMessage.Process: return "Process"; case AsynchAEMessage.GetMeta: return "GetMetadata"; case AsynchAEMessage.CollectionProcessComplete: return "CollectionProcessComplete"; case AsynchAEMessage.ReleaseCAS: return "ReleaseCAS"; case AsynchAEMessage.Stop: return "Stop"; case AsynchAEMessage.Ping: return "Ping"; case AsynchAEMessage.ServiceInfo: return "ServiceInfo"; } } else if (AsynchAEMessage.Payload.equals(aTypeToDecode)) { switch (aValueToDecode) { case AsynchAEMessage.XMIPayload: return "XMIPayload"; case AsynchAEMessage.BinaryPayload: return "BinaryPayload"; case AsynchAEMessage.CASRefID: return "CASRefID"; case AsynchAEMessage.Metadata: return "Metadata"; case AsynchAEMessage.Exception: return "Exception"; case AsynchAEMessage.XCASPayload: return "XCASPayload"; case AsynchAEMessage.None: return "None"; } } return "UNKNOWN"; } private boolean ackMessageNow(Message aMessage) throws JMSException { if (sessionAckMode != Session.CLIENT_ACKNOWLEDGE) { return false; } if (aMessage.getIntProperty(AsynchAEMessage.Command) == AsynchAEMessage.GetMeta || aMessage.getIntProperty(AsynchAEMessage.Command) == AsynchAEMessage.CollectionProcessComplete || aMessage.getIntProperty(AsynchAEMessage.Command) == AsynchAEMessage.ReleaseCAS || aMessage.getIntProperty(AsynchAEMessage.Command) == AsynchAEMessage.ACK) { return true; } return false; } private boolean isCheckpointWorthy(Message aMessage) throws Exception { synchronized (mux) { // Dont do checkpoints if a message was sent from a Cas Multiplier if (aMessage.propertyExists(AsynchAEMessage.CasSequence)) { return false; } Map properties = ((ActiveMQMessage) aMessage).getProperties(); if (properties.containsKey(AsynchAEMessage.MessageType) && properties.containsKey(AsynchAEMessage.Command) && properties.containsKey(UIMAMessage.ServerURI)) { int msgType = aMessage.getIntProperty(AsynchAEMessage.MessageType); int command = aMessage.getIntProperty(AsynchAEMessage.Command); if (msgType == AsynchAEMessage.Request && (command == AsynchAEMessage.Process || command == AsynchAEMessage.CollectionProcessComplete)) { return true; } } return false; } } /** * Checks if the incoming request requires response. * * @param aMessage - incoming message to check * @return - true if reply is required, false otherwise */ private boolean isReplyRequired(Message aMessage ) { try { int command = aMessage.getIntProperty(AsynchAEMessage.Command); if (aMessage.getIntProperty(AsynchAEMessage.MessageType) == AsynchAEMessage.Request && ( command == AsynchAEMessage.Process || command == AsynchAEMessage.GetMeta || command == AsynchAEMessage.CollectionProcessComplete ) ) { return true; } } catch( Exception e) { // ignore } return false; } private boolean validEndpoint(JmsMessageContext messageContext) { return (messageContext.getEndpoint() != null // Reply destination must be present && messageContext.getEndpoint().getDestination() != null); } /** * Determines if a given message should be processed or not. If the message * requires response, the code checks if the client's temp reply queue still * exists. If so, the message must be processed. If the reply queue doesnt * exist, the client must have terminated and there is no need to process * the message. The code consults the broker (via JMX) to see if the queue * exists. * * @param aMessage * @param messageContext * @return * @throws Exception */ private boolean processRequestMessage(Message aMessage, JmsMessageContext messageContext) throws Exception { // check if we can reply to the client. The code uses connection to // broker's JMX server to lookup client's temp reply queue. If the // queue does not exist the incoming message is dropped. No need to // waste cycles when we know that the client has terminated. if ( isReplyRequired(aMessage) // Exclude request messages from a Cas Multiplier. We are not replying // to CM. Only CM adds CasSequence to a request message && !messageContext.propertyExists(AsynchAEMessage.CasSequence) // Reply destination must be present && validEndpoint(messageContext) ) { // replace ':' with '_' to enable JMX query to work. ':' is an invalid char for queries String queueName = remoteJMXServer.normalize(messageContext.getEndpoint().getDestination().toString()); // Check if reply queue provided in a message still exists in broker's // JMX Server registry. In case the server is not available the call returns true. return remoteJMXServer.isClientReplyQueueAvailable(queueName); } return true; // Default, PROCESS THE MESSAGE } private boolean ackClient( JmsMessageContext messageContext ) throws Exception { return ( !messageContext.propertyExists(AsynchAEMessage.CasSequence) && messageContext.getMessageStringProperty(UIMAMessage.ServerURI).startsWith("vm") == false && validEndpoint(messageContext) && isReplyRequired((Message)messageContext.getRawMessage()) ); } /** * Receives Messages from the JMS Provider. It checks the message header to determine the type of * message received. Based on the type, a MessageContext is created to facilitate access to the * transport specific message. Once the MessageContext is determined this routine delegates * handling of the message to the chain of MessageHandlers. * * @param aMessage * - JMS Message containing header and payload * @param aJmsSession * - JMSSession object */ public void onMessage(Message aMessage, Session aJmsSession) { String casRefId = null; if (isStopped()) { return; } try { // wait until message handlers are plugged in msgHandlerLatch.await(); } catch (InterruptedException e) { } try { // wait until the controller is plugged in controllerLatch.await(); } catch (InterruptedException e) { } long idleTime = 0; boolean doCheckpoint = false; String eN = endpointName; if (getController() != null) { eN = getController().getComponentName(); if (eN == null) { eN = ""; } } String command = "N/A"; String messageType ="N/A"; JmsMessageContext messageContext = null; int requestType = 0; try { // Wrap JMS Message in MessageContext messageContext = new JmsMessageContext(aMessage, endpointName); if (aMessage.getStringProperty(AsynchAEMessage.CasReference) == null) { casRefId = "CasReferenceId Not In Message"; } else { casRefId = aMessage.getStringProperty(AsynchAEMessage.CasReference); } if (validMessage(aMessage)) { command = decodeIntToString(AsynchAEMessage.Command, aMessage .getIntProperty(AsynchAEMessage.Command)); // Request or Response messageType = decodeIntToString(AsynchAEMessage.MessageType, aMessage .getIntProperty(AsynchAEMessage.MessageType)); String msgSentFromIP = null; if (aMessage.getIntProperty(AsynchAEMessage.MessageType) == AsynchAEMessage.Response && aMessage.propertyExists(AsynchAEMessage.ServerIP)) { msgSentFromIP = aMessage.getStringProperty(AsynchAEMessage.ServerIP); } // System.out.println("***********************************************************************************" // + // " \n**CONTROLLER::"+controller.getName()+"**** Received New Message From [ "+aMessage.getStringProperty(AsynchAEMessage.MessageFrom)+" ]**************" // + // " \n**MSGTYPE::"+messageType+" COMMAND:"+command + // " Cas Reference Id::"+casRefId+ // " \n******************************************************************************"); String msgFrom = (String) aMessage.getStringProperty(AsynchAEMessage.MessageFrom); if (controller != null && msgFrom != null) { // Send an ACK to a client. This serves dual purpose: // 1 - tests for existence of temp reply queue // 2 - notifies client that a CAS it sent is about to be processed by a service // ACK is sent for every request message if ( ackClient(messageContext) ) { try { // Any exception while sending an ACK results in a dropped request getController().getOutputChannel().sendReply(AsynchAEMessage.ServiceInfo, messageContext.getEndpoint(), aMessage.getStringProperty(AsynchAEMessage.CasReference), true); } catch( Exception ex) { // The exception has already been logged in sendReply() method return; // DONT PROCESS } } if (msgSentFromIP != null) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "onMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_recvd_new_message_with_ip__FINE", new Object[] { controller.getComponentName(), msgFrom, msgSentFromIP, messageType, command, casRefId }); } } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "onMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_recvd_new_message__FINE", new Object[] { controller.getComponentName(), msgFrom, messageType, command, casRefId }); } } } else { } // Delegate processing of the message contained in the MessageContext to the // chain of handlers try { if (isRemoteRequest(aMessage)) { // Compute the idle time waiting for this request idleTime = getController().getIdleTime(); // This idle time is reported to the client thus save it in the endpoint // object. This value will be fetched and added to the outgoing reply. messageContext.getEndpoint().setIdleTime(idleTime); } } catch (Exception e) { } // Determine if this message is a request and either GetMeta, CPC, or Process doCheckpoint = isCheckpointWorthy(aMessage); requestType = aMessage.getIntProperty(AsynchAEMessage.Command); // Checkpoint if (doCheckpoint) { getController().beginProcess(requestType); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINEST)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINEST, CLASS_NAME.getName(), "onMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_new_msg_in__FINEST", new Object[] { getController().getComponentName(), msgFrom, command, messageType, casRefId }); } if (handler != null) { handler.handle(messageContext); } } else { if (!isStaleMessage(aMessage)) { controller.getErrorHandlerChain().handle(new InvalidMessageException(), HandlerBase.populateErrorContext(messageContext), controller); } } } catch (Throwable t) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "onMessage", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "onMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", t); } controller.getErrorHandlerChain().handle(t, HandlerBase.populateErrorContext(messageContext), controller); } finally { // Call the end checkpoint for non-aggregates. For primitives the CAS has been fully processed // if we are here if (doCheckpoint && getController() instanceof PrimitiveAnalysisEngineController) { getController().endProcess(requestType); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "onMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_msg_processed__FINE", new Object[] { getController().getComponentName(), casRefId }); } } } private String extractNodeName(String url) { int startPos = url.indexOf("//"); // Strip the protocol String temp = url.substring(startPos+2); int endPos = temp.indexOf(":"); // extract hostname from Broker URL return temp.substring(0, endPos).trim(); } public int getSessionAckMode() { return sessionAckMode; } public String getServerUri() { return brokerURL; } public synchronized void setListenerContainer(UimaDefaultMessageListenerContainer messageListener) { this.messageListener = messageListener; System.setProperty("BrokerURI", messageListener.getBrokerUrl()); if ( messageListener.getMessageSelector() !=null && messageListener.getMessageSelector().equals("Command=2001") ) { brokerURL = messageListener.getBrokerUrl(); getController().getOutputChannel().setServerURI(brokerURL); } if (!listenerContainerList.contains(messageListener)) { listenerContainerList.add(messageListener); } if (getController() != null) { try { getController().addInputChannel(this); messageListener.setController(getController()); } catch (Exception e) { } } } public ActiveMQConnectionFactory getConnectionFactory() { if (messageListener == null) { return null; } else { return (ActiveMQConnectionFactory) messageListener.getConnectionFactory(); } } public void ackMessage(MessageContext aMessageContext) { if (aMessageContext != null && sessionAckMode == Session.CLIENT_ACKNOWLEDGE) { try { ((Message) aMessageContext.getRawMessage()).acknowledge(); } catch (Exception e) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "ackMessage", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "ackMessage", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } public String getBrokerURL() { return brokerURL; } public String getInputQueueName() { if (messageListener != null) if (messageListener.getDestination() != null) { return messageListener.getDestination().toString(); } else { return messageListener.getDestinationName();// getEndpointName(); } else { return ""; } } public ServiceInfo getServiceInfo() { if (serviceInfo == null) { serviceInfo = new ServiceInfo(false,controller); serviceInfo.setBrokerURL(getBrokerURL()); serviceInfo.setInputQueueName(getName()); if ( controller == null ) { serviceInfo.setState(ServiceState.INITIALIZING.name()); } else { if ( controller.isCasMultiplier()) { serviceInfo.setCASMultiplier(); } } } return serviceInfo; } public void setServerUri(String serverUri) { brokerURL = serverUri; if (getController() != null && getController() instanceof AggregateAnalysisEngineController) { ((AggregateAnalysisEngineController) getController()).getServiceInfo() .setBrokerURL(brokerURL); } else { ((PrimitiveAnalysisEngineController) getController()).getServiceInfo() .setBrokerURL(brokerURL); } } private void stopChannel(UimaDefaultMessageListenerContainer mL) throws Exception { String eName = mL.getEndpointName(); if (eName != null) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "stopChannel", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_stopping_jms_transport__INFO", new Object[] { eName }); } } mL.stop(); String selector = ""; if (mL.getMessageSelector() != null) { selector = " Selector:" + mL.getMessageSelector(); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "stopChannel", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_stopped_jms_transport__INFO", new Object[] {getController().getComponentName(), mL.getDestination(), selector }); } } private boolean doCloseChannel(UimaDefaultMessageListenerContainer mL, int channelsToClose) { // Check if we are closing just the input channel if (channelsToClose == InputChannel.InputChannels) { // Fetch the listener object ActiveMQDestination destination = (ActiveMQDestination) mL.getListenerEndpoint(); // if this is a listener on a temp queue return false. We need to keep all temp // channels open to receive replies and/or notifications to free CASes // Keep the temp reply channel open if (destination != null && destination.isTemporary()) { return false; } } return true; } public void stop() throws Exception { stop(InputChannel.CloseAllChannels); listenerContainerList.clear(); failedListenerMap.clear(); if ( remoteJMXServer != null ) { remoteJMXServer.disconnect(); remoteJMXServer = null; } } public void setTerminating() { if ( listenerContainerList.size() > 0 ) { // set a global static flag to stop spring's from automatic recovery on lost connection // This method should be called when a service is shutting down ((UimaDefaultMessageListenerContainer)listenerContainerList.get(0)).setTerminating(); } } public void terminate() { try { if ( listenerContainerList.size() > 0 ) { ((UimaDefaultMessageListenerContainer)listenerContainerList.get(0)).closeConnection(); } } catch( Exception e) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "terminate", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_exception__WARNING", e); } } public synchronized void stop(int channelsToClose) throws Exception { List listenersToRemove = new ArrayList(); for (Object listenerObject : listenerContainerList) { final UimaDefaultMessageListenerContainer mL = (UimaDefaultMessageListenerContainer) listenerObject; if (mL != null && doCloseChannel(mL, channelsToClose)) { stopChannel(mL); // Just in case check if the container still in the list. If so, add it to // another list that container listeners that have been stopped and need // to be removed from the listenerContainerList. Removing the listener from // the listenerContainerList in this iterator loop is not working. If for // example the iterator has two elements, after the first remove from the // listenerContainerList, the iterator stops event though there is still // one element left. Process removal of listeners outside of the iterator // loop if (listenerContainerList.contains(mL)) { // When last listener, close shared connection if ( listenerContainerList.size() == 1 ) { try { mL.closeConnection(); } catch( Exception e) { e.printStackTrace(); } } listenersToRemove.add(mL); } } else { if (getController() != null) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "stop", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_transport_not_stopped__INFO", new Object[] { getController().getComponentName() }); } } } } // Remove listeners from the listenerContainerList for (UimaDefaultMessageListenerContainer mL : listenersToRemove) { if ( listenerContainerList.size() == 1 ) { ((UimaDefaultMessageListenerContainer)listenerContainerList.get(0)).closeConnection(); } listenerContainerList.remove(mL); } listenersToRemove.clear(); if (channelsToClose == InputChannel.CloseAllChannels) { stopped = true; } } public boolean isStopped() { return stopped; } public int getConcurrentConsumerCount() { return messageListener.getConcurrentConsumers(); } private void testIfBrokerRunning(String aBrokerUrl) throws Exception { ActiveMQConnectionFactory f = new ActiveMQConnectionFactory(aBrokerUrl); // Try to create a test connection to make sure that the broker is available Connection testConnection = null; try { testConnection = f.createConnection(); } catch (Exception e) { throw e; } finally { if (testConnection != null) { // close test connection. Broker is running testConnection.close(); } } } public void createListener(String aDelegateKey, Endpoint endpointToUpdate) throws Exception { if (getController() instanceof AggregateAnalysisEngineController) { Delegate delegate = ((AggregateAnalysisEngineController) getController()) .lookupDelegate(aDelegateKey); if (delegate != null) { UimaDefaultMessageListenerContainer newListener = new UimaDefaultMessageListenerContainer(); testIfBrokerRunning(delegate.getEndpoint().getServerURI()); ActiveMQConnectionFactory f = new ActiveMQConnectionFactory(delegate.getEndpoint().getServerURI()); newListener.setConnectionFactory(f); newListener.setMessageListener(this); newListener.setController(getController()); TempDestinationResolver resolver = new TempDestinationResolver(); resolver.setConnectionFactory(f); resolver.setListener(newListener); newListener.setDestinationResolver(resolver); org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor executor = new org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor(); executor.setCorePoolSize(delegate.getEndpoint().getConcurrentReplyConsumers()); executor.setMaxPoolSize(delegate.getEndpoint().getConcurrentReplyConsumers()); executor.setQueueCapacity(delegate.getEndpoint().getConcurrentReplyConsumers()); executor.initialize(); newListener.setConcurrentConsumers(delegate.getEndpoint().getConcurrentReplyConsumers()); newListener.setTaskExecutor(executor); newListener.initialize(); newListener.start(); // Wait until the resolver plugs in the destination while (newListener.getDestination() == null) { synchronized (newListener) { newListener.wait(100); } } newListener.afterPropertiesSet(); if ( controller != null && controller.isStopped() ) { newListener.stop(); // we are aborting, the controller has been stopped return; } // Get the endpoint object for a given delegate key from the Aggregate Endpoint endpoint = ((AggregateAnalysisEngineController) getController()).lookUpEndpoint( aDelegateKey, false); // Override the reply destination. endpoint.setDestination(newListener.getDestination()); if ( endpointToUpdate != null) { endpointToUpdate.setDestination(newListener.getDestination()); } Object clone = ((Endpoint_impl) endpoint).clone(); newListener.setTargetEndpoint((Endpoint) clone); endpoint.setStatus(Endpoint.OK); } } } public boolean isListenerActiveOnDestination(Destination destination ) { for (int i = 0; i < listenerContainerList.size(); i++) { UimaDefaultMessageListenerContainer mListener = (UimaDefaultMessageListenerContainer) listenerContainerList .get(i); if ( mListener.getDestination() != null && mListener.getDestination() == destination && mListener.isRunning()) { return true; } } return false; } /** * Given an endpoint name returns all listeners attached to this endpoint. There can be multiple * listeners on an endpoint each with a different selector to receive targeted messages like * GetMeta and Process. * * @param anEndpointName * - name of the endpoint that is used to find associated listener(s) * * @return - list of listeners */ private UimaDefaultMessageListenerContainer[] getListenersForEndpoint(String anEndpointName) { List listeners = new ArrayList(); for (int i = 0; i < listenerContainerList.size(); i++) { UimaDefaultMessageListenerContainer mListener = (UimaDefaultMessageListenerContainer) listenerContainerList .get(i); if (mListener.getDestinationName() != null && mListener.getDestinationName().equals(anEndpointName)) { listeners.add(mListener); } else if (mListener.getDestination() != null && mListener.getDestination().toString().equals(anEndpointName)) { listeners.add(mListener); } } if (listeners.size() > 0) { UimaDefaultMessageListenerContainer[] listenerArray = new UimaDefaultMessageListenerContainer[listeners .size()]; listeners.toArray(listenerArray); return listenerArray; } return null; } /** * */ public void destroyListener(final String anEndpointName, String aDelegateKey) { // check if delegate listener has already been placed in the failed listeners list // If so, nothing else to do here if (failedListenerMap.containsKey(aDelegateKey)) { return; } // Fetch all associated listeners. final UimaDefaultMessageListenerContainer[] mListeners = getListenersForEndpoint(anEndpointName); if (mListeners == null) { return; } // Stop each listener for (final UimaDefaultMessageListenerContainer mListener : mListeners) { if (!mListener.isRunning()) { continue; // Already Stopped } try { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO) && mListener.getDestination() != null) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "destroyListener", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_stop_listener__INFO", new Object[] { mListener.getDestination().toString() }); } // Spin a thread that will stop the listener and wait for its shutdown Thread stopThread = new Thread("InputChannelStopThread") { public void run() { mListener.stop(); // wait until the listener shutsdown while (mListener.isRunning()) ; if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO) && mListener.getDestination() != null) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.INFO, CLASS_NAME.getName(), "destroyListener", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_stopped_listener_INFO", new Object[] { controller.getComponentName(), mListener.getDestination().toString() }); } } }; stopThread.start(); if (getController() != null) { Endpoint endpoint = ((AggregateAnalysisEngineController) getController()).lookUpEndpoint( aDelegateKey, false); endpoint.setStatus(Endpoint.FAILED); if (mListener.getConnectionFactory() != null) { if (getController() instanceof AggregateAnalysisEngineController) { if (!failedListenerMap.containsKey(aDelegateKey)) { failedListenerMap.put(aDelegateKey, mListener); listenerContainerList.remove(mListener); } } } } // } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "destroyListener", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "destroyListener", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } public boolean isFailed(String aDelegateKey) { return failedListenerMap.containsKey(aDelegateKey); } public void removeDelegateFromFailedList( String aDelegateKey ) { if ( failedListenerMap.containsKey(aDelegateKey ) ) { failedListenerMap.remove(aDelegateKey); } } public boolean isListenerForDestination(String anEndpointName) { UimaDefaultMessageListenerContainer[] mListeners = getListenersForEndpoint(anEndpointName); if (mListeners == null) { return false; } return true; } } JmsInputChannelMBean.java000066400000000000000000000020311160020716200345270ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import java.io.Serializable; public interface JmsInputChannelMBean extends Serializable { public String getBrokerURL(); public String getInputQueueName(); } JmsOutputChannel.java000066400000000000000000002504211160020716200340350ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import java.io.ByteArrayOutputStream; import java.io.NotSerializableException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.ConnectException; import java.net.InetAddress; import java.util.Date; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; import javax.jms.Connection; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.ObjectMessage; import javax.jms.TemporaryQueue; import javax.jms.TextMessage; import javax.management.ServiceNotFoundException; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.command.ActiveMQDestination; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.Channel; import org.apache.uima.aae.InProcessCache.CacheEntry; import org.apache.uima.aae.InputChannel; import org.apache.uima.aae.OutputChannel; import org.apache.uima.aae.SerializerCache; import org.apache.uima.aae.UIMAEE_Constants; import org.apache.uima.aae.UimaSerializer; import org.apache.uima.aae.controller.AggregateAnalysisEngineController; import org.apache.uima.aae.controller.AnalysisEngineController; import org.apache.uima.aae.controller.Endpoint; import org.apache.uima.aae.controller.LocalCache.CasStateEntry; import org.apache.uima.aae.controller.PrimitiveAnalysisEngineController; import org.apache.uima.aae.delegate.Delegate; import org.apache.uima.aae.error.AsynchAEException; import org.apache.uima.aae.error.ErrorContext; import org.apache.uima.aae.error.MessageTimeoutException; import org.apache.uima.aae.error.ServiceShutdownException; import org.apache.uima.aae.error.UimaEEServiceException; import org.apache.uima.aae.jmx.ServiceInfo; import org.apache.uima.aae.jmx.ServicePerformance; import org.apache.uima.aae.message.AsynchAEMessage; import org.apache.uima.aae.message.UIMAMessage; import org.apache.uima.aae.monitor.Monitor; import org.apache.uima.aae.monitor.statistics.LongNumericStatistic; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.cas.CAS; import org.apache.uima.cas.impl.XmiSerializationSharedData; import org.apache.uima.resource.metadata.ProcessingResourceMetaData; import org.apache.uima.util.Level; public class JmsOutputChannel implements OutputChannel { private static final Class CLASS_NAME = JmsOutputChannel.class; private static final long INACTIVITY_TIMEOUT = 1800000; // 30 minutes in term of millis private CountDownLatch controllerLatch = new CountDownLatch(1); private ActiveMQConnectionFactory connectionFactory; // Name of the external queue this service uses to receive messages private String serviceInputEndpoint; // Name of the internal queue this services uses to receive messages from delegates private String controllerInputEndpoint; // Name of the queue used by Cas Multiplier to receive requests to free CASes private String secondaryInputEndpoint; // The service controller private AnalysisEngineController analysisEngineController; // Cache containing connections to destinations this service interacts with // Each entry in this cache has an inactivity timer that times amount of time // elapsed since the last time a message was sent to the destination. private ConcurrentHashMap connectionMap = new ConcurrentHashMap(); private String serverURI; private String serviceProtocolList = ""; private volatile boolean aborting = false; private Destination freeCASTempQueue; private String hostIP = null; // By default every message will have expiration time added private volatile boolean addTimeToLive = true; public JmsOutputChannel() { try { hostIP = InetAddress.getLocalHost().getHostAddress(); } catch (Exception e) { /* silently deal with this error */ } // Check the environment for existence of NoTTL tag. If present, // the deployer of the service wants to avoid message expiration. if (System.getProperty("NoTTL") != null) { addTimeToLive = false; } } /** * Sets the ActiveMQ Broker URI */ public void setServerURI(String aServerURI) { serverURI = aServerURI; } protected void setFreeCasQueue(Destination destination) { freeCASTempQueue = destination; } public String getServerURI() { return serverURI; } public String getName() { return ""; } /** * * @param connectionFactory */ public void setConnectionFactory(ActiveMQConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; } public void setServiceInputEndpoint(String anEnpoint) { serviceInputEndpoint = anEnpoint; } public void setSecondaryInputQueue(String anEndpoint) { secondaryInputEndpoint = anEndpoint; } public ActiveMQConnectionFactory getConnectionFactory() { return this.connectionFactory; } public void initialize() throws AsynchAEException { if (getAnalysisEngineController() instanceof AggregateAnalysisEngineController) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "initialize", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_connector_list__FINE", new Object[] { System.getProperty("ActiveMQConnectors") }); } // Aggregate controller set this System property at startup in serviceProtocolList = System.getProperty("ActiveMQConnectors"); } } /** * Serializes CAS using indicated Serializer. * * @param aCAS * - CAS instance to serialize * @param aSerializerKey * - a key identifying which serializer to use * @return - String - serialized CAS as String * @throws Exception */ public String serializeCAS(boolean isReply, CAS aCAS, String aCasReferenceId, String aSerializerKey) throws Exception { long start = getAnalysisEngineController().getCpuTime(); String serializedCas = null; // Fetch dedicated Serializer associated with this thread UimaSerializer serializer = SerializerCache.lookupSerializerByThreadId(); if (isReply || "xmi".equalsIgnoreCase(aSerializerKey)) { CacheEntry cacheEntry = getAnalysisEngineController().getInProcessCache() .getCacheEntryForCAS(aCasReferenceId); XmiSerializationSharedData serSharedData; if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "serializeCAS", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_serialize_cas__FINE", new Object[] { aCasReferenceId }); } if (isReply) { serSharedData = cacheEntry.getDeserSharedData(); if (cacheEntry.acceptsDeltaCas() && (cacheEntry.getMarker() != null && cacheEntry.getMarker().isValid())) { serializedCas = serializer.serializeCasToXmi(aCAS, serSharedData, cacheEntry .getMarker()); cacheEntry.setSentDeltaCas(true); } else { serializedCas = serializer.serializeCasToXmi(aCAS, serSharedData); cacheEntry.setSentDeltaCas(false); } // if market is invalid, create a fresh marker. if (cacheEntry.getMarker() != null && !cacheEntry.getMarker().isValid()) { cacheEntry.setMarker(aCAS.createMarker()); } if ( !cacheEntry.sentDeltaCas() ) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINEST)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "serializeCAS", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_serialize_cas__FINEST", new Object[] { aCasReferenceId, "FULL Cas serialized and sent." }); } } } else { serSharedData = cacheEntry.getDeserSharedData(); if (serSharedData == null) { serSharedData = new XmiSerializationSharedData(); cacheEntry.setXmiSerializationData(serSharedData); } serializedCas = serializer.serializeCasToXmi(aCAS, serSharedData); int maxOutgoingXmiId = serSharedData.getMaxXmiId(); // Save High Water Mark in case a merge is needed getAnalysisEngineController().getInProcessCache().getCacheEntryForCAS(aCasReferenceId) .setHighWaterMark(maxOutgoingXmiId); } } else if ("xcas".equalsIgnoreCase(aSerializerKey)) { // Default is XCAS ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { serializer.serializeToXCAS(bos, aCAS, null, null, null); serializedCas = bos.toString(); } catch (Exception e) { throw e; } finally { bos.close(); } } LongNumericStatistic statistic; if ((statistic = getAnalysisEngineController().getMonitor().getLongNumericStatistic("", Monitor.TotalSerializeTime)) != null) { statistic.increment(getAnalysisEngineController().getCpuTime() - start); } return serializedCas; } /** * This method verifies that the destination (queue) exists. It opens a connection the a broker, * creates a session and a message producer. Finally, using the message producer, sends an empty * message to a queue. This API support enables checking for existence of the reply (temp) queue * before any processing of a cas is done. This is an optimization to prevent expensive processing * if the client destination is no longer available. */ public void bindWithClientEndpoint(Endpoint anEndpoint) throws Exception { // check if the reply endpoint is a temp destination if (anEndpoint.getDestination() != null) { // create message producer if one doesnt exist for this destination JmsEndpointConnection_impl endpointConnection = getEndpointConnection(anEndpoint); // Create empty message TextMessage tm = endpointConnection.produceTextMessage(""); // test sending a message to reply endpoint. This tests existence of // a temp queue. If the client has been shutdown, this will fail // with an exception. endpointConnection.send(tm, 0, false); } } private long getInactivityTimeout(String destination, String brokerURL) { if (System.getProperty(JmsConstants.SessionTimeoutOverride) != null) { try { long overrideTimeoutValue = Long.parseLong(System .getProperty(JmsConstants.SessionTimeoutOverride)); // endpointConnection.setInactivityTimeout(overrideTimeoutValue); // If the connection is // not used within this interval it will be removed if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "getEndpointConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_override_connection_timeout__FINE", new Object[] { analysisEngineController, overrideTimeoutValue, destination, brokerURL }); } return overrideTimeoutValue; } catch (NumberFormatException e) { /* ignore. use the default */} } else { // endpointConnection.setInactivityTimeout(INACTIVITY_TIMEOUT); // If the connection is not // used within this interval it will be removed if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME) .logrb( Level.FINE, CLASS_NAME.getName(), "getEndpointConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_connection_timeout__FINE", new Object[] { analysisEngineController, INACTIVITY_TIMEOUT, destination, brokerURL }); } } return (int) INACTIVITY_TIMEOUT; // default } /** * Stop JMS connection and close all sessions associated with this connection * * @param brokerConnectionEntry */ private void invalidateConnectionAndEndpoints(BrokerConnectionEntry brokerConnectionEntry ) { Connection conn = brokerConnectionEntry.getConnection(); try { if ( conn != null && ((ActiveMQConnection)conn).isClosed()) { brokerConnectionEntry.getConnection().stop(); brokerConnectionEntry.getConnection().close(); brokerConnectionEntry.setConnection(null); for (Entry endpoints : brokerConnectionEntry.endpointMap .entrySet()) { endpoints.getValue().close(); // close session and producer } } } catch (Exception e) { // Ignore this for now. Attempting to close connection that has been closed // Ignore we are shutting down } finally { brokerConnectionEntry.endpointMap.clear(); connectionMap.remove(brokerConnectionEntry.getBrokerURL()); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.INFO, CLASS_NAME.getName(), "invalidateConnectionAndEndpoints", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_service_closing_connection__INFO", new Object[] { getAnalysisEngineController().getComponentName(), brokerConnectionEntry.getBrokerURL() }); } } brokerConnectionEntry.setConnection(null); } private String getDestinationName(Endpoint anEndpoint) { String destination = anEndpoint.getEndpoint(); if (anEndpoint.getDestination() != null && anEndpoint.getDestination() instanceof ActiveMQDestination) { destination = ((ActiveMQDestination) anEndpoint.getDestination()).getPhysicalName(); } return destination; } private String getLookupKey(Endpoint anEndpoint) { String key = anEndpoint.getEndpoint() + anEndpoint.getServerURI(); String destination = getDestinationName(anEndpoint); if ( anEndpoint.getDelegateKey() != null ) { key = anEndpoint.getDelegateKey() + "-"+destination; } else { key = "Client-"+destination; } return key; } private BrokerConnectionEntry createConnectionEntry(String brokerURL) { BrokerConnectionEntry brokerConnectionEntry = new BrokerConnectionEntry(); connectionMap.put(brokerURL, brokerConnectionEntry); ConnectionTimer connectionTimer = new ConnectionTimer(brokerConnectionEntry); connectionTimer.setAnalysisEngineController(getAnalysisEngineController()); brokerConnectionEntry.setConnectionTimer(connectionTimer); return brokerConnectionEntry; } /** * Returns {@link JmsEndpointConnection_impl} instance bound to a destination defined in the * {@link Endpoint} The endpoint identifies the destination that should receive the message. This * method refrences a cache that stores active connections. Active connections are those that are * fully bound and being used for communication. The key to locate the entry in the connection * cache is the queue name + broker URI. This uniquely identifies the destination. If an entry * does not exist in the cache, this routine will create a new connection, initialize it, and * cache it for future use. The cache is purely for optimization, to prevent openinig a connection * for every message which is a costly operation. Instead the connection is open, cached and * reused. The {@link JmsEndpointConnection_impl} instance is stored in the cache, and uses a * timer to make sure stale connection are removed. If a connection is not used in a given time * interval, the connection is considered stale and is dropped from the cache. * * @param anEndpoint * - endpoint configuration containing connection information to a destination * @return - * @throws AsynchAEException */ private synchronized JmsEndpointConnection_impl getEndpointConnection(Endpoint anEndpoint) throws AsynchAEException, ServiceShutdownException, ConnectException { try { controllerLatch.await(); } catch (InterruptedException e) { } JmsEndpointConnection_impl endpointConnection = null; String brokerConnectionURL = null; // If sending a Free Cas Request to a remote Cas Multiplier always use the CM's // broker if ( anEndpoint.isFreeCasEndpoint() && anEndpoint.isCasMultiplier() && anEndpoint.isReplyEndpoint()) { brokerConnectionURL = anEndpoint.getServerURI(); } else { // If this is a reply to a client, use the same broker URL that manages this service input queue. // Otherwise this is a request so use a broker specified in the endpoint object. brokerConnectionURL = (anEndpoint.isReplyEndpoint()) ? serverURI : anEndpoint.getServerURI(); } // First get a Map containing destinations managed by a broker provided by the client BrokerConnectionEntry brokerConnectionEntry = null; if (connectionMap.containsKey(brokerConnectionURL)) { brokerConnectionEntry = (BrokerConnectionEntry) connectionMap.get(brokerConnectionURL); // Findbugs thinks that the above may return null, perhaps due to a race condition. Add // the null check just in case if (brokerConnectionEntry == null) { throw new AsynchAEException("Controller:" + getAnalysisEngineController().getComponentName() + " Unable to Lookup Broker Connection For URL:" + brokerConnectionURL); } brokerConnectionEntry.setBrokerURL(brokerConnectionURL); if ( JmsEndpointConnection_impl.connectionClosedOrFailed(brokerConnectionEntry) ) { invalidateConnectionAndEndpoints(brokerConnectionEntry); brokerConnectionEntry = createConnectionEntry(brokerConnectionURL); } } else { brokerConnectionEntry = createConnectionEntry(brokerConnectionURL); } String key = getLookupKey(anEndpoint); String destination = getDestinationName(anEndpoint); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "getEndpointConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_acquiring_connection_to_endpoint__FINE", new Object[] { getAnalysisEngineController().getComponentName(), destination, brokerConnectionURL }); } // check the cache first if (!brokerConnectionEntry.endpointExists(key)) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "getEndpointConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_create_new_connection__FINE", new Object[] { getAnalysisEngineController().getComponentName(), destination, brokerConnectionURL }); } endpointConnection = new JmsEndpointConnection_impl(brokerConnectionEntry, anEndpoint, getAnalysisEngineController()); brokerConnectionEntry.addEndpointConnection(key, endpointConnection); long replyQueueInactivityTimeout = getInactivityTimeout(destination, brokerConnectionURL); brokerConnectionEntry.getConnectionTimer().setInactivityTimeout(replyQueueInactivityTimeout); // Connection is not in the cache, create a new connection, initialize it and cache it if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "getEndpointConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_open_new_connection_to_endpoint__FINE", new Object[] { getDestinationName(anEndpoint), brokerConnectionURL }); } /** * Open connection to a broker, create JMS session and MessageProducer */ endpointConnection.open(); brokerConnectionEntry.getConnectionTimer().setConnectionCreationTimestamp( endpointConnection.connectionCreationTimestamp); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "getEndpointConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_connection_opened_to_endpoint__FINE", new Object[] { getAnalysisEngineController().getComponentName(), destination, brokerConnectionURL }); } } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "getEndpointConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_reusing_existing_connection__FINE", new Object[] { getAnalysisEngineController().getComponentName(), destination, brokerConnectionURL }); } // Retrieve connection from the connection cache endpointConnection = brokerConnectionEntry.getEndpointConnection(key); // check the state of the connection and re-open it if necessary if (endpointConnection != null && !endpointConnection.isOpen()) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "getEndpointConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_connection_closed_reopening_endpoint__FINE", new Object[] { destination }); } endpointConnection.open(); if ( endpointConnection.isOpen()) { brokerConnectionEntry.getConnectionTimer() .setConnectionCreationTimestamp(System.nanoTime()); if ( getAnalysisEngineController() instanceof AggregateAnalysisEngineController && anEndpoint.getDelegateKey() != null ) { Endpoint masterEndpoint = ((AggregateAnalysisEngineController) getAnalysisEngineController()).lookUpEndpoint( anEndpoint.getDelegateKey(), false); masterEndpoint.setStatus(Endpoint.OK); } } } } return endpointConnection; } private void logRequest(String key, Endpoint anEndpoint ) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "sendRequest", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "key", new Object[] { getAnalysisEngineController().getComponentName(), anEndpoint.getDelegateKey() }); } } private Delegate startGetMetaTimerAndGetDelegate( Endpoint anEndpoint ) { Delegate delegate = null; if (anEndpoint.getDestination() != null) { String replyQueueName = ((ActiveMQDestination) anEndpoint.getDestination()) .getPhysicalName().replaceAll(":", "_"); if (getAnalysisEngineController() instanceof AggregateAnalysisEngineController) { String delegateKey = ((AggregateAnalysisEngineController) getAnalysisEngineController()) .lookUpDelegateKey(anEndpoint.getEndpoint()); ServiceInfo serviceInfo = ((AggregateAnalysisEngineController) getAnalysisEngineController()) .getDelegateServiceInfo(delegateKey); if (serviceInfo != null) { serviceInfo.setReplyQueueName(replyQueueName); serviceInfo.setServiceKey(delegateKey); } delegate = lookupDelegate(delegateKey); if (delegate.getGetMetaTimeout() > 0) { delegate.startGetMetaRequestTimer(); } } } return delegate; } /** * Sends request message to a delegate. * * @param aCommand * - the type of request [Process|GetMeta] * @param anEndpoint * - the destination where the delegate receives messages * * @throws AsynchAEException */ public void sendRequest(int aCommand, String aCasReferenceId, Endpoint anEndpoint) throws AsynchAEException { Delegate delegate = null; try { JmsEndpointConnection_impl endpointConnection = getEndpointConnection(anEndpoint); Message tm = endpointConnection.produceTextMessage(""); tm.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.None); switch(aCommand) { case AsynchAEMessage.CollectionProcessComplete: logRequest("UIMAEE_send_cpc_req__FINE", anEndpoint); break; case AsynchAEMessage.ReleaseCAS: tm.setStringProperty(AsynchAEMessage.CasReference, aCasReferenceId); logRequest("UIMAJMS_releasecas_request__endpoint__FINEST", anEndpoint); break; case AsynchAEMessage.GetMeta: delegate = startGetMetaTimerAndGetDelegate(anEndpoint); logRequest("UIMAEE_service_sending_getmeta_request__FINE", anEndpoint); break; case AsynchAEMessage.Stop: tm.setStringProperty(AsynchAEMessage.CasReference, aCasReferenceId); logRequest("UIMAEE_service_sending_stop_request__FINE", anEndpoint); break; case AsynchAEMessage.Process: logRequest("UIMAEE_service_sending_process_request__FINE", anEndpoint); serializeCasAndSend(getAnalysisEngineController(). getInProcessCache(). getCacheEntryForCAS(aCasReferenceId), anEndpoint); return; /// <<<<< RETURN - Done here >>>> }; populateHeaderWithRequestContext(tm, anEndpoint, aCommand); // For remotes add a special property to the message. This property // will be echoed back by the service. This property enables matching // the reply with the right endpoint object managed by the aggregate. tm.setStringProperty(AsynchAEMessage.EndpointServer, anEndpoint.getServerURI()); if (endpointConnection.send(tm, 0, true) != true) { throw new ServiceNotFoundException(); } } catch (AsynchAEException e) { throw e; } catch (Exception e) { if (delegate != null && aCommand == AsynchAEMessage.GetMeta) { delegate.cancelDelegateTimer(); } // Handle the error ErrorContext errorContext = new ErrorContext(); errorContext.add(AsynchAEMessage.Command, aCommand); errorContext.add(AsynchAEMessage.Endpoint, anEndpoint); getAnalysisEngineController().getErrorHandlerChain().handle(e, errorContext, getAnalysisEngineController()); } } private void serializeCasAndSend(CacheEntry entry, Endpoint anEndpoint) throws Exception { if (anEndpoint.getSerializer().equals("xmi")) { String serializedCAS = getSerializedCasAndReleaseIt(false, entry.getCasReferenceId(), anEndpoint, anEndpoint.isRetryEnabled()); if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINEST, CLASS_NAME.getName(), "sendRequest", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_sending_serialized_cas__FINEST", new Object[] { getAnalysisEngineController().getComponentName(), anEndpoint.getDelegateKey(), entry.getCasReferenceId(), serializedCAS }); } // Send process request to remote delegate and start timeout timer sendCasToRemoteEndpoint(true, serializedCAS, entry, anEndpoint, true); } else { byte[] serializedCAS = getBinaryCasAndReleaseIt(false, entry.getCasReferenceId(), anEndpoint, anEndpoint.isRetryEnabled()); if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINEST, CLASS_NAME.getName(), "sendRequest", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_sending_binary_cas__FINEST", new Object[] { getAnalysisEngineController().getComponentName(), anEndpoint.getDelegateKey(), entry.getCasReferenceId(), serializedCAS }); } // Send process request to remote delegate and start timeout timer sendCasToRemoteEndpoint(true, serializedCAS, entry, anEndpoint, true); } } public void sendReply(CacheEntry entry, Endpoint anEndpoint) throws AsynchAEException { try { anEndpoint.setReplyEndpoint(true); if (anEndpoint.isRemote()) { if (anEndpoint.getSerializer().equals("xmi")) { // Serializes CAS and releases it back to CAS Pool String serializedCAS = getSerializedCas(true, entry.getCasReferenceId(), anEndpoint, anEndpoint.isRetryEnabled()); sendCasToRemoteEndpoint(false, serializedCAS, entry, anEndpoint, false); } else { byte[] binaryCas = getBinaryCas(true, entry.getCasReferenceId(), anEndpoint, anEndpoint .isRetryEnabled()); if (binaryCas == null) { return; } sendCasToRemoteEndpoint(false, binaryCas, entry, anEndpoint, false); } } else { // Not supported } } catch (ServiceShutdownException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", getAnalysisEngineController().getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } catch (AsynchAEException e) { throw e; } catch (Exception e) { throw new AsynchAEException(e); } } public void sendReply(int aCommand, Endpoint anEndpoint, String aCasReferenceId, boolean notifyOnJmsException) throws AsynchAEException { try { if (aborting) { return; } anEndpoint.setReplyEndpoint(true); JmsEndpointConnection_impl endpointConnection = getEndpointConnection(anEndpoint); TextMessage tm = endpointConnection.produceTextMessage(""); tm.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.None); populateHeaderWithResponseContext(tm, anEndpoint, aCommand); if ( aCasReferenceId != null ) { tm.setStringProperty(AsynchAEMessage.CasReference, aCasReferenceId); } // If this service is a Cas Multiplier add to the message a FreeCasQueue. // The client may need send Stop request to that queue. if (aCommand == AsynchAEMessage.ServiceInfo && getAnalysisEngineController().isCasMultiplier() && freeCASTempQueue != null) { // Attach a temp queue to the outgoing message. This a queue where // Free CAS notifications need to be sent from the client tm.setJMSReplyTo(freeCASTempQueue); } // Check if there was a failure while sending a message if ( !endpointConnection.send(tm, 0, false, notifyOnJmsException) && notifyOnJmsException ) { throw new JMSException("JMS Send Failed. Check UIMA Log For Details."); } addIdleTime(tm); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_cpc_reply_sent__FINE", new Object[] { getAnalysisEngineController().getComponentName(), anEndpoint.getEndpoint() }); } } catch (JMSException e) { if ( notifyOnJmsException ) { throw new AsynchAEException(e); } // Unable to establish connection to the endpoint. Log it and continue if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", getAnalysisEngineController().getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_exception__WARNING", e); } } catch (ServiceShutdownException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", getAnalysisEngineController().getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } catch (AsynchAEException e) { throw e; } catch (Exception e) { throw new AsynchAEException(e); } } /** * Sends JMS Reply Message to a given endpoint. The reply message contains given Throwable (with * full stack) * * @param t * - Throwable to include in the reply message * @param anEndpoint * - an endpoint to receive the reply message * @param aCasReferenceId * - a unique CAS reference id * * @throws AsynchAEException */ public void sendReply(Throwable t, String aCasReferenceId, String aParentCasReferenceId, Endpoint anEndpoint, int aCommand) throws AsynchAEException { anEndpoint.setReplyEndpoint(true); try { Throwable wrapper = null; if (!(t instanceof UimaEEServiceException)) { // Strip off AsyncAEException and replace with UimaEEServiceException if (t instanceof AsynchAEException && t.getCause() != null) { wrapper = new UimaEEServiceException(t.getCause()); } else { wrapper = new UimaEEServiceException(t); } } if (aborting) { return; } anEndpoint.setReplyEndpoint(true); JmsEndpointConnection_impl endpointConnection = getEndpointConnection(anEndpoint); // Create Message that will contain serialized Exception with stack ObjectMessage om = endpointConnection.produceObjectMessage(); // Now try to catch non-serializable exception. The Throwable passed into this method may // not be serializable. Catch the exception, and create a wrapper containing stringified // stack trace. try { // serialize the Throwable if (wrapper == null) { om.setObject(t); } else { om.setObject(wrapper); } } catch( RuntimeException e) { // Check if we failed due to non-serializable object in the Throwable if ( e.getCause() != null && e.getCause() instanceof NotSerializableException ) { // stringify the stack trace StringWriter sw = new StringWriter(); t.printStackTrace(new PrintWriter(sw)); wrapper = new UimaEEServiceException(sw.toString()); // serialize the new wrapper om.setObject(wrapper); } else { throw e; // rethrow } } catch( Exception e) { throw e; // rethrow } // Add common header properties populateHeaderWithResponseContext(om, anEndpoint, aCommand); // AsynchAEMessage.Process); om.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.Exception); if (aCasReferenceId != null) { om.setStringProperty(AsynchAEMessage.CasReference, aCasReferenceId); if (aParentCasReferenceId != null) { om.setStringProperty(AsynchAEMessage.InputCasReference, aParentCasReferenceId); } } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_sending_exception__FINE", new Object[] { getAnalysisEngineController().getName(), anEndpoint.getEndpoint() }); } // Dispatch Message to destination endpointConnection.send(om, 0, false); addIdleTime(om); } catch (JMSException e) { // Unable to establish connection to the endpoint. Logit and continue if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_unable_to_connect__INFO", new Object[] { getAnalysisEngineController().getName(), anEndpoint.getEndpoint() }); } } catch (ServiceShutdownException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", getAnalysisEngineController().getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } catch (AsynchAEException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_unable_to_connect__INFO", new Object[] { getAnalysisEngineController().getName(), anEndpoint.getEndpoint() }); } } catch (Exception e) { throw new AsynchAEException(e); } } /** * * @param aProcessingResourceMetadata * @param anEndpoint * @param serialize * @throws AsynchAEException */ public void sendReply(ProcessingResourceMetaData aProcessingResourceMetadata, Endpoint anEndpoint, boolean serialize) throws AsynchAEException { if (aborting) { return; } long msgSize = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { anEndpoint.setReplyEndpoint(true); // Initialize JMS connection to given endpoint JmsEndpointConnection_impl endpointConnection = getEndpointConnection(anEndpoint); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINEST)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINEST, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_produce_txt_msg__FINE", new Object[] {}); } TextMessage tm = endpointConnection.produceTextMessage(""); // Collocated Aggregate components dont send metadata just empty reply // Such aggregate has merged its typesystem already since it shares // CasManager with its parent if (serialize) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINEST)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINEST, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_serializing_meta__FINE", new Object[] {}); } // Serialize metadata aProcessingResourceMetadata.toXML(bos); tm.setText(bos.toString()); msgSize = bos.toString().length(); } tm.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.Metadata); // This service supports Binary Serialization tm.setIntProperty(AsynchAEMessage.Serialization, AsynchAEMessage.BinarySerialization); populateHeaderWithResponseContext(tm, anEndpoint, AsynchAEMessage.GetMeta); if (freeCASTempQueue != null) { // Attach a temp queue to the outgoing message. This a queue where // Free CAS notifications need to be sent from the client tm.setJMSReplyTo(freeCASTempQueue); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINEST)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINEST, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_metadata_reply__endpoint__FINEST", new Object[] { serviceInputEndpoint, anEndpoint.getEndpoint() }); } endpointConnection.send(tm, msgSize, false); } catch (JMSException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", getAnalysisEngineController().getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } // Unable to establish connection to the endpoint. Log it and continue if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_unable_to_connect__INFO", new Object[] { getAnalysisEngineController().getName(), anEndpoint.getEndpoint() }); } } catch (ServiceShutdownException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", getAnalysisEngineController().getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", getAnalysisEngineController().getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } throw new AsynchAEException(e); } finally { try { bos.close(); } catch (Exception e) { } } } private byte[] getBinaryCas(boolean isReply, String aCasReferenceId, Endpoint anEndpoint, boolean cacheSerializedCas) throws Exception { CAS cas = null; try { byte[] serializedCAS = null; // Using Cas reference Id retrieve CAS from the shared Cash cas = getAnalysisEngineController().getInProcessCache().getCasByReference(aCasReferenceId); ServicePerformance casStats = getAnalysisEngineController().getCasStatistics(aCasReferenceId); CacheEntry entry = getAnalysisEngineController().getInProcessCache().getCacheEntryForCAS( aCasReferenceId); long t1 = getAnalysisEngineController().getCpuTime(); // Serialize CAS for remote Delegates String serializerType = anEndpoint.getSerializer(); if (cas == null || entry == null) { return null; } // Fetch dedicated Serializer associated with this thread UimaSerializer serializer = SerializerCache.lookupSerializerByThreadId(); if (serializerType.equals("binary")) { if (entry.acceptsDeltaCas() && isReply) { if (entry.getMarker() != null && entry.getMarker().isValid()) { serializedCAS = serializer.serializeCasToBinary(cas, entry.getMarker()); entry.setSentDeltaCas(true); } else { serializedCAS = serializer.serializeCasToBinary(cas); entry.setSentDeltaCas(false); } } else { serializedCAS = serializer.serializeCasToBinary(cas); entry.setSentDeltaCas(false); if (isReply) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINEST)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINE, CLASS_NAME.getName(), "getBinaryCas", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_serialize_cas__FINEST", new Object[] { aCasReferenceId, "FULL Cas serialized and sent." }); } } } // create a fresh marker if (entry.getMarker() != null && !entry.getMarker().isValid()) { entry.setMarker(cas.createMarker()); } } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.INFO, CLASS_NAME.getName(), "getBinaryCas", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_invalid_serializer__WARNING", new Object[] { getAnalysisEngineController().getName(), serializerType, anEndpoint.getEndpoint() }); } throw new UimaEEServiceException("Invalid Serializer:" + serializerType + " For Endpoint:" + anEndpoint.getEndpoint()); } long timeToSerializeCas = getAnalysisEngineController().getCpuTime() - t1; getAnalysisEngineController().incrementSerializationTime(timeToSerializeCas); entry.incrementTimeToSerializeCAS(timeToSerializeCas); casStats.incrementCasSerializationTime(timeToSerializeCas); getAnalysisEngineController().getServicePerformance().incrementCasSerializationTime( timeToSerializeCas); return serializedCAS; } catch (Exception e) { throw new AsynchAEException(e); } } private String getSerializedCas(boolean isReply, String aCasReferenceId, Endpoint anEndpoint, boolean cacheSerializedCas) throws Exception { CAS cas = null; try { String serializedCAS = null; // Using Cas reference Id retrieve CAS from the shared Cash cas = getAnalysisEngineController().getInProcessCache().getCasByReference(aCasReferenceId); ServicePerformance casStats = getAnalysisEngineController().getCasStatistics(aCasReferenceId); if (cas == null) { serializedCAS = getAnalysisEngineController().getInProcessCache().getSerializedCAS( aCasReferenceId); } else { CacheEntry entry = getAnalysisEngineController().getInProcessCache().getCacheEntryForCAS( aCasReferenceId); long t1 = getAnalysisEngineController().getCpuTime(); // Serialize CAS for remote Delegates String serializer = anEndpoint.getSerializer(); if (serializer == null || serializer.trim().length() == 0) { serializer = "xmi"; } serializedCAS = serializeCAS(isReply, cas, aCasReferenceId, serializer); long timeToSerializeCas = getAnalysisEngineController().getCpuTime() - t1; getAnalysisEngineController().incrementSerializationTime(timeToSerializeCas); entry.incrementTimeToSerializeCAS(timeToSerializeCas); casStats.incrementCasSerializationTime(timeToSerializeCas); getAnalysisEngineController().getServicePerformance().incrementCasSerializationTime( timeToSerializeCas); if (cacheSerializedCas) { getAnalysisEngineController().getInProcessCache().saveSerializedCAS(aCasReferenceId, serializedCAS); } } return serializedCAS; } catch (Exception e) { throw new AsynchAEException(e); } } private byte[] getBinaryCasAndReleaseIt(boolean isReply, String aCasReferenceId, Endpoint anEndpoint, boolean cacheSerializedCas) throws Exception { try { return getBinaryCas(isReply, aCasReferenceId, anEndpoint, cacheSerializedCas); } catch (Exception e) { throw new AsynchAEException(e); } finally { if (getAnalysisEngineController() instanceof PrimitiveAnalysisEngineController && anEndpoint.isRemote()) { getAnalysisEngineController().dropCAS(aCasReferenceId, true); } } } private String getSerializedCasAndReleaseIt(boolean isReply, String aCasReferenceId, Endpoint anEndpoint, boolean cacheSerializedCas) throws Exception { try { return getSerializedCas(isReply, aCasReferenceId, anEndpoint, cacheSerializedCas); } catch (Exception e) { throw new AsynchAEException(e); } finally { if (getAnalysisEngineController() instanceof PrimitiveAnalysisEngineController && anEndpoint.isRemote()) { getAnalysisEngineController().dropCAS(aCasReferenceId, true); } } } private void populateStats(Message aTextMessage, Endpoint anEndpoint, String aCasReferenceId, int anAdminCommand, boolean isRequest) throws Exception { if (anEndpoint.isFinal()) { aTextMessage.setLongProperty("SENT-TIME", System.nanoTime()); } if (anAdminCommand == AsynchAEMessage.Process) { if (isRequest) { long departureTime = System.nanoTime(); getAnalysisEngineController().saveTime(departureTime, aCasReferenceId, anEndpoint.getEndpoint()); } else { ServicePerformance casStats = getAnalysisEngineController().getCasStatistics( aCasReferenceId); aTextMessage.setLongProperty(AsynchAEMessage.TimeToSerializeCAS, casStats .getRawCasSerializationTime()); aTextMessage.setLongProperty(AsynchAEMessage.TimeToDeserializeCAS, casStats .getRawCasDeserializationTime()); aTextMessage.setLongProperty(AsynchAEMessage.TimeInProcessCAS, casStats .getRawAnalysisTime()); aTextMessage.setLongProperty(AsynchAEMessage.TimeWaitingForCAS, getAnalysisEngineController().getServicePerformance().getTimeWaitingForCAS()); long iT = getAnalysisEngineController().getIdleTimeBetweenProcessCalls( AsynchAEMessage.Process); aTextMessage.setLongProperty(AsynchAEMessage.IdleTime, iT); String lookupKey = getAnalysisEngineController().getName(); long arrivalTime = getAnalysisEngineController().getTime(aCasReferenceId, lookupKey); // serviceInputEndpoint); long timeInService = getAnalysisEngineController().getCpuTime() - arrivalTime; if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINEST)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINEST, CLASS_NAME.getName(), "populateStats", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_timein_service__FINEST", new Object[] { serviceInputEndpoint, (double) timeInService / (double) 1000000 }); } } } } private long getCommandTimeoutValue(Endpoint anEndpoint, int aCommand) { switch (aCommand) { case AsynchAEMessage.GetMeta: return anEndpoint.getMetadataRequestTimeout(); case AsynchAEMessage.Process: return anEndpoint.getProcessRequestTimeout(); } return 0; // no match for the command } /** * Adds Request specific properties to the JMS Header. * * @param aMessage * @param anEndpoint * @param aCommand * @throws Exception */ private void populateHeaderWithRequestContext(Message aMessage, Endpoint anEndpoint, int aCommand) throws Exception { aMessage.setIntProperty(AsynchAEMessage.MessageType, AsynchAEMessage.Request); aMessage.setIntProperty(AsynchAEMessage.Command, aCommand); // TODO override default based on system property aMessage.setBooleanProperty(AsynchAEMessage.AcceptsDeltaCas, true); long timeout = getCommandTimeoutValue(anEndpoint, aCommand); // If the timeout is defined in the Deployment Descriptor and // the service is configured to use time to live (TTL), add // JMS message expiration time. The TTL is by default always // added to the message. To override this add "-DNoTTL" to the // command line. if (timeout > 0 && addTimeToLive) { Delegate delegate = lookupDelegate(anEndpoint.getDelegateKey()); long ttl = timeout; // How many CASes are in the list of CASes pending reply for this delegate int currentOutstandingCasListSize = delegate.getCasPendingReplyListSize(); if (currentOutstandingCasListSize > 0) { // increase the time-to-live ttl *= currentOutstandingCasListSize; } aMessage.setJMSExpiration(ttl); } if (getAnalysisEngineController() instanceof AggregateAnalysisEngineController) { aMessage.setStringProperty(AsynchAEMessage.MessageFrom, controllerInputEndpoint); if (anEndpoint.isRemote()) { String protocol = serviceProtocolList; if (anEndpoint.getServerURI().trim().toLowerCase().startsWith("http") || (anEndpoint.getReplyToEndpoint() != null && anEndpoint.getReplyToEndpoint() .trim().length() > 0)) { protocol = anEndpoint.getServerURI().trim(); // protocol = extractURLWithProtocol(serviceProtocolList, "http"); // get the replyto endpoint name String replyTo = anEndpoint.getReplyToEndpoint(); if (replyTo == null && anEndpoint.getDestination() == null) { throw new AsynchAEException( "replyTo endpoint name not specified for HTTP-based endpoint:" + anEndpoint.getEndpoint()); } if (replyTo == null) { replyTo = ""; } aMessage.setStringProperty(AsynchAEMessage.MessageFrom, replyTo); } Object destination; if ((destination = anEndpoint.getDestination()) != null) { aMessage.setJMSReplyTo((Destination) destination); aMessage.setStringProperty(UIMAMessage.ServerURI, anEndpoint.getServerURI()); } else { aMessage.setStringProperty(UIMAMessage.ServerURI, protocol); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "populateHeaderWithRequestContext", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_sending_new_msg_to_remote_FINE", new Object[] { getAnalysisEngineController().getComponentName(), anEndpoint.getServerURI(), anEndpoint.getEndpoint() }); } } else // collocated { aMessage.setStringProperty(UIMAMessage.ServerURI, anEndpoint.getServerURI()); } } } /** * Adds Response specific properties to the JMS Header * * @param aMessage * @param anEndpoint * @param aCommand * @throws Exception */ private void populateHeaderWithResponseContext(Message aMessage, Endpoint anEndpoint, int aCommand) throws Exception { aMessage.setIntProperty(AsynchAEMessage.MessageType, AsynchAEMessage.Response); aMessage.setIntProperty(AsynchAEMessage.Command, aCommand); aMessage.setStringProperty(AsynchAEMessage.MessageFrom, serviceInputEndpoint); if (anEndpoint.isRemote()) { aMessage.setStringProperty(UIMAMessage.ServerURI, getServerURI()); if (hostIP != null) { aMessage.setStringProperty(AsynchAEMessage.ServerIP, hostIP); } if (anEndpoint.getEndpointServer() != null) { aMessage.setStringProperty(AsynchAEMessage.EndpointServer, anEndpoint.getEndpointServer()); } } else { aMessage.setStringProperty(UIMAMessage.ServerURI, anEndpoint.getServerURI()); } } public AnalysisEngineController getAnalysisEngineController() { return analysisEngineController; } public void setController(AnalysisEngineController analysisEngineController) { this.analysisEngineController = analysisEngineController; controllerLatch.countDown(); } public String getControllerInputEndpoint() { return controllerInputEndpoint; } public void setControllerInputEndpoint(String controllerInputEndpoint) { this.controllerInputEndpoint = controllerInputEndpoint; } private void dispatch(Message aMessage, Endpoint anEndpoint, CacheEntry entry, boolean isRequest, JmsEndpointConnection_impl endpointConnection, long msgSize) throws Exception { // Add stats populateStats(aMessage, anEndpoint, entry.getCasReferenceId(), AsynchAEMessage.Process, isRequest); // If this is a reply to a client, use the same broker URL that manages this service input queue. // Otherwise this is a request so use a broker specified in the endpoint object. String brokerConnectionURL = (anEndpoint.isReplyEndpoint()) ? serverURI : anEndpoint.getServerURI(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "dispatch", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_sending_new_msg_to_remote_FINE", new Object[] { getAnalysisEngineController().getName(), brokerConnectionURL, endpointConnection.getEndpoint() }); } // By default start a timer associated with a connection to the endpoint. Once a connection is // established with an // endpoint it is cached and reused for subsequent messaging. If the connection is not used // within a given interval // the timer silently expires and closes the connection. This mechanism is similar to what Web // Server does when // managing sessions. In case when we want the remote delegate to respond to a temporary queue, // which is implied // by anEndpoint.getDestination != null, we dont start the timer. boolean startConnectionTimer = isRequest ? false : true; // connection time is for replies // ---------------------------------------------------- // Send Request Messsage to the Endpoint // ---------------------------------------------------- // Add the CAS to the delegate's list of CASes pending reply. Do the add before // the send to eliminate a race condition where the reply is received (on different // thread) *before* the CAS is added to the list. if (isRequest) { anEndpoint.setWaitingForResponse(true); // Add CAS to the list of CASes pending reply addCasToOutstandingList(entry, isRequest, anEndpoint.getDelegateKey()); } else { addIdleTime(aMessage); } // If the send fails it returns false. if (endpointConnection.send(aMessage, msgSize, startConnectionTimer) == false) { // Failure on sending a request requires cleanup that includes stopping a listener // on the delegate that we were unable to send a message to. The delegate state is // set to FAILED. If there are retries or more CASes to send to this delegate the // connection will be retried. if (isRequest && anEndpoint.getDelegateKey() != null) { // Spin recovery thread to handle send error. After the recovery thread // is started the current (process) thread goes back to a thread pool in // ThreadPoolExecutor. The recovery thread can than stop the listener and the // ThreadPoolExecutor since all threads are back in the pool. Any retries will // be done in the recovery thread. RecoveryThread recoveryThread = new RecoveryThread(this, anEndpoint, entry, isRequest, getAnalysisEngineController()); Thread t = new Thread(Thread.currentThread().getThreadGroup().getParent(), recoveryThread); t.start(); } else { try { CasStateEntry casStateEntry = getAnalysisEngineController(). getLocalCache().lookupEntry(entry.getCasReferenceId()); casStateEntry.setDeliveryToClientFailed(); // Mark the CAS, so that later we know that the delivery to client failed if ( anEndpoint != null ) { // Add the reply destination (temp queue) to a dead client map Object clientDestination = anEndpoint.getDestination(); if ( clientDestination != null && clientDestination instanceof TemporaryQueue ) { if ( !getAnalysisEngineController(). getDeadClientMap().containsKey(clientDestination.toString())) { getAnalysisEngineController(). getDeadClientMap(). put(clientDestination.toString(),clientDestination.toString()); } } } } catch( Exception e ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "dispatch", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.INFO, CLASS_NAME.getName(), "dispatch", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_send_reply_failed__INFO", new Object[] { getAnalysisEngineController().getComponentName(), brokerConnectionURL, endpointConnection.getEndpoint() }); } } } } private void sendCasToRemoteEndpoint(boolean isRequest, Object aSerializedCAS, CacheEntry entry, Endpoint anEndpoint, boolean startTimer) throws AsynchAEException, ServiceShutdownException { CasStateEntry casStateEntry = null; long msgSize = 0; try { if (aborting) { return; } // If this is a reply to a client, use the same broker URL that manages this service input queue. // Otherwise this is a request so use a broker specified in the endpoint object. String brokerConnectionURL = (anEndpoint.isReplyEndpoint()) ? serverURI : anEndpoint.getServerURI(); casStateEntry = getAnalysisEngineController().getLocalCache().lookupEntry( entry.getCasReferenceId()); if (casStateEntry == null) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.WARNING, CLASS_NAME.getName(), "sendCasToRemoteDelegate", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_unable_to_send_reply__WARNING", new Object[] { getAnalysisEngineController().getComponentName(), anEndpoint.getDestination(), brokerConnectionURL, entry.getInputCasReferenceId() == null ? "" : entry.getInputCasReferenceId(), entry.getCasReferenceId(), 0, new Exception("Unable to lookup entry in Local Cache for a given Cas Id") }); return; } // Get the connection object for a given endpoint JmsEndpointConnection_impl endpointConnection = getEndpointConnection(anEndpoint); if (!endpointConnection.isOpen()) { if (!isRequest) { return; } } Message tm = null; try { if ( anEndpoint.getSerializer().equals("xmi")) { tm = endpointConnection.produceTextMessage((String)aSerializedCAS); if (aSerializedCAS != null) { msgSize = ((String)aSerializedCAS).length(); } tm.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.XMIPayload); } else { // Create empty JMS Bytes Message tm = endpointConnection.produceByteMessage((byte[])aSerializedCAS); if (aSerializedCAS != null) { msgSize = ((byte[])aSerializedCAS).length; } tm.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.BinaryPayload); } } catch (AsynchAEException ex) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.WARNING, CLASS_NAME.getName(), "sendCasToRemoteDelegate", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_unable_to_send_reply__WARNING", new Object[] { getAnalysisEngineController().getComponentName(), anEndpoint.getDestination(), brokerConnectionURL, entry.getInputCasReferenceId() == null ? "" : entry.getInputCasReferenceId(), entry.getCasReferenceId(), 0, ex }); return; } // Add Cas Reference Id to the outgoing JMS Header tm.setStringProperty(AsynchAEMessage.CasReference, entry.getCasReferenceId()); // Add common properties to the JMS Header if (isRequest == true) { populateHeaderWithRequestContext(tm, anEndpoint, AsynchAEMessage.Process); } else { populateHeaderWithResponseContext(tm, anEndpoint, AsynchAEMessage.Process); tm.setBooleanProperty(AsynchAEMessage.SentDeltaCas, entry.sentDeltaCas()); } // The following is true when the analytic is a CAS Multiplier if (casStateEntry.isSubordinate() && !isRequest) { // Override MessageType set in the populateHeaderWithContext above. // Make the reply message look like a request. This message will contain a new CAS // produced by the CAS Multiplier. The client will treat this CAS // differently from the input CAS. tm.setIntProperty(AsynchAEMessage.MessageType, AsynchAEMessage.Request); isRequest = true; // Save the id of the parent CAS tm.setStringProperty(AsynchAEMessage.InputCasReference, getTopParentCasReferenceId(entry .getCasReferenceId())); // Add a sequence number assigned to this CAS by the controller tm.setLongProperty(AsynchAEMessage.CasSequence, entry.getCasSequence()); // If this is a Cas Multiplier, add a reference to a special queue where // the client sends Free Cas Notifications if (freeCASTempQueue != null) { // Attach a temp queue to the outgoing message. This is a queue where // Free CAS notifications need to be sent from the client tm.setJMSReplyTo(freeCASTempQueue); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINE)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.FINE, CLASS_NAME.getName(), "sendCasToRemoteEndpoint", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_send_cas_to_collocated_service_detail__FINE", new Object[] { getAnalysisEngineController().getComponentName(), "Remote", anEndpoint.getEndpoint(), entry.getCasReferenceId(), entry.getInputCasReferenceId(), entry.getInputCasReferenceId() }); } } dispatch(tm, anEndpoint, entry, isRequest, endpointConnection, msgSize); } catch (JMSException e) { // Unable to establish connection to the endpoint. Logit and continue if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "sendCasToRemoteDelegate", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_unable_to_connect__INFO", new Object[] { getAnalysisEngineController().getName(), anEndpoint.getEndpoint() }); } } catch (ServiceShutdownException e) { throw e; } catch (AsynchAEException e) { throw e; } catch (Exception e) { throw new AsynchAEException(e); } } private Delegate lookupDelegate(String aDelegateKey) { if (getAnalysisEngineController() instanceof AggregateAnalysisEngineController) { Delegate delegate = ((AggregateAnalysisEngineController) getAnalysisEngineController()) .lookupDelegate(aDelegateKey); return delegate; } return null; } private void addCasToOutstandingList(CacheEntry entry, boolean isRequest, String aDelegateKey) { Delegate delegate = null; if (isRequest && (delegate = lookupDelegate(aDelegateKey)) != null) { delegate.addCasToOutstandingList(entry.getCasReferenceId()); } } private void removeCasFromOutstandingList(CacheEntry entry, boolean isRequest, String aDelegateKey) { Delegate delegate = null; if (isRequest && (delegate = lookupDelegate(aDelegateKey)) != null) { delegate.removeCasFromOutstandingList(entry.getCasReferenceId()); } } private String getTopParentCasReferenceId(String casReferenceId) throws Exception { if (!getAnalysisEngineController().getLocalCache().containsKey(casReferenceId)) { return null; } CasStateEntry casStateEntry = getAnalysisEngineController().getLocalCache().lookupEntry( casReferenceId); if (casStateEntry.isSubordinate()) { // Recurse until the top CAS reference Id is found return getTopParentCasReferenceId(casStateEntry.getInputCasReferenceId()); } // Return the top ancestor CAS id return casStateEntry.getCasReferenceId(); } private void addIdleTime(Message aMessage) { long t = System.nanoTime(); getAnalysisEngineController().saveReplyTime(t, ""); } public void stop() { stop(Channel.CloseAllChannels); } public void stop(int channelsToClose) { aborting = true; try { // Fetch iterator over all Broker Connections. This service may be connected // to many brokers. Each broker connection may handle multiple sessions to // different reply queues Iterator it = connectionMap.keySet().iterator(); JmsEndpointConnection_impl endpointConnection = null; // iterate over connections while (it.hasNext()) { // The key is the broker URL String key = (String) it.next(); // Fetch a connection object for a given URL Object value = connectionMap.get(key); if (value instanceof BrokerConnectionEntry) { BrokerConnectionEntry brokerConnectionEntry = (BrokerConnectionEntry) value; // A connection object may have many endpoint objects. There is a separate // endpoint object per reply queue. Iterator replyEndpointIterator = brokerConnectionEntry.endpointMap.keySet().iterator(); // Iterate over endpoints, each representing a reply queue while (replyEndpointIterator.hasNext()) { // Get endpoint object for a reply queue. The abort() call below // just closes a session and a producer. The JMS Connection is closed // outside of this while-loop when we clean up all the sessions. endpointConnection = brokerConnectionEntry.endpointMap .get(replyEndpointIterator.next()); // Close the session and the producer endpointConnection.abort(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.INFO, CLASS_NAME.getName(), "stop", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_forced_endpoint_close__INFO", new Object[] { getAnalysisEngineController().getName(), endpointConnection.getEndpoint(), endpointConnection.getServerUri() }); } } // Cancel any pending timers and finally close the JMS Connection to the // broker if (brokerConnectionEntry != null) { if (brokerConnectionEntry.getConnectionTimer() != null) { brokerConnectionEntry.getConnectionTimer().cancelTimer(); } if (brokerConnectionEntry.getConnection() != null) { try { brokerConnectionEntry.getConnection().close(); } catch (Exception ex) { /* ignore, we are stopping */ } } } } } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "stop", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_output_channel_aborted__INFO", new Object[] { getAnalysisEngineController().getName() }); } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "sendReply", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", getAnalysisEngineController().getComponentName()); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "stop", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } public void cancelTimers() { if (connectionMap.size() > 0) { Iterator it = connectionMap.keySet().iterator(); while (it.hasNext()) { String key = it.next(); BrokerConnectionEntry ce = (BrokerConnectionEntry) connectionMap.get(key); if (ce != null && ce.getConnectionTimer() != null) { ce.getConnectionTimer().cancelTimer(); } } } } public static class BrokerConnectionEntry { private String brokerURL; private Connection connection; private ConnectionTimer connectionTimer; Map endpointMap = new ConcurrentHashMap(); public String getBrokerURL() { return brokerURL; } public void setConnectionTimer(ConnectionTimer aConnectionTimer) { connectionTimer = aConnectionTimer; } public ConnectionTimer getConnectionTimer() { return connectionTimer; } public void setBrokerURL(String brokerURL) { this.brokerURL = brokerURL; } public Connection getConnection() { return connection; } public void setConnection(Connection connection) { this.connection = connection; } public void addEndpointConnection(Object key, JmsEndpointConnection_impl endpointConnection) { endpointMap.put(key, endpointConnection); } public JmsEndpointConnection_impl getEndpointConnection(Object key) { return endpointMap.get(key); } public boolean endpointExists(Object key) { return endpointMap.containsKey(key); } public void removeEndpoint(Object key) { endpointMap.remove(key); } } protected class ConnectionTimer { private final Class CLASS_NAME = ConnectionTimer.class; private Timer timer; private long inactivityTimeout; private AnalysisEngineController controller; private BrokerConnectionEntry brokerDestinations; private long connectionCreationTimestamp; private String componentName = ""; public ConnectionTimer(BrokerConnectionEntry aBrokerDestinations) { brokerDestinations = aBrokerDestinations; } public void setInactivityTimeout(long anInactivityTimeout) { inactivityTimeout = anInactivityTimeout; } public void setAnalysisEngineController(AnalysisEngineController aController) { controller = aController; if (controller != null) { componentName = controller.getComponentName(); } } public void setConnectionCreationTimestamp(long aConnectionCreationTimestamp) { connectionCreationTimestamp = aConnectionCreationTimestamp; } public void startTimer(long aConnectionCreationTimestamp, final Endpoint endpoint) { startTimer(aConnectionCreationTimestamp, endpoint, inactivityTimeout, componentName); } public synchronized void startTimer(long aConnectionCreationTimestamp, final Endpoint endpoint, long currentInactivityTimeout, String aComponentName) { final long cachedConnectionCreationTimestamp = aConnectionCreationTimestamp; Date timeToRun = new Date(System.currentTimeMillis() + currentInactivityTimeout); if (timer != null) { timer.cancel(); } if (controller != null) { timer = new Timer("Controller:" + aComponentName + ":Reply TimerThread-:" + endpoint + ":" + System.nanoTime()); } else { timer = new Timer("Reply TimerThread-:" + endpoint + ":" + System.nanoTime()); } timer.schedule(new TimerTask() { public void run() { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.INFO, CLASS_NAME.getName(), "startTimer", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_inactivity_timer_expired__INFO", new Object[] { Thread.currentThread().getName(), componentName, inactivityTimeout, endpoint }); } if (connectionCreationTimestamp <= cachedConnectionCreationTimestamp) { try { if (brokerDestinations.getConnection() != null && !((ActiveMQConnection) brokerDestinations.getConnection()).isClosed()) { try { brokerDestinations.getConnection().stop(); brokerDestinations.getConnection().close(); brokerDestinations.setConnection(null); } catch (Exception e) { // Ignore this for now. Attempting to close connection that has been closed // Ignore we are shutting down } finally { for (Entry endpoints : brokerDestinations.endpointMap .entrySet()) { endpoints.getValue().close(); // close session and producer } // If this is a reply to a client, use the same broker URL that manages this service input queue. // Otherwise this is a request so use a broker specified in the endpoint object. String brokerConnectionURL = (endpoint.isReplyEndpoint()) ? serverURI : endpoint.getServerURI(); brokerDestinations.endpointMap.clear(); connectionMap.remove(brokerConnectionURL); } } brokerDestinations.setConnection(null); } catch (Exception e) { } finally { removeDestinationFromManagedList(brokerDestinations, endpoint); } } cancelTimer(); } }, timeToRun); } private void removeDestinationFromManagedList(BrokerConnectionEntry brokerDestinations, Endpoint endpoint) { // If this is a reply to a client, use the same broker URL that manages this service input queue. // Otherwise this is a request so use a broker specified in the endpoint object. String brokerConnectionURL = (endpoint.isReplyEndpoint()) ? serverURI : endpoint.getServerURI(); String key = endpoint.getEndpoint() + brokerConnectionURL; String destination = endpoint.getEndpoint(); if (endpoint.getDestination() != null && endpoint.getDestination() instanceof ActiveMQDestination) { destination = ((ActiveMQDestination) endpoint.getDestination()).getPhysicalName(); key = destination; } if (brokerDestinations.endpointExists(key)) { brokerDestinations.removeEndpoint(key); } } private void cancelTimer() { if (timer != null) { timer.cancel(); timer.purge(); } } public synchronized void stopTimer() { cancelTimer(); timer = null; } } private static class RecoveryThread implements Runnable { Endpoint endpoint; CacheEntry entry; boolean isRequest; AnalysisEngineController controller; JmsOutputChannel outputChannel; public RecoveryThread(JmsOutputChannel channel, Endpoint anEndpoint, CacheEntry anEntry, boolean isRequest, AnalysisEngineController aController) { endpoint = anEndpoint; entry = anEntry; controller = aController; this.isRequest = isRequest; outputChannel = channel; } public void run() { Delegate delegate = outputChannel.lookupDelegate(endpoint.getDelegateKey()); // Removes the failed CAS from the list of CASes pending reply. This also // cancels the timer if this CAS was the oldest pending CAS, and if there // are other CASes pending a fresh timer is started. outputChannel.removeCasFromOutstandingList(entry, isRequest, endpoint.getDelegateKey()); if (delegate != null) { // Mark this delegate as Failed delegate.getEndpoint().setStatus(Endpoint.FAILED); // Destroy listener associated with a reply queue for this delegate InputChannel ic = controller.getInputChannel(delegate.getEndpoint().getDestination() .toString()); if (ic != null && delegate != null && delegate.getEndpoint() != null) { ic.destroyListener(delegate.getEndpoint().getDestination().toString(), endpoint .getDelegateKey()); } // Setup error context and handle failure in the error handler ErrorContext errorContext = new ErrorContext(); errorContext.add(AsynchAEMessage.Command, AsynchAEMessage.Process); errorContext.add(AsynchAEMessage.CasReference, entry.getCasReferenceId()); errorContext.add(AsynchAEMessage.Endpoint, endpoint); errorContext.handleSilently(true); // dont dump exception to the log // Failure on send treat as timeout delegate.handleError(new MessageTimeoutException(), errorContext); } } } } ModifiableListener.java000066400000000000000000000020711160020716200343270ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import org.apache.uima.adapter.jms.activemq.UimaDefaultMessageListenerContainer; public interface ModifiableListener { public void setListener(UimaDefaultMessageListenerContainer aContainer); } SpringContainerDeployer.java000066400000000000000000000575251160020716200354150ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Semaphore; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.ActiveMQPrefetchPolicy; import org.apache.activemq.command.ActiveMQQueue; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.UIDGenerator; import org.apache.uima.aae.controller.AggregateAnalysisEngineController; import org.apache.uima.aae.controller.AnalysisEngineController; import org.apache.uima.aae.controller.Controller; import org.apache.uima.aae.controller.ControllerCallbackListener; import org.apache.uima.aae.controller.ControllerLifecycle; import org.apache.uima.aae.controller.Endpoint; import org.apache.uima.aae.controller.UimacppServiceController; import org.apache.uima.aae.controller.BaseAnalysisEngineController.ServiceState; import org.apache.uima.aae.delegate.Delegate; import org.apache.uima.aae.jmx.ServicePerformance; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import org.springframework.jms.support.destination.DestinationResolver; public class SpringContainerDeployer implements ControllerCallbackListener { private static final Class CLASS_NAME = SpringContainerDeployer.class; private static final int MAX_PREFETCH_FOR_CAS_NOTIFICATION_Q = 10; public static final int QUIESCE_AND_STOP = 1000; public static final int STOP_NOW = 1001; private volatile boolean serviceInitializationCompleted; private volatile boolean serviceInitializationException; private Semaphore serviceInitializationSemaphore = new Semaphore(1); private ConcurrentHashMap springContainerRegistry = null; private FileSystemXmlApplicationContext context = null; private Object mux = new Object(); private AnalysisEngineController topLevelController = null; public SpringContainerDeployer() { } public SpringContainerDeployer(ConcurrentHashMap aSpringContainerRegistry) { springContainerRegistry = aSpringContainerRegistry; } private UimaDefaultMessageListenerContainer produceListenerConnector(ActiveMQConnectionFactory cf, AnalysisEngineController ctrl) { DestinationResolver resolver = new TempDestinationResolver(); UimaDefaultMessageListenerContainer connector = new UimaDefaultMessageListenerContainer(true); connector.setConnectionFactory(cf); connector.setConcurrentConsumers(1); connector.setDestinationResolver(resolver); connector.setController(ctrl); connector.setMessageListener(((JmsInputChannel) ctrl.getInputChannel())); connector.initializeContainer(); connector.getDestination(); connector.afterPropertiesSet(false); connector.start(); synchronized (mux) { while (connector.getListenerEndpoint() == null) { try { mux.wait(50); } catch (InterruptedException e) { } } } return connector; } private ActiveMQConnectionFactory getTopLevelQueueConnectionFactory(ApplicationContext ctx) { ActiveMQConnectionFactory factory = null; String[] inputChannelBeanIds = ctx .getBeanNamesForType(org.apache.uima.adapter.jms.activemq.JmsInputChannel.class); String beanId = null; for (int i = 0; i < inputChannelBeanIds.length; i++) { JmsInputChannel inputChannel = (JmsInputChannel) ctx.getBean(inputChannelBeanIds[i]); if (inputChannel.getName().startsWith("top_level_input_queue_service")) { while ((factory = ((JmsInputChannel) inputChannel).getConnectionFactory()) == null) { try { Thread.currentThread().sleep(50); } catch (Exception e) { } } break; } } return factory; } private ActiveMQPrefetchPolicy getPrefetchPolicy(int aPrefetchSize) { ActiveMQPrefetchPolicy prefetchPolicy = new ActiveMQPrefetchPolicy(); prefetchPolicy.setQueuePrefetch(aPrefetchSize); return prefetchPolicy; } private ActiveMQConnectionFactory getNewConnectionFactory(ApplicationContext ctx) throws Exception { ActiveMQConnectionFactory factory = getTopLevelQueueConnectionFactory(ctx); if (factory != null) { String brokerURL = factory.getBrokerURL(); factory = new ActiveMQConnectionFactory(brokerURL); } return factory; } private int getConcurrentConsumerCount(ApplicationContext ctx) { String[] listenerBeanIds = ctx .getBeanNamesForType(org.apache.uima.adapter.jms.activemq.UimaDefaultMessageListenerContainer.class); String beanId = null; int concurrentConsumerCount = -1; for (int i = 0; i < listenerBeanIds.length; i++) { UimaDefaultMessageListenerContainer lsnr = (UimaDefaultMessageListenerContainer) ctx .getBean(listenerBeanIds[i]); if (lsnr.getDestinationName().startsWith("asynAggr_retQ")) { return lsnr.getConcurrentConsumers(); } } return -1; } public AnalysisEngineController getTopLevelController() { return topLevelController; } private void initializeTopLevelController(AnalysisEngineController cntlr, ApplicationContext ctx) throws Exception { ((FileSystemXmlApplicationContext) ctx).setDisplayName(cntlr.getComponentName()); cntlr.addControllerCallbackListener(this); String inputQueueName = cntlr.getServiceEndpointName(); if (inputQueueName != null) { if (ctx.containsBean(inputQueueName)) { ActiveMQQueue queue = (ActiveMQQueue) ctx.getBean(inputQueueName); if (cntlr.getServiceInfo() != null) { cntlr.getServiceInfo().setInputQueueName(queue.getQueueName()); } } else { if (cntlr.getServiceInfo() != null) { cntlr.getServiceInfo().setInputQueueName(inputQueueName); } } } // If this is a Cas Multiplier add a special temp queue for receiving Free CAS // notifications. if (cntlr.isCasMultiplier()) { ActiveMQConnectionFactory cf = getNewConnectionFactory(ctx); // getTopLevelQueueConnectionFactory( // ctx ); ActiveMQPrefetchPolicy prefetchPolicy = getPrefetchPolicy(MAX_PREFETCH_FOR_CAS_NOTIFICATION_Q); cf.setPrefetchPolicy(prefetchPolicy); // Create a listener and a temp queue for Free CAS notifications. UimaDefaultMessageListenerContainer connector = produceListenerConnector(cf,cntlr); // Direct all messages to the InputChannel //connector.setMessageListener(((JmsInputChannel) cntlr.getInputChannel())); ((JmsInputChannel) cntlr.getInputChannel()).setListenerContainer(connector); // Save the temp queue reference in the Output Channel. The output channel will // add this queue to every outgoing message containing a CAS generated by the // Cas Multiplier. ((JmsOutputChannel) cntlr.getOutputChannel()) .setFreeCasQueue(connector.getListenerEndpoint()); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.CONFIG, CLASS_NAME.getName(), "initializeTopLevelController", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_activated_fcq__CONFIG", new Object[] { cntlr.getComponentName(), connector.getEndpointName() }); } } if (cntlr instanceof AggregateAnalysisEngineController) { // Get a map of delegates for the top level aggregate Map destinationMap = ((AggregateAnalysisEngineController) cntlr).getDestinations(); Set set = destinationMap.entrySet(); // iterate over endpoints (delegates) to find those that // need to reply to a temp queue. for (Iterator it = set.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); Endpoint endpoint = (Endpoint) entry.getValue(); // Will this endpoint reply to a temp queue if (endpoint != null && endpoint.isTempReplyDestination()) { // block here until the Resolver creates a temp // queue and the endpoint initialization is // complete. When the resolver creates a temp quee it will // notify a listener container with a reference // to the temp queue. The listener container will in // turn call setDestination on the endpoint to inject // the destination object ( a temp queue) for the // delegate to reply to. while (!endpoint.replyDestinationFailed() && endpoint.getDestination() == null) { synchronized (endpoint) { try { endpoint.wait(200); } catch (InterruptedException e) { } } } Delegate delegate = ((AggregateAnalysisEngineController) cntlr) .lookupDelegate(endpoint.getDelegateKey()); int cc = 1; if (delegate != null) { cc = delegate.getEndpoint().getConcurrentReplyConsumers(); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "initializeTopLevelController", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_replyq__INFO", new Object[] { endpoint.getDelegateKey(), endpoint.getDestination(), cc }); } } } int concurrentConsumerCountOnReplies = getConcurrentConsumerCount(ctx); // Configure and initialize vm transport in the top level aggregate. // The aggregate will initialize all delegates with the vm transport. ((AggregateAnalysisEngineController) cntlr) .initializeVMTransport(concurrentConsumerCountOnReplies); // Complete initialization of the aggregate by sending // getMeta requests to // all remote delegates (if any). Collocated delegates // have already // returned their metadata to the aggregate. ((AggregateAnalysisEngineController) cntlr).sendRequestForMetadataToRemoteDelegates(); } } private String initializeContainer(ApplicationContext ctx) throws Exception { serviceInitializationCompleted = false; serviceInitializationException = false; // Wrap Spring context UimaEEAdminSpringContext springAdminContext = new UimaEEAdminSpringContext( (FileSystemXmlApplicationContext) ctx); // Find all deployed Controllers String[] controllers = ctx .getBeanNamesForType(org.apache.uima.aae.controller.AnalysisEngineController.class); for (int i = 0; controllers != null && i < controllers.length; i++) { AnalysisEngineController cntlr = (AnalysisEngineController) ctx.getBean(controllers[i]); if (cntlr instanceof org.apache.uima.aae.controller.UimacppServiceController) { cntlr.addControllerCallbackListener(this); topLevelController = cntlr; } else { // Pass a reference to the context to each of the Controllers cntlr.setUimaEEAdminContext(springAdminContext); if (cntlr.isTopLevelComponent()) { topLevelController = cntlr; initializeTopLevelController(cntlr, ctx); } } } // grab the semaphore so that waitForServiceInitialization() blocks until the // semaphore is released. try { serviceInitializationSemaphore.acquire(); } catch (InterruptedException e) { } try { // blocks until the top level controller sends a notification. // Notification is send // when either the controller successfully initialized or it failed // during initialization waitForServiceNotification(); // success, the service initialized startListeners(); } catch (Exception e) { // Query the container for objects that implement // ControllerLifecycle interface. These // objects are typically of type AnalysisEngineController or // UimacppServiceController. String[] asyncServiceList = ctx .getBeanNamesForType(org.apache.uima.aae.controller.ControllerLifecycle.class); // Given a valid list of controllers select the first from the list // and // initiate a shutdown. We don't care which controller will be // invoked. In case of // AggregateAnalysisEngineController the terminate event will // propagate all the way // to the top controller in the hierarchy and the shutdown will take // place from there. // If the controller is of kind UimecppServiceController or // PrimitiveAnalysisController // the termination logic will be immediately triggered in the // terminate() method. if (asyncServiceList != null && asyncServiceList.length > 0) { ControllerLifecycle ctrer = (ControllerLifecycle) ctx.getBean(asyncServiceList[0]); // Send a trigger to initiate shutdown. if (ctrer instanceof AnalysisEngineController) { ((AnalysisEngineController) ctrer).getControllerLatch().release(); } ctrer.terminate(); } if (ctx instanceof FileSystemXmlApplicationContext) { ((FileSystemXmlApplicationContext) ctx).destroy(); } throw e; } String containerId = new UIDGenerator().nextId(); if (springContainerRegistry != null) { // Register each container in a global map. When stopping the // client, each container in the map will be stopped. springContainerRegistry.put(containerId, springAdminContext); } return containerId; } /** * Starts Spring listeners on input queues. These listeners are not auto started * during initialization. Only after successful service initialization these listeners are * activated. * * @param listeners - list of listeners to start * @param ctx - spring context * @throws Exception */ private void doStartListeners(String[] listeners, FileSystemXmlApplicationContext ctx ) throws Exception { for (int i = 0; listeners != null && i < listeners.length; i++) { UimaDefaultMessageListenerContainer listener = (UimaDefaultMessageListenerContainer) ctx.getBean(listeners[i]); // Only start those listeners that are not running yet. if ( listener != null && !listener.isRunning()) { if ( topLevelController != null ) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "doStartListeners", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_starting_listener__INFO", new Object[] { topLevelController.getComponentName(), listener.getDestination(), listener.getMessageSelector(), listener.getBrokerUrl() }); } topLevelController.changeState(ServiceState.RUNNING); } listener.start(); } } } public void startListeners() throws Exception { if ( springContainerRegistry == null || springContainerRegistry.size() == 0) { if ( context != null ) { String[] listeners = context .getBeanNamesForType(org.apache.uima.adapter.jms.activemq.UimaDefaultMessageListenerContainer.class); doStartListeners(listeners, context); } } else { Iterator registryIterator = springContainerRegistry.keySet().iterator(); while( registryIterator.hasNext()) { String id = (String)registryIterator.next(); UimaEEAdminSpringContext springAdminContext = (UimaEEAdminSpringContext)springContainerRegistry.get(id); if ( springAdminContext != null ) { FileSystemXmlApplicationContext ctx = (FileSystemXmlApplicationContext)springAdminContext.getSpringContainer(); if ( ctx != null ) { String[] listeners = ctx .getBeanNamesForType(org.apache.uima.adapter.jms.activemq.UimaDefaultMessageListenerContainer.class); doStartListeners(listeners, ctx); } } } } } public String deploy(String springContextFile) throws ResourceInitializationException { if (springContextFile == null) { throw new ResourceInitializationException(new Exception("Spring Context File Not Specified")); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.CONFIG, CLASS_NAME.getName(), "deploy", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_deploy_container__CONFIG", new Object[] { springContextFile }); } try { // Deploy beans in the Spring container. Although the deployment is // synchronous ( one bean at a time), some beans run in a separate // threads. The completion of container deployment doesnt // necessarily mean that all beans have initialized completely. if (!springContextFile.startsWith("file:")) { springContextFile = "file:" + springContextFile; } context = new FileSystemXmlApplicationContext(springContextFile); return initializeContainer(context); } catch (ResourceInitializationException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "deploy", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } throw e; } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "deploy", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } throw new ResourceInitializationException(e); } } public String deploy(String[] springContextFiles) throws ResourceInitializationException { if (springContextFiles == null) { throw new ResourceInitializationException(new Exception("Spring Context File List is Empty")); } // Log context files for (int i = 0; i < springContextFiles.length; i++) { if (!springContextFiles[i].startsWith("file:")) { springContextFiles[i] = "file:" + springContextFiles[i]; } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.CONFIG, CLASS_NAME.getName(), "deploy", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_deploy_container__CONFIG", new Object[] { springContextFiles[i] }); } } try { // Deploy beans in the Spring container. Although the deployment is // synchronous ( one bean at a time), some beans run in a separate // threads. The completion of container deployment doesnt // necessarily mean that all beans have initialized completely. context = new FileSystemXmlApplicationContext(springContextFiles); return initializeContainer(context); } catch (ResourceInitializationException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "deploy", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } throw e; } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "deploy", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } throw new ResourceInitializationException(e); } } public void undeploy(int stop_level) throws Exception { switch (stop_level) { case QUIESCE_AND_STOP: getTopLevelController().quiesceAndStop(); break; case STOP_NOW: getTopLevelController().terminate(); break; default: throw new UnsupportedOperationException( "Unsupported argument value in the undeploy() call. Please use stop level " + QUIESCE_AND_STOP + " OR " + STOP_NOW + " as an argument to undeploy() method."); } // Close Spring context. if ( context != null ) { context.stop(); } } protected void waitForServiceNotification() throws Exception { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "waitForServiceNotification", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_awaiting_container_init__INFO", new Object[] {}); } try { serviceInitializationSemaphore.acquire(); } catch (InterruptedException e) { } finally { serviceInitializationSemaphore.release(); } if (serviceInitializationException) { throw new ResourceInitializationException(new Exception("Details of failure(s) written to UIMA log")); } } public void notifyOnInitializationFailure(AnalysisEngineController aController, Exception e) { // Initialization exception. Notify blocking thread and indicate a // problem serviceInitializationException = true; if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "notifyOnInitializationFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_container_init_exception__WARNING", e); } serviceInitializationSemaphore.release(); } public void notifyOnInitializationSuccess(AnalysisEngineController aController) { serviceInitializationCompleted = true; serviceInitializationSemaphore.release(); } public void notifyOnInitializationFailure(Exception e) { notifyOnInitializationFailure(null, e); } public void notifyOnInitializationSuccess() { notifyOnInitializationSuccess(null); } public void notifyOnTermination(String message) { } public FileSystemXmlApplicationContext getSpringContext() { return context; } public boolean isInitialized() { return serviceInitializationCompleted; } public boolean initializationFailed() { return serviceInitializationException; } public void notifyOnTermination(String aServiceName, String aCasReferenceId, Exception cause) { // TODO Auto-generated method stub } public void notifyOnReconnecting(String aMessage) { } public void notifyOnReconnectionSuccess() { } } TempDestinationResolver.java000066400000000000000000000045121160020716200354210ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; import org.springframework.jms.support.destination.DestinationResolver; public class TempDestinationResolver implements DestinationResolver { private UimaDefaultMessageListenerContainer listener; private Destination destination = null; private Object mutex = new Object(); /** * This method is called by the Spring listener code. It creates a single temp queue for all * listener instances. If the Spring listener is configured with more than one concurrentConsumer, * this method will be called more than once. The temp queue is created only once and cached on * the first call. Subsequent requests receive the same queue. */ public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException { synchronized (mutex) { if (destination == null) { destination = session.createTemporaryQueue(); if (listener != null) { listener.setDestination(destination); } } } return destination; } public void setListener(UimaDefaultMessageListenerContainer aListener) { listener = aListener; } /** * called from Spring during initialization * * @param aFactory */ public void setConnectionFactory(ActiveMQConnectionFactory aFactory) { } } UimaDefaultMessageListenerContainer.java000066400000000000000000001272201160020716200376500ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import java.net.ConnectException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.ExceptionListener; import javax.jms.JMSException; import javax.jms.TemporaryQueue; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.command.ActiveMQDestination; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.InputChannel; import org.apache.uima.aae.UIMAEE_Constants; import org.apache.uima.aae.UimaAsThreadFactory; import org.apache.uima.aae.controller.AggregateAnalysisEngineController; import org.apache.uima.aae.controller.AnalysisEngineController; import org.apache.uima.aae.controller.BaseAnalysisEngineController.ServiceState; import org.apache.uima.aae.controller.Endpoint; import org.apache.uima.aae.controller.PrimitiveAnalysisEngineController; import org.apache.uima.aae.delegate.Delegate; import org.apache.uima.aae.error.ErrorHandler; import org.apache.uima.aae.error.Threshold; import org.apache.uima.aae.error.handler.GetMetaErrorHandler; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; import org.springframework.core.task.TaskExecutor; import org.springframework.jms.JmsException; import org.springframework.jms.listener.AbstractJmsListeningContainer; import org.springframework.jms.listener.DefaultMessageListenerContainer; import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; public class UimaDefaultMessageListenerContainer extends DefaultMessageListenerContainer implements ExceptionListener { private static final Class CLASS_NAME = UimaDefaultMessageListenerContainer.class; private String destinationName = ""; private Endpoint endpoint; private volatile boolean freeCasQueueListener; private AnalysisEngineController controller; private volatile boolean failed = false; private Object mux = new Object(); private final UimaDefaultMessageListenerContainer __listenerRef; private TaskExecutor taskExecutor = null; private ConnectionFactory connectionFactory = null; private Object mux2 = new Object(); private ThreadGroup threadGroup = null; private ThreadFactory tf = null; // stores number of consumer threads private int cc = 0; // stores message listener plugged in by Spring private Object ml = null; // A new listener will be injected between // spring and JmsInputChannel Pojo Listener. This // listener purpose is to increment number of children for // an input CAS. private ConcurrentMessageListener concurrentListener = null; private volatile boolean awaitingShutdown = false; // When set to true, this flag prevents spring from using refreshUntilSuccessful // logic which attempts to recover the connection. This flag is set to true during the // service shutdown public static volatile boolean terminating; private ThreadPoolExecutor threadPoolExecutor = null; private boolean pluginThreadPool; public UimaDefaultMessageListenerContainer() { super(); // reset global static. This only effects unit testing as services are deployed // in the same process. terminating = false; UIMAFramework.getLogger(CLASS_NAME).setLevel(Level.WARNING); __listenerRef = this; setRecoveryInterval(5); setAcceptMessagesWhileStopping(false); setExceptionListener(this); threadGroup = new ThreadGroup("ListenerThreadGroup_" + Thread.currentThread().getThreadGroup().getName()); } public UimaDefaultMessageListenerContainer(boolean freeCasQueueListener) { this(); this.freeCasQueueListener = freeCasQueueListener; } /** * Overriden Spring's method that tries to recover from lost connection. We dont * want to recover when the service is stopping. */ protected void refreshConnectionUntilSuccessful() { if ( !terminating ) { super.refreshConnectionUntilSuccessful(); } } protected void recoverAfterListenerSetupFailure() { if ( !terminating ) { super.recoverAfterListenerSetupFailure(); } } public void setTerminating() { terminating = true; } public void setController(AnalysisEngineController aController) { controller = aController; } /** * * @param t * @return */ private boolean disableListener(Throwable t) { if (t.toString().indexOf("SharedConnectionNotInitializedException") > 0 || (t instanceof JMSException && t.getCause() != null && t.getCause() instanceof ConnectException)) return true; return false; } /** * Stops this Listener */ private void handleListenerFailure() { // If shutdown already, nothing to do if (awaitingShutdown) { return; } try { if (controller instanceof AggregateAnalysisEngineController) { String delegateKey = ((AggregateAnalysisEngineController) controller) .lookUpDelegateKey(endpoint.getEndpoint()); InputChannel iC = null; String queueName = null; if (endpoint.getDestination() != null) { queueName = endpoint.getDestination().toString(); } else { queueName = endpoint.getEndpoint(); } iC = ((AggregateAnalysisEngineController) controller).getInputChannel(queueName); if (iC != null) { iC.destroyListener(queueName, delegateKey); } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "handleTempQueueFailure", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_unable_to_lookup_input_channel__INFO", queueName); } } } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleListenerFailure", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleListenerFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } /** * Handles failure on a temp queue * * @param t */ private void handleTempQueueFailure(Throwable t) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleTempQueueFailure", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "handleTempQueueFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_jms_listener_failed_WARNING", new Object[] { endpoint.getDestination(), getBrokerUrl(), t }); } // Check if the failure is due to the failed connection. Spring (and ActiveMQ) dont seem to // provide // the cause. Just the top level IllegalStateException with a text message. This is what we need // to // check for. ActiveMQConnection conn = null; try { conn = (ActiveMQConnection)getSharedConnection(); } catch( Exception exx ) { // shared connection may not exist yet if a broker is not up } if ( (conn != null && conn.isTransportFailed() ) || t instanceof javax.jms.IllegalStateException && t.getMessage().equals("The Consumer is closed")) { if (controller != null && controller instanceof AggregateAnalysisEngineController) { String delegateKey = ((AggregateAnalysisEngineController) controller) .lookUpDelegateKey(endpoint.getEndpoint()); try { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.INFO, this.getClass().getName(), "handleTempQueueFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_stopping_listener_INFO", new Object[] { controller.getComponentName(), endpoint.getDestination(), delegateKey }); } // Stop current listener handleListenerFailure(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, this.getClass().getName(), "handleTempQueueFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_stopped_listener_INFO", new Object[] { controller.getComponentName(), endpoint.getDestination() }); } } } catch (Exception e) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleTempQueueFailure", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleTempQueueFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } else if (disableListener(t)) { handleQueueFailure(t); } } private ErrorHandler fetchGetMetaErrorHandler() { ErrorHandler handler = null; Iterator it = controller.getErrorHandlerChain().iterator(); // Find the error handler for GetMeta in the Error Handler List provided in the // deployment descriptor while (it.hasNext()) { handler = (ErrorHandler) it.next(); if (handler instanceof GetMetaErrorHandler) { return handler; } } return null; } /** * Handles failures on non-temp queues * * @param t */ private void handleQueueFailure(Throwable t) { final String endpointName = (getDestination() == null) ? "" : ((ActiveMQDestination) getDestination()).getPhysicalName(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "handleQueueFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_jms_listener_failed_WARNING", new Object[] { endpointName, getBrokerUrl(), t }); } boolean terminate = true; // Check if the failure is severe enough to disable this listener. Whether or not this listener // is actully // disabled depends on the action associated with GetMeta Error Handler. If GetMeta Error // Handler is // configured to terminate the service on failure, this listener will be terminated and the // entire service // will be stopped. if (disableListener(t)) { endpoint.setReplyDestinationFailed(); // If this is a listener attached to the Aggregate Controller, use GetMeta Error // Thresholds defined to determine what to do next after failure. Either terminate // the service or disable the delegate with which this listener is associated with if (controller != null && controller instanceof AggregateAnalysisEngineController) { ErrorHandler handler = fetchGetMetaErrorHandler(); // Fetch a Map containing thresholds for GetMeta for each delegate. Map thresholds = handler.getEndpointThresholdMap(); // Lookup delegate's key using delegate's endpoint name String delegateKey = ((AggregateAnalysisEngineController) controller) .lookUpDelegateKey(endpoint.getEndpoint()); // If the delegate has a threshold defined on GetMeta apply Action defined if (delegateKey != null && thresholds.containsKey(delegateKey)) { // Fetch the Threshold object containing error configuration Threshold threshold = (Threshold) thresholds.get(delegateKey); // Check if the delegate needs to be disabled if (threshold.getAction().equalsIgnoreCase(ErrorHandler.DISABLE)) { // The disable delegate method takes a list of delegates List list = new ArrayList(); // Add the delegate to disable to the list list.add(delegateKey); try { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME) .logrb( Level.INFO, this.getClass().getName(), "handleQueueFailure", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_disabled_delegate_bad_broker__INFO", new Object[] { controller.getComponentName(), delegateKey, getBrokerUrl() }); } // Remove the delegate from the routing table. ((AggregateAnalysisEngineController) controller).disableDelegates(list); terminate = false; // just disable the delegate and continue } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleQueueFailure", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleQueueFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } terminate = true; } } } } } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "handleQueueFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_closing_channel__WARNING", new Object[] { getBrokerUrl(), endpoint.getEndpoint(), }); } setRecoveryInterval(0); // Spin a shutdown thread to terminate listener. new Thread() { public void run() { try { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "handleQueueFailure.run", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_disable_listener__WARNING", new Object[] { endpointName, getBrokerUrl() }); } shutdown(); } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleQueueFailure.run", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleQueueFailure.run", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } }.start(); if (terminate) { terminate(t); } } /** * This method is called by Spring when a listener fails */ protected void handleListenerSetupFailure(Throwable t, boolean alreadyHandled) { // If shutdown already, nothing to do // If controller is stopping no need to recover the connection if (awaitingShutdown || terminating || (controller != null && controller.isStopped()) ) { return; } if ( controller != null ) { controller.changeState(ServiceState.FAILED); } // check if endpoint object has been initialized. If it is not // initialized, most likely the broker is not available and we // go into a silent re-connect retry. if (endpoint == null ) { super.handleListenerSetupFailure(t, true); String controllerId = ""; if (controller != null) { controllerId = "Uima AS Service:" + controller.getComponentName(); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "handleListenerSetupFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_listener_connection_failure__WARNING", new Object[] { controllerId, getBrokerUrl() }); } // Use Spring to retry connection until successful. This call is // blocking this thread. refreshConnectionUntilSuccessful(); if ( controller != null ) { controller.changeState(ServiceState.RUNNING); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "handleListenerSetupFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_listener_connection_recovered__WARNING", new Object[] { controllerId, getBrokerUrl() }); } return; } // Connection failure that occurs AFTER the service initialized. if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleListenerSetupFailure", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "handleListenerSetupFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", t); } synchronized (mux) { if (!failed) { // Check if this listener is attached to a temp queue. If so, this is a listener // on a reply queue. Handle temp queue listener failure differently than an // input queue listener. if (endpoint.isTempReplyDestination()) { handleTempQueueFailure(t); } else { // Handle non-temp queue failure handleQueueFailure(t); } } failed = true; } } private void terminate(Throwable t) { // **************************************** // terminate the service // **************************************** if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "terminate", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_terminate_service_dueto_bad_broker__WARNING", new Object[] { controller.getComponentName(), getBrokerUrl() }); } controller.notifyListenersWithInitializationStatus(new ResourceInitializationException(t)); if (!controller.isStopped() && !controller.isAwaitingCacheCallbackNotification()) { controller.stop(); } } protected void handleListenerException(Throwable t) { // Already shutdown, nothing to do if (awaitingShutdown) { return; } String endpointName = (getDestination() == null) ? "" : ((ActiveMQDestination) getDestination()).getPhysicalName(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "handleListenerException", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_jms_listener_failed_WARNING", new Object[] { endpointName, getBrokerUrl(), t }); } super.handleListenerException(t); } private void allPropertiesSet() { super.afterPropertiesSet(); } private void injectConnectionFactory() { while (connectionFactory == null) { try { Thread.sleep(50); } catch (Exception e) { } } super.setConnectionFactory(connectionFactory); } private void injectTaskExecutor() { super.setTaskExecutor(taskExecutor); } private boolean isGetMetaListener() { return getMessageSelector() != null && __listenerRef.getMessageSelector().equals("Command=2001"); } private boolean isActiveMQDestination() { return getDestination() != null && getDestination() instanceof ActiveMQDestination; } public void initializeContainer() { try { injectConnectionFactory(); super.initialize(); } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "initializeContainer", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "initializeContainer", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } /** * Intercept Spring call to increment number of consumer threads. If the value > 1, don't * propagate to Spring. A new listener will be injected and it will use provided number of * consumer threads. **/ public void setConcurrentConsumers(int concurrentConsumers) { cc = concurrentConsumers; if (this.freeCasQueueListener) { super.setConcurrentConsumers(concurrentConsumers); } } /** * Intercept Spring call to inject application Pojo listener. Don't propagate the listener up to * Spring just yet. If more than one consumer thread is used, a different listener will be * injected. **/ public void setMessageListener(Object messageListener) { ml = messageListener; if (this.freeCasQueueListener) { super.setMessageListener(messageListener); } } public void afterPropertiesSet() { afterPropertiesSet(true); } /** * Called by Spring and some Uima AS components when all properties have been set. This method * spins a thread in which the listener is initialized. */ public void afterPropertiesSet(final boolean propagate) { if (endpoint != null) { // Override the prefetch size. The dd2spring always sets this to 1 which // may effect the throughput of a service. Change the prefetch size to // number of consumer threads defined in DD. if ( cc > 1 && endpoint.isTempReplyDestination() && connectionFactory instanceof ActiveMQConnectionFactory ) { ((ActiveMQConnectionFactory)connectionFactory).getPrefetchPolicy().setQueuePrefetch(cc); } // Endpoint has been plugged in from spring xml. This means this is a listener // for a reply queue. We need to rewire things a bit. First make Spring use // one thread to make sure we receive messages in order. To fix a race condition // where a parent CAS is processed first instead of its last child, we need to // assure that we get the child first. We need to update the counter of the // parent CAS to reflect that there is another child. In the race condition that // was observed, the parent was being processed first in one thread. The parent // reached the final step and subsequently was dropped. Subsequent to that, a // child CAS processed on another thread begun executing and failed since a look // on its parent resulted in CAS Not Found In Cache Exception. // Make sure Spring uses one thread super.setConcurrentConsumers(1); if (cc > 1) { try { String prefix = endpoint.getDelegateKey()+" Reply Thread"; concurrentListener = new ConcurrentMessageListener(cc, ml, getDestinationName(), threadGroup,prefix); super.setMessageListener(concurrentListener); } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "afterPropertiesSet", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "afterPropertiesSet", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } return; } } else { pluginThreadPool = true; } } else { super.setConcurrentConsumers(cc); pluginThreadPool = true; } Thread t = new Thread(threadGroup, new Runnable() { public void run() { Destination destination = __listenerRef.getDestination(); try { // Wait until the connection factory is injected by Spring while (connectionFactory == null) { try { Thread.sleep(50); } catch (InterruptedException ex) { } } System.setProperty("BrokerURI", ((ActiveMQConnectionFactory) connectionFactory) .getBrokerURL()); boolean done = false; // Wait for controller to be injected by Uima AS if (isActiveMQDestination() && !isGetMetaListener() && !((ActiveMQDestination) destination).isTemporary()) { // Add self to InputChannel connectWithInputChannel(); // Wait for InputChannel to plug in a controller done = true; while (controller == null) try { Thread.sleep(50); } catch (InterruptedException ex) { } ; } // Plug in connection Factory to Spring's Listener __listenerRef.injectConnectionFactory(); if ( pluginThreadPool ) { setUimaASThreadPoolExecutor(cc); } // Initialize the TaskExecutor. This call injects a custom Thread Pool into the // TaskExecutor provided in the spring xml. The custom thread pool initializes // an instance of AE in a dedicated thread if ( getMessageSelector() != null && !isGetMetaListener()) { initializeTaskExecutor(); } if ( threadPoolExecutor == null ) { // Plug in TaskExecutor to Spring's Listener __listenerRef.injectTaskExecutor(); } if ( propagate ) { // Notify Spring Listener that all properties are ready __listenerRef.allPropertiesSet(); } if (isActiveMQDestination() && destination != null) { destinationName = ((ActiveMQDestination) destination).getPhysicalName(); } if (!done) { connectWithInputChannel(); done = true; } if (concurrentListener != null) { concurrentListener.setAnalysisEngineController(controller); } // Save number of concurrent consumers on the temp reply queue in case we need to // recreate a new listener on a new temp queue created during recovery if (endpoint != null && controller instanceof AggregateAnalysisEngineController) { Delegate delegate = ((AggregateAnalysisEngineController) controller) .lookupDelegate(endpoint.getDelegateKey()); if (delegate != null) { delegate.getEndpoint().setConcurrentReplyConsumers(cc); } } // Show ready message on the console only if this listener is *not* listening // on an input queue. Input queue listeners are not started until the service // is fully initialized if (__listenerRef.getMessageListener() == null && getDestination() != null) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, this.getClass().getName(), "afterPropertiesSet", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_listener_ready__INFO", new Object[] {controller.getComponentName(), getBrokerUrl(), getDestination() }); } } catch (Exception e) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "afterPropertiesSet", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_jms_listener_failed_WARNING", new Object[] { destination, getBrokerUrl(), e }); UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "afterPropertiesSet", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } }); t.start(); } /** * Inject instance of this listener into the InputChannel * * @throws Exception */ private void connectWithInputChannel() throws Exception { Object pojoListener = getPojoListener(); if (pojoListener instanceof JmsInputChannel) { // Wait until InputChannel has a valid controller. The controller will be plug in // by Spring on a different thread while ((((JmsInputChannel) pojoListener).getController()) == null) { try { Thread.currentThread().sleep(50); } catch (Exception e) { } } ((JmsInputChannel) pojoListener).setListenerContainer(__listenerRef); } else if (pojoListener instanceof ModifiableListener) { ((ModifiableListener) pojoListener).setListener(__listenerRef); } } public String getDestinationName() { return destinationName; } public String getEndpointName() { if (getDestination() != null) { return ((ActiveMQDestination) getDestination()).getPhysicalName(); } return null; } public String getBrokerUrl() { return ((ActiveMQConnectionFactory) connectionFactory).getBrokerURL(); } /* * Overrides specified Connection Factory. Need to append maxInactivityDuration=0 to the broker * URL. The Connection Factory is immutable thus we need to intercept the one provided in the * deployment descriptor and create a new one with rewritten Broker URL. We will inject the * prefetch policy to the new CF based on what is found in the CF in the deployment descriptor. */ public void setConnectionFactory(ConnectionFactory aConnectionFactory) { connectionFactory = aConnectionFactory; super.setConnectionFactory(connectionFactory); } public void setDestinationResolver(DestinationResolver resolver) { ((TempDestinationResolver) resolver).setListener(this); super.setDestinationResolver(resolver); } /** * Closes shares connection to a broker **/ public void closeConnection() throws Exception { try { setRecoveryInterval(0); setAutoStartup(false); if ( getSharedConnection() != null ) { ActiveMQConnection amqc = (ActiveMQConnection)getSharedConnection(); if (amqc != null && amqc.isStarted() && !amqc.isClosed() && !amqc.isClosing() && !amqc.isTransportFailed()) { getSharedConnection().close(); } } } catch( AbstractJmsListeningContainer.SharedConnectionNotInitializedException e) { // Ignore this. This is thrown from Spring's getSharedConnection() } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "closeConnection", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "closeConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } public void setDestination(Destination aDestination) { super.setDestination(aDestination); if (endpoint != null) { endpoint.setDestination(aDestination); // Get the prefetch size. If > 1, it has been previously overriden. The override is done in // the code since dd2spring alwys sets the prefetch on a reply queue to 1. This may slow down // a throughput of a service. int prefetchSize = ((ActiveMQConnectionFactory)connectionFactory).getPrefetchPolicy().getQueuePrefetch(); if (aDestination instanceof TemporaryQueue ) { // Only log if prefetch on temp queue has been earlier overriden. The dd2spring // always sets prefetch on a temp queue to 1. The fact that the prefetch > 1 means // that an override must have taken place. Just log the value of a prefetch. if ( prefetchSize > 1 && UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "setDestination", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_replyq_prefetch_override__INFO", new Object[] {aDestination,prefetchSize }); } endpoint.setTempReplyDestination(true); Object pojoListener = getPojoListener(); if (pojoListener != null && pojoListener instanceof InputChannel) { ((JmsInputChannel) pojoListener).setListenerContainer(this); } } endpoint.setServerURI(getBrokerUrl()); } } private Object getPojoListener() { Object pojoListener = null; if (ml != null) { pojoListener = ml; } else if (getMessageListener() != null) { pojoListener = getMessageListener(); } return pojoListener; } public Destination getListenerEndpoint() { return getDestination(); } public void onException(JMSException arg0) { if (awaitingShutdown) { return; } String endpointName = (getDestination() == null) ? "" : ((ActiveMQDestination) getDestination()).getPhysicalName(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { if ( controller != null ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "onException", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_service_exception_WARNING", controller.getComponentName()); } UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "onException", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_jms_listener_failed_WARNING", new Object[] { endpointName, getBrokerUrl(), arg0 }); } } public void setTargetEndpoint(Endpoint anEndpoint) { endpoint = anEndpoint; } public boolean isFreeCasQueueListener() { return freeCasQueueListener; } protected void setModifiedTaskExecutor(TaskExecutor taskExecutor) { super.setTaskExecutor(taskExecutor); } /** * Delegate shutdown to the super class */ public void doDestroy() { super.destroy(); } public void setMessageSelector( String messageSelector) { super.setMessageSelector(messageSelector); // turn off auto startup. Selectors are only used on input queues. We dont // want listeners on this queue to start now. Once the service initializes // we will start listeners on input queue. this.setAutoStartup(false); } public void shutdownTaskExecutor(ThreadPoolExecutor tpe) throws InterruptedException { tpe.purge(); tpe.shutdownNow(); } /** * Spins a shutdown thread and stops Sprint and ActiveMQ threads. * */ public void destroy() { if (awaitingShutdown) { return; } // Spin a thread that will shutdown all taskExecutors and wait for their threads to stop. // A separate thread is necessary since we cant stop a threadPoolExecutor if one of its // threads is busy stopping the executor. This leads to a hang. Thread threadGroupDestroyer = new Thread(threadGroup.getParent().getParent(), "threadGroupDestroyer") { public void run() { try { if ( !__listenerRef.awaitingShutdown ) { awaitingShutdown = true; // delegate stop request to Spring __listenerRef.delegateStop(); if (taskExecutor != null && taskExecutor instanceof ThreadPoolTaskExecutor) { ((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().purge(); ((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().shutdownNow(); } else if (concurrentListener != null) { shutdownTaskExecutor(concurrentListener.getTaskExecutor()); concurrentListener.stop(); } else if ( threadPoolExecutor != null ) { shutdownTaskExecutor(threadPoolExecutor); } } __listenerRef.shutdown(); } catch (Exception e) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "destroy", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINEST)) { threadGroup.getParent().list(); } try { synchronized (threadGroup) { if (!threadGroup.isDestroyed()) { threadGroup.destroy(); } } } catch (Exception e) { } // Ignore } }; threadGroupDestroyer.start(); } private void setUimaASThreadPoolExecutor(int consumentCount) throws Exception{ super.setMessageListener(ml); // create task executor with custom thread pool for: // 1) GetMeta request processing // 2) ReleaseCAS request if ( taskExecutor == null ) { UimaAsThreadFactory tf = new UimaAsThreadFactory(threadGroup); tf.setDaemon(true); if ( isFreeCasQueueListener()) { tf.setThreadNamePrefix(controller.getComponentName()+" - FreeCASRequest Thread"); } else if ( isGetMetaListener() ) { tf.setThreadNamePrefix(super.getBeanName()+" - Thread"); } else if ( getDestination() != null && getMessageSelector() != null ) { tf.setThreadNamePrefix(controller.getComponentName() + " Process Thread"); } else if ( endpoint != null && endpoint.isTempReplyDestination() ) { tf.setThreadNamePrefix(super.getBeanName()+" - Thread"); } else { throw new Exception("Unknown Context Detected in setUimaASThreadPoolExecutor()"); } ExecutorService es = Executors.newFixedThreadPool(consumentCount,tf); if ( es instanceof ThreadPoolExecutor ) { threadPoolExecutor = (ThreadPoolExecutor)es; super.setTaskExecutor(es); } } } /** * Called by Spring to inject TaskExecutor */ public void setTaskExecutor(TaskExecutor aTaskExecutor) { taskExecutor = aTaskExecutor; } public TaskExecutor getTaskExecutor() { return taskExecutor; } /** * This method initializes ThreadPoolExecutor with a custom ThreadPool. Each thread produced by * the ThreadPool is used to first initialize an instance of the AE before the thread is added to * the pool. From this point on, a thread used to initialize the AE will also be used to call this * AE's process() method. * * @throws Exception */ private void initializeTaskExecutor() throws Exception { // TaskExecutor is only used with primitives if (controller instanceof PrimitiveAnalysisEngineController) { // in case the taskExecutor is not plugged in yet, wait until one // becomes available. The TaskExecutor is plugged in by Spring synchronized (mux2) { while (taskExecutor == null) { mux2.wait(20); } } // Create a Custom Thread Factory. Provide it with an instance of // PrimitiveController so that every thread can call it to initialize // the next available instance of a AE. tf = new UimaAsThreadFactory(threadGroup, (PrimitiveAnalysisEngineController) controller); ((UimaAsThreadFactory)tf).setDaemon(true); // This ThreadExecutor will use custom thread factory instead of defult one ((ThreadPoolTaskExecutor) taskExecutor).setThreadFactory(tf); // Initialize the thread pool ((ThreadPoolTaskExecutor) taskExecutor).initialize(); // Make sure all threads are started. This forces each thread to call // PrimitiveController to initialize the next instance of AE ((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().prestartAllCoreThreads(); // Change the state of a collocated service if ( !controller.isTopLevelComponent() ) { controller.changeState(ServiceState.RUNNING); } } if ( threadPoolExecutor != null ) { threadPoolExecutor.prestartAllCoreThreads(); } } public void delegateStop() { super.stop(); } public void stop() throws JmsException { destroy(); } } UimaEEAdminSpringContext.java000066400000000000000000000170321160020716200353770ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.activemq; import java.util.concurrent.ConcurrentHashMap; import org.apache.activemq.broker.BrokerService; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.UimaEEAdminContext; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.util.Level; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.support.FileSystemXmlApplicationContext; public class UimaEEAdminSpringContext implements UimaEEAdminContext, ApplicationListener { private static final Class CLASS_NAME = UimaEEAdminSpringContext.class; private FileSystemXmlApplicationContext springContainer = null; private BrokerService service; private boolean isShutdown; private ConcurrentHashMap listenerMap = new ConcurrentHashMap(); public UimaEEAdminSpringContext(FileSystemXmlApplicationContext aSpringContainer) { springContainer = aSpringContainer; String beanNames[] = springContainer .getBeanNamesForType(org.apache.uima.adapter.jms.activemq.UimaDefaultMessageListenerContainer.class); for (int i = 0; beanNames != null && i < beanNames.length; i++) { try { UimaDefaultMessageListenerContainer listenerContainer = ((UimaDefaultMessageListenerContainer) springContainer .getBean(beanNames[i])); ListenerEntry listenerEntry = new ListenerEntry(); listenerEntry.setListenerContainer(listenerContainer); listenerMap.put(listenerContainer.getDestinationName(), listenerEntry); } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "UimaEEAdminSpringContext", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } public void setBroker(BrokerService aBrokerService) { service = aBrokerService; } public ApplicationContext getSpringContainer() { return springContainer; } public int getConcurrentConsumerCount(String anEndpointName) { try { if (anEndpointName != null && anEndpointName.trim().length() > 0 && springContainer.isActive() && listenerMap.containsKey(anEndpointName)) { ListenerEntry listenerEntry = null; listenerEntry = ((ListenerEntry) listenerMap.get(anEndpointName)); if (listenerEntry != null && listenerEntry.isStopped() == false) { UimaDefaultMessageListenerContainer listenerContainer = listenerEntry .getListenerContainer(); return listenerContainer.getConcurrentConsumers(); } } } catch (Exception e) { } return -1; } /** * Stops a listener thread on a given endpoint */ public synchronized void stopListener(String anEndpointName) { try { if (anEndpointName != null && anEndpointName.trim().length() > 0 && springContainer.isActive() && listenerMap.containsKey(anEndpointName)) { ListenerEntry listenerEntry = null; listenerEntry = ((ListenerEntry) listenerMap.get(anEndpointName)); if (listenerEntry != null && listenerEntry.isStopped() == false) { listenerEntry.setStopped(true); if (listenerMap.get(anEndpointName) != null) { ListenerEntry entry = (ListenerEntry) listenerMap.get(anEndpointName); if (entry != null) { UimaDefaultMessageListenerContainer listenerContainer = entry.getListenerContainer(); spinThreadForListenerShutdown(listenerContainer); } } } } } catch (Exception e) { } } private void spinThreadForListenerShutdown( final UimaDefaultMessageListenerContainer listenerContainer) { // Spin a shutdown thread to terminate listener. The thread is needed due // to Spring. new Thread() { public void run() { try { listenerContainer.setAutoStartup(false); listenerContainer.setRecoveryInterval(0); listenerContainer.shutdown(); listenerContainer.destroy(); String eName = listenerContainer.getEndpointName(); if (eName != null) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, this.getClass().getName(), "spinThreadForListenerShutdown.run()", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_stop_listener__INFO", new Object[] { eName }); } } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "run", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } }.start(); } public void onApplicationEvent(ApplicationEvent anEvent) { shutdown(); } /** * Stops the Spring Container */ public void shutdown() { if (springContainer.isActive()) { isShutdown = true; // Spin a thread so that the Spring container can shut itself down new Thread("Spring Container Shutdown Thread") { public void run() { try { springContainer.destroy(); springContainer = null; } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "shutdown", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } }.start(); } listenerMap.clear(); } public boolean isShutdown() { return isShutdown; } protected static class ListenerEntry { private boolean stopped = false; private UimaDefaultMessageListenerContainer listenerContainer = null; protected UimaDefaultMessageListenerContainer getListenerContainer() { return listenerContainer; } protected void setListenerContainer(UimaDefaultMessageListenerContainer listenerContainer) { this.listenerContainer = listenerContainer; } protected boolean isStopped() { return stopped; } protected void setStopped(boolean stopped) { this.stopped = stopped; } } } uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/client/000077500000000000000000000000001160020716200274475ustar00rootroot00000000000000ActiveMQConnectionValidator.java000066400000000000000000000030051160020716200355700ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/client/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.client; import javax.jms.Connection; import org.apache.activemq.ActiveMQConnection; import org.apache.uima.adapter.jms.ConnectionValidator; /** * * ActiveMQ specific class for determining if Broker connection * is valid. * */ public class ActiveMQConnectionValidator implements ConnectionValidator { public synchronized boolean connectionClosedOrInvalid(Connection connection) { if ( connection == null || ((ActiveMQConnection)connection).isClosed() || ((ActiveMQConnection)connection).isClosing() || ((ActiveMQConnection)connection).isTransportFailed()) { return true; } return false; } } ActiveMQMessageSender.java000066400000000000000000000167021160020716200343600ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/client/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.client; import java.util.concurrent.ConcurrentHashMap; import javax.jms.BytesMessage; import javax.jms.Connection; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQMessageProducer; import org.apache.activemq.ActiveMQSession; import org.apache.activemq.command.ActiveMQDestination; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.UIMAEE_Constants; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.util.Level; /** * Initializes JMS session and creates JMS MessageProducer to be used for sending messages to a * given destination. It extends BaseMessageSender which starts the worker thread and is tasked with * sending messages. The application threads share a common 'queue' with the worker thread. The * application threads add messages to the pendingMessageList 'queue' and the worker thread consumes * them. * */ public class ActiveMQMessageSender extends BaseMessageSender { private static final Class CLASS_NAME = ActiveMQMessageSender.class; private volatile Connection connection = null; private Session session = null; private MessageProducer producer = null; private String destinationName = null; private ConcurrentHashMap producerMap = new ConcurrentHashMap(); public ActiveMQMessageSender(Connection aConnection, String aDestinationName, BaseUIMAAsynchronousEngineCommon_impl engine) throws Exception { super(engine); connection = aConnection; destinationName = aDestinationName; } public synchronized MessageProducer getMessageProducer(Destination destination) throws Exception { if (producerMap.containsKey(destination)) { return (MessageProducer) producerMap.get(destination); } createSession(); MessageProducer mProducer = session.createProducer(destination); mProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); producerMap.put(destination, mProducer); return mProducer; } /** * This is called when a new Connection is created after broker is restarted */ public void setConnection(Connection aConnection) { connection = aConnection; cleanup(); try { initializeProducer(); } catch( Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, getClass().getName(), "setConnection", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_exception__WARNING", e); } } } private String getBrokerURL() { try { return ((ActiveMQConnection) connection).getBrokerInfo().getBrokerURL(); } catch (Exception ex) { /* handle silently. */ } return ""; } private void createSession() throws Exception { String broker = getBrokerURL(); try { if (session == null || engine.producerInitialized == false) { session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); } } catch (JMSException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "createSession", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_client_failed_creating_session_INFO", new Object[] { destinationName, broker }); } if (connection == null) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "createSession", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_client_connection_not_ready_INFO", new Object[] { broker }); } } else if (((ActiveMQConnection) connection).isClosed() || ((ActiveMQConnection) connection).isClosing()) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME) .logrb(Level.INFO, CLASS_NAME.getName(), "createSession", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_client_connection_closed_INFO", new Object[] { destinationName, broker }); } } throw e; } catch (Exception e) { throw e; } } /** * Creates a jms session object used to instantiate message producer */ protected void initializeProducer() throws Exception { createSession(); producer = getMessageProducer(session.createQueue(destinationName)); } /** * Returns the full name of the destination queue */ protected String getDestinationEndpoint() throws Exception { return ((ActiveMQDestination) producer.getDestination()).getPhysicalName(); } /** * Returns jsm MessageProducer */ public MessageProducer getMessageProducer() { if ( engine.running && engine.producerInitialized == false ) { try { setConnection(engine.sharedConnection.getConnection()); initializeProducer(); engine.producerInitialized = true; } catch( Exception e) { e.printStackTrace(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, getClass().getName(), "getMessageProducer", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_exception__WARNING", e); } } } return producer; } public TextMessage createTextMessage() throws Exception { if (session == null) { // Force initialization of Producer initializeProducer(); } return session.createTextMessage(""); } public BytesMessage createBytesMessage() throws Exception { if (session == null) { // Force initialization of Producer initializeProducer(); } return session.createBytesMessage(); } /** * Cleanup any jms resources used by the worker thread */ protected void cleanup() { try { if (session != null) { session.close(); session = null; } if (producer != null) { producer.close(); producer = null; } } catch (Exception e) { // Ignore we are shutting down } finally { producerMap.clear(); } } }BaseUIMAAsynchronousEngine_impl.java000066400000000000000000001401601160020716200363460ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/client/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.client; import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.Semaphore; import javax.jms.BytesMessage; import javax.jms.Connection; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import javax.management.ObjectName; import javax.naming.Context; import javax.naming.InitialContext; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.ActiveMQMessageConsumer; import org.apache.activemq.ActiveMQPrefetchPolicy; import org.apache.activemq.ActiveMQSession; import org.apache.activemq.RedeliveryPolicy; import org.apache.activemq.command.ActiveMQBytesMessage; import org.apache.activemq.command.ActiveMQDestination; import org.apache.activemq.command.ActiveMQTempDestination; import org.apache.activemq.command.ActiveMQTextMessage; import org.apache.uima.UIMAFramework; import org.apache.uima.UIMA_IllegalArgumentException; import org.apache.uima.UIMA_IllegalStateException; import org.apache.uima.aae.AsynchAECasManager_impl; import org.apache.uima.aae.UIMAEE_Constants; import org.apache.uima.aae.UimaAsVersion; import org.apache.uima.aae.client.UimaASStatusCallbackListener; import org.apache.uima.aae.client.UimaAsynchronousEngine; import org.apache.uima.aae.controller.AnalysisEngineController; import org.apache.uima.aae.controller.ControllerCallbackListener; import org.apache.uima.aae.controller.ControllerLifecycle; import org.apache.uima.aae.controller.Endpoint; import org.apache.uima.aae.controller.UimacppServiceController; import org.apache.uima.aae.delegate.Delegate; import org.apache.uima.aae.delegate.Delegate.DelegateEntry; import org.apache.uima.aae.error.AsynchAEException; import org.apache.uima.aae.error.UimaASMetaRequestTimeout; import org.apache.uima.aae.jmx.JmxManager; import org.apache.uima.aae.message.AsynchAEMessage; import org.apache.uima.aae.message.UIMAMessage; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.adapter.jms.activemq.SpringContainerDeployer; import org.apache.uima.adapter.jms.activemq.UimaEEAdminSpringContext; import org.apache.uima.adapter.jms.client.BaseUIMAAsynchronousEngineCommon_impl.ClientRequest; import org.apache.uima.adapter.jms.service.Dd2spring; import org.apache.uima.analysis_engine.AnalysisEngineDescription; import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData; import org.apache.uima.cas.CAS; import org.apache.uima.impl.UimaVersion; import org.apache.uima.internal.util.UUIDGenerator; import org.apache.uima.resource.Resource; import org.apache.uima.resource.ResourceConfigurationException; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.resource.ResourceManager; import org.apache.uima.resource.ResourceProcessException; import org.apache.uima.util.Level; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class BaseUIMAAsynchronousEngine_impl extends BaseUIMAAsynchronousEngineCommon_impl implements UimaAsynchronousEngine, MessageListener, ControllerCallbackListener { private static final Class CLASS_NAME = BaseUIMAAsynchronousEngine_impl.class; private MessageSender sender = null; private MessageProducer producer; private String brokerURI = null; private Session session = null; private Session consumerSession = null; private volatile boolean serviceInitializationException; private volatile boolean serviceInitializationCompleted; private Semaphore serviceSemaphore = new Semaphore(1); private Queue consumerDestination = null; private Session producerSession = null; private JmxManager jmxManager = null; private String applicationName = "UimaASClient"; protected static Semaphore sharedConnectionSemaphore = new Semaphore(1); private Object connectionMux = new Object(); protected InitialContext jndiContext; private ObjectName clientJmxObjectName = null; public BaseUIMAAsynchronousEngine_impl() { UIMAFramework.getLogger(CLASS_NAME).log(Level.INFO, "UIMA-AS version " + UIMAFramework.getVersionString()); } protected TextMessage createTextMessage() throws ResourceInitializationException { return new ActiveMQTextMessage(); } protected BytesMessage createBytesMessage() throws ResourceInitializationException { return new ActiveMQBytesMessage(); } /** * Called at the end of collectionProcessingComplete - WAS closes receiving thread here */ protected void cleanup() throws Exception { } /** * Return a name of the queue to which the JMS Producer is connected to. */ public String getEndPointName() throws ResourceProcessException { try { return clientSideJmxStats.getEndpointName(); } catch (Exception e) { throw new ResourceProcessException(e); } } protected void setMetaRequestMessage(Message msg) throws Exception { msg.setStringProperty(AsynchAEMessage.MessageFrom, consumerDestination.getQueueName()); msg.setStringProperty(UIMAMessage.ServerURI, brokerURI); msg.setIntProperty(AsynchAEMessage.MessageType, AsynchAEMessage.Request); msg.setIntProperty(AsynchAEMessage.Command, AsynchAEMessage.GetMeta); msg.setJMSReplyTo(consumerDestination); if (msg instanceof TextMessage) { ((ActiveMQTextMessage) msg).setText(""); } } /** * Initialize JMS Message with properties relevant to Process CAS request. */ protected void setCASMessage(String aCasReferenceId, CAS aCAS, Message msg) throws ResourceProcessException { try { setCommonProperties(aCasReferenceId, msg, "xmi"); ((TextMessage) msg).setText(serializeCAS(aCAS)); } catch (Exception e) { throw new ResourceProcessException(e); } } protected void setCASMessage(String aCasReferenceId, String aSerializedCAS, Message msg) throws ResourceProcessException { try { setCommonProperties(aCasReferenceId, msg, "xmi"); ((TextMessage) msg).setText(aSerializedCAS); } catch (Exception e) { throw new ResourceProcessException(e); } } protected void setCASMessage(String aCasReferenceId, byte[] aSerializedCAS, Message msg) throws ResourceProcessException { try { setCommonProperties(aCasReferenceId, msg, "binary"); ((BytesMessage) msg).writeBytes(aSerializedCAS); } catch (Exception e) { throw new ResourceProcessException(e); } } protected void setCommonProperties(String aCasReferenceId, Message msg, String aSerializationStrategy) throws ResourceProcessException { try { msg.setStringProperty(AsynchAEMessage.MessageFrom, consumerDestination.getQueueName()); msg.setStringProperty(UIMAMessage.ServerURI, brokerURI); msg.setIntProperty(AsynchAEMessage.MessageType, AsynchAEMessage.Request); msg.setIntProperty(AsynchAEMessage.Command, AsynchAEMessage.Process); msg.setStringProperty(AsynchAEMessage.CasReference, aCasReferenceId); if (aSerializationStrategy.equals("binary")) { msg.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.BinaryPayload); } else if (aSerializationStrategy.equals("xmi")) { msg.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.XMIPayload); } msg.setBooleanProperty(AsynchAEMessage.AcceptsDeltaCas, true); msg.setJMSReplyTo(consumerDestination); } catch (Exception e) { throw new ResourceProcessException(e); } } private void stopConnection() { if (sharedConnection != null) { // Remove a client from registry sharedConnection.unregisterClient(this); // The destroy method closes the JMS connection when // the number of // clients becomes 0, otherwise it is a no-op if (sharedConnection.destroy()) { // This needs to be done to invalidate the // object for JUnit tests sharedConnection = null; } } } public void stop() { synchronized (connectionMux) { super.doStop(); if (!running) { return; } running = false; if (super.serviceDelegate != null) { // Cancel all timers and purge lists super.serviceDelegate.cleanup(); } if (sender != null) { sender.doStop(); } if (initialized) { try { consumerSession.close(); ((ActiveMQMessageConsumer)consumer).stop(); consumer.close(); } catch (Exception exx) {} } try { // SharedConnection object manages a single JMS connection to // the broker. If the client is scaled out in the same JVM, the // connection is shared by all instances of the client to reduce number of // threads in the broker. The SharedConnection object also maintains the // number of client instances to determine when it is ok to close the // connection. The connection is closed when the last client calls stop(). try { sharedConnectionSemaphore.acquire(); stopConnection(); } catch (InterruptedException ex) { // Force connection stop stopConnection(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable( Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "stop", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_client_interrupted_while_acquiring_semaphore__WARNING"); } } finally { sharedConnectionSemaphore.release(); } // Undeploy all containers undeploy(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable( Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "stop", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_undeployed_containers__INFO"); } // unregister client if (jmxManager != null) { jmxManager.unregisterMBean(clientJmxObjectName); jmxManager.destroy(); } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable( Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "stop", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } public void setCPCMessage(Message msg) throws Exception { msg.setStringProperty(AsynchAEMessage.MessageFrom, consumerDestination.getQueueName()); msg.setStringProperty(UIMAMessage.ServerURI, brokerURI); msg.setIntProperty(AsynchAEMessage.MessageType, AsynchAEMessage.Request); msg.setIntProperty(AsynchAEMessage.Command, AsynchAEMessage.CollectionProcessComplete); msg.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.None); msg.setBooleanProperty(AsynchAEMessage.RemoveEndpoint, true); msg.setJMSReplyTo(consumerDestination); if (msg instanceof TextMessage) { ((TextMessage) msg).setText(""); } } private boolean connectionClosedOrInvalid() { synchronized (connectionMux) { if (sharedConnection == null || sharedConnection.getConnection() == null || ((ActiveMQConnection) sharedConnection.getConnection()) .isClosed() || ((ActiveMQConnection) sharedConnection.getConnection()) .isClosing() || ((ActiveMQConnection) sharedConnection.getConnection()) .isTransportFailed()) { return true; } } return false; } protected void createSharedConnection(String aBrokerURI) throws Exception { synchronized (connectionMux) { try { // Acquire global static semaphore sharedConnectionSemaphore.acquire(); // check the state of a connection if (connectionClosedOrInvalid()) { if (sharedConnection != null && sharedConnection.getConnection() != null) { try { // Cleanup so that we dont leak connections in a // broker sharedConnection.getConnection().close(); } catch (Exception ex) { // Ignore exception while closing a bad connection } } // This only effects Consumer // Create AMQ specific connection validator. It uses // AMQ specific approach to test the state of the connection ActiveMQConnectionValidator connectionValidator = new ActiveMQConnectionValidator(); // Create a singleton shared connection object sharedConnection = new SharedConnection( new ActiveMQConnectionFactory(aBrokerURI), aBrokerURI); // Add AMQ specific connection validator sharedConnection .setConnectionValidator(connectionValidator); // Connect to broker. Throws exception if unable to connect sharedConnection.create(); addPrefetch((ActiveMQConnection) sharedConnection .getConnection()); sharedConnection.start(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable( Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "setupConnection", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_client_connection_setup_INFO", new Object[] { aBrokerURI }); } } } catch (Exception e) { throw e; } finally { // Release global static semaphore sharedConnectionSemaphore.release(); } } } private void addPrefetch(ActiveMQConnection aConnection) { ActiveMQPrefetchPolicy prefetchPolicy = new ActiveMQPrefetchPolicy(); prefetchPolicy.setQueuePrefetch(5); ((ActiveMQConnection) aConnection).setPrefetchPolicy(prefetchPolicy); } private void validateConnection(String aBrokerURI) throws Exception { // checks if a sharedConnection exists and if not creates a new one createSharedConnection(aBrokerURI); } protected Session getSession(String aBrokerURI) throws Exception { validateConnection(aBrokerURI); return getSession(sharedConnection.getConnection()); } protected Session getSession(Connection aConnection) throws Exception { session = aConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); return session; } protected MessageProducer lookupProducerForEndpoint(Endpoint anEndpoint) throws Exception { if (sharedConnection == null || producerSession == null) { throw new ResourceInitializationException(); } Destination dest = producerSession.createQueue(anEndpoint.getEndpoint()); return producerSession.createProducer(dest); } protected void initializeProducer(String aBrokerURI, String aQueueName) throws Exception { // Check if a sharedConnection exists. If not it creates one createSharedConnection(aBrokerURI); synchronized (connectionMux) { initializeProducer(aBrokerURI, aQueueName, sharedConnection.getConnection()); } } protected void initializeProducer(String aBrokerURI, String aQueueName, Connection aConnection) throws Exception { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "initializeProducer", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_init_jms_producer_INFO", new Object[] { aBrokerURI, aQueueName }); } brokerURI = aBrokerURI; // Create a worker thread for sending messages. Jms sessions are single threaded // and it is illegal (per JMS spec) to use the same sesssion from multiple threads. // The worker thread solves this problem. As it is the only thread that owns the // session and uses it to create message producer. // The worker thread blocks waiting for messages from application threads. The // application threads add messages to the shared "queue" (in-memory queue not // jms queue) and the worker thread consumes them. The worker thread is not // serialializing CASes. This work is done in application threads. // create a Message Dispatcher object. In its constructor it acquires a shared // semaphore producerSemaphore and holds it until the producer is created an // and initialized. Once this happens or there is an error, the semaphore is // released. sender = new ActiveMQMessageSender(aConnection, aQueueName, this); producerInitialized = false; Thread t = new Thread((BaseMessageSender) sender); // Start the worker thread. The jms session and message producer are created. Once // the message producer is created, the worker thread notifies this thread by // calling onProducerInitialized() where the global flag 'producerInitialized' is // set to true. After the notification, the worker thread notifies this instance // that the producer is fully initialized and finally begins to wait for messages // in pendingMessageList. Upon arrival, each message is removed from // pendingMessageList and it is sent to a destination. t.start(); try { // Block waiting for the Sender to complete initializing the Producer. // The sender will release the lock once it instantiates and initializes // the Producer object or if there is an error producerSemaphore.acquire(); } catch (InterruptedException ex) { } finally { producerSemaphore.release(); } // Check if the worker thread failed to initialize. if (sender.failed()) { // Worker thread failed to initialize. Log the reason and stop the uima ee client if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "initializeProducer", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_worker_thread_failed_to_initialize__WARNING", new Object[] { sender.getReasonForFailure() }); } stop(); return; } } /** * Create a JMS Consumer on a temporary queue. Service replies will be handled by this consumer. * * @param aBrokerURI * @throws Exception */ protected void initializeConsumer(String aBrokerURI) throws Exception { createSharedConnection(aBrokerURI); synchronized (connectionMux) { initializeConsumer(aBrokerURI, sharedConnection.getConnection()); } } protected void initializeConsumer(String aBrokerURI, Connection connection) throws Exception { // In case we are recovering from a bad broker connection, invalidate old // JMS objects first. if ( consumerSession != null ) { try { consumer.close(); consumerSession.close(); } catch( Exception e) { // ignore, creating a new Session below } } consumerSession = getSession(connection); consumerDestination = consumerSession.createTemporaryQueue(); if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "initializeConsumer", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_init_jms_consumer_INFO", new Object[] { aBrokerURI, consumerDestination.getQueueName() }); } consumer = consumerSession.createConsumer(consumerDestination); consumer.setMessageListener(this); } /** * Replaces place holder with syntax ${pname} with a system property whose name is pname * * @param aPlaceholder to resolve * @return - the actual broker URL * @throws ResourceInitializationException */ private String replacePlaceholder(String aPlaceholder) throws ResourceInitializationException { // find placeholder starting and endpoint positions int startPos = aPlaceholder.indexOf("{"); int endPos = aPlaceholder.indexOf("}"); // extract the name String placeholder = aPlaceholder.substring(startPos+1, endPos); // using the name, find the broker URL. This property must exist or exception is thrown String url = System.getProperty(placeholder); // the property is missing if ( url == null ) { throw new ResourceInitializationException(new Exception("UIMA AS Client Initialization Exception. Value for placeholder:"+placeholder+" is not defined in the environment. Set System property:"+placeholder+" to the broker URL.")); } return url; } /** * Initialize the uima ee client. Takes initialization parameters from the * anApplicationContext map. */ public synchronized void initialize(Map anApplicationContext) throws ResourceInitializationException { // Add ShutdownHook to make sure the connection to the // broker is always closed on process exit. shutdownHookThread = new Thread(new UimaASShutdownHook(this)); Runtime.getRuntime().addShutdownHook(shutdownHookThread); // Check the version of uimaj that UIMA AS was built with, against the UIMA Core version. If not the same throw Exception if (!UimaAsVersion.getUimajFullVersionString().equals(UimaVersion.getFullVersionString())) { UIMAFramework.getLogger(CLASS_NAME).logrb( Level.WARNING, CLASS_NAME.getName(), "initialize", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_incompatible_version_WARNING", new Object[] { "UIMA AS Client", UimaAsVersion.getUimajFullVersionString(), UimaVersion.getFullVersionString() }); throw new ResourceInitializationException(new AsynchAEException( "Version of UIMA-AS is Incompatible with a Version of UIMA Core. UIMA-AS Version is built to depend on Core UIMA version:" + UimaAsVersion.getUimajFullVersionString() + " but is running with version:" + UimaVersion.getFullVersionString())); } if (running) { throw new ResourceInitializationException(new UIMA_IllegalStateException()); } reset(); Properties performanceTuningSettings = null; if (!anApplicationContext.containsKey(UimaAsynchronousEngine.ServerUri)) { throw new ResourceInitializationException(); } if (!anApplicationContext.containsKey(UimaAsynchronousEngine.Endpoint)) { throw new ResourceInitializationException(); } ResourceManager rm = null; if (anApplicationContext.containsKey(Resource.PARAM_RESOURCE_MANAGER)) { rm = (ResourceManager) anApplicationContext.get(Resource.PARAM_RESOURCE_MANAGER); } else { rm = UIMAFramework.newDefaultResourceManager(); } performanceTuningSettings = new Properties(); if (anApplicationContext.containsKey(UIMAFramework.CAS_INITIAL_HEAP_SIZE)) { String cas_initial_heap_size = (String) anApplicationContext .get(UIMAFramework.CAS_INITIAL_HEAP_SIZE); performanceTuningSettings.put(UIMAFramework.CAS_INITIAL_HEAP_SIZE, cas_initial_heap_size); } asynchManager = new AsynchAECasManager_impl(rm); brokerURI = (String) anApplicationContext.get(UimaAsynchronousEngine.ServerUri); // Check if a placeholder is passed in instead of actual Broker URL. The placeholder // has this syntax ${placeholderName}. A system property with placeholderName // must exist for successful placeholder resolution. if ( brokerURI.startsWith("${")) { // resolve placeholder // throws ResourceInitializationException if placeholder is not defined in // System properties brokerURI = replacePlaceholder(brokerURI); } String endpoint = (String) anApplicationContext.get(UimaAsynchronousEngine.Endpoint); clientSideJmxStats.setEndpointName(endpoint); int casPoolSize = 1; if (anApplicationContext.containsKey(UimaAsynchronousEngine.CasPoolSize)) { casPoolSize = ((Integer) anApplicationContext.get(UimaAsynchronousEngine.CasPoolSize)) .intValue(); clientSideJmxStats.setCasPoolSize(casPoolSize); } if (anApplicationContext.containsKey(UimaAsynchronousEngine.Timeout)) { processTimeout = ((Integer) anApplicationContext.get(UimaAsynchronousEngine.Timeout)) .intValue(); } if (anApplicationContext.containsKey(UimaAsynchronousEngine.GetMetaTimeout)) { metadataTimeout = ((Integer) anApplicationContext.get(UimaAsynchronousEngine.GetMetaTimeout)) .intValue(); } if (anApplicationContext.containsKey(UimaAsynchronousEngine.CpcTimeout)) { cpcTimeout = ((Integer) anApplicationContext.get(UimaAsynchronousEngine.CpcTimeout)) .intValue(); } if (anApplicationContext.containsKey(UimaAsynchronousEngine.ApplicationName)) { applicationName = (String) anApplicationContext.get(UimaAsynchronousEngine.ApplicationName); } if (anApplicationContext.containsKey(UimaAsynchronousEngine.SerializationStrategy)) { super.serializationStrategy = (String) anApplicationContext .get(UimaAsynchronousEngine.SerializationStrategy); clientSideJmxStats.setSerialization(super.serializationStrategy); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.CONFIG)) { UIMAFramework.getLogger(CLASS_NAME) .logrb( Level.CONFIG, CLASS_NAME.getName(), "initialize", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_init_uimaee_client__CONFIG", new Object[] { brokerURI, 0, casPoolSize, processTimeout, metadataTimeout, cpcTimeout }); } super.serviceDelegate = new ClientServiceDelegate(endpoint, applicationName, this); super.serviceDelegate.setCasProcessTimeout(processTimeout); super.serviceDelegate.setGetMetaTimeout(metadataTimeout); try { // Generate unique identifier String uuid = UUIDGenerator.generate(); // JMX does not allow ':' in the ObjectName so replace these with underscore uuid = uuid.replaceAll(":", "_"); uuid = uuid.replaceAll("-", "_"); applicationName += "_" + uuid; jmxManager = new JmxManager("org.apache.uima"); clientSideJmxStats.setApplicationName(applicationName); clientJmxObjectName = new ObjectName("org.apache.uima:name=" + applicationName); jmxManager.registerMBean(clientSideJmxStats, clientJmxObjectName); Properties props = new Properties(); props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.apache.activemq.jndi.ActiveMQInitialContextFactory"); props.setProperty(Context.PROVIDER_URL,brokerURI); jndiContext = new InitialContext(props); // Check if sharedConnection exists. If not create a new one. The sharedConnection // is static and shared by all instances of UIMA AS client in a jvm. The check // is made in a critical section by first acquiring a global static semaphore to // prevent a race condition. createSharedConnection(brokerURI); synchronized (connectionMux) { // Reuse existing JMS connection if available if (sharedConnection != null) { initializeProducer(brokerURI, endpoint, sharedConnection.getConnection()); initializeConsumer(brokerURI, sharedConnection.getConnection()); } else { initializeProducer(brokerURI, endpoint); initializeConsumer(brokerURI); } // Increment number of client instances. SharedConnection object is a static // and is used to share a single JMS connection. The connection is closed // when the last client finishes processing and calls stop(). if (sharedConnection != null) { sharedConnection.registerClient(this); } } running = true; // Acquire GetMeta Semaphore Before Sending a GetMeta Request. This will force // the client to block in waitForMetadataReply() until GetMeta reply is received try { getMetaSemaphore.acquire(); } catch (InterruptedException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "initialize", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_client_interrupted_while_acquiring_getmeta_semaphore__WARNING"); } } // Add a delay of 100ms before sending a request for metadata to remote service. // This is done to give the broker enough time to 'finalize' creation of // temp reply queue. It's been observed (on MAC OS only) that AMQ // broker QueueSession.createTemporaryQueue() call is not synchronous. Meaning, // return from createTemporaryQueue() does not guarantee immediate availability // of the temp queue. It seems like this operation is asynchronous, causing: // "InvalidDestinationException: Cannot publish to a deleted Destination..." // on the service side when it tries to reply to the client. try { wait(100); } catch( InterruptedException e) {} sendMetaRequest(); waitForMetadataReply(); if (abort || !running) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "initialize", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_aborting_as_WARNING", new Object[] { "Metadata Timeout" }); } throw new ResourceInitializationException(new UimaASMetaRequestTimeout()); } else { if (collectionReader != null) { asynchManager.addMetadata(collectionReader.getProcessingResourceMetaData()); } asynchManager.initialize(casPoolSize, "ApplicationCasPoolContext", performanceTuningSettings); // Create a special CasPool of size 1 to be used for deserializing CASes from a Cas // Multiplier if (super.resourceMetadata != null && super.resourceMetadata instanceof AnalysisEngineMetaData) { if (((AnalysisEngineMetaData) super.resourceMetadata).getOperationalProperties() .getOutputsNewCASes()) { // Create a Shadow CAS Pool used to de-serialize CASes produced by a CAS Multiplier asynchManager.initialize(1, SHADOW_CAS_POOL, performanceTuningSettings); } } initialized = true; remoteService = true; // running = true; for (int i = 0; listeners != null && i < listeners.size(); i++) { ((UimaASStatusCallbackListener) listeners.get(i)).initializationComplete(null); } } } catch (ResourceInitializationException e) { state = ClientState.FAILED; notifyOnInitializationFailure(e); throw e; } catch (Exception e) { state = ClientState.FAILED; notifyOnInitializationFailure(e); throw new ResourceInitializationException(e); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "initialize", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_as_initialized__INFO", new Object[] { super.serializationStrategy }); } // Acquire cpcReady semaphore to block sending CPC request until // ALL outstanding CASes are received. super.acquireCpcReadySemaphore(); state = ClientState.RUNNING; } /** * First generates a Spring context from a given deploy descriptor and than deploys the context * into a Spring Container. * * @param aDeploymentDescriptor * - deployment descriptor to generate Spring Context from * @param anApplicationContext * - a Map containing properties required by dd2spring * * @return - a unique spring container id * */ public String deploy(String aDeploymentDescriptor, Map anApplicationContext) throws Exception { String springContext = generateSpringContext(aDeploymentDescriptor, anApplicationContext); SpringContainerDeployer springDeployer = new SpringContainerDeployer(springContainerRegistry); try { String id = springDeployer.deploy(springContext); if ( springDeployer.isInitialized() ) { springDeployer.startListeners(); } return id; } catch (ResourceInitializationException e) { running = true; throw e; } } /** * */ public String deploy(String[] aDeploymentDescriptorList, Map anApplicationContext) throws Exception { if (aDeploymentDescriptorList == null) { throw new ResourceConfigurationException(UIMA_IllegalArgumentException.ILLEGAL_ARGUMENT, new Object[] { "Null", "DeploymentDescriptorList", "deploy()" }); } if (aDeploymentDescriptorList.length == 0) { throw new ResourceConfigurationException( ResourceConfigurationException.MANDATORY_VALUE_MISSING, new Object[] { "DeploymentDescriptorList" }); } String[] springContextFiles = new String[aDeploymentDescriptorList.length]; for (int i = 0; i < aDeploymentDescriptorList.length; i++) { springContextFiles[i] = generateSpringContext(aDeploymentDescriptorList[i], anApplicationContext); } SpringContainerDeployer springDeployer = new SpringContainerDeployer(springContainerRegistry); try { String id = springDeployer.deploy(springContextFiles); if ( springDeployer.isInitialized() ) { springDeployer.startListeners(); } return id; } catch (ResourceInitializationException e) { running = true; throw e; } } public void undeploy() throws Exception { Iterator containerIterator = springContainerRegistry.keySet().iterator(); while (containerIterator.hasNext()) { String containerId = (String) containerIterator.next(); undeploy(containerId); } } public void undeploy(String aSpringContainerId) throws Exception { this.undeploy(aSpringContainerId, SpringContainerDeployer.STOP_NOW); } /** * Undeploys Spring container with a given container Id. All deployed Spring containers are * registered in the local registry under a unique id. * */ public void undeploy(String aSpringContainerId, int stop_level) throws Exception { if (aSpringContainerId == null) { return; } UimaEEAdminSpringContext adminContext = null; if (!springContainerRegistry.containsKey(aSpringContainerId)) { return; // throw new InvalidContainerException("Invalid Spring container Id:" + aSpringContainerId + // ". Unable to undeploy the Spring container"); } // Fetch an administrative context which contains a Spring Container adminContext = (UimaEEAdminSpringContext) springContainerRegistry.get(aSpringContainerId); if (adminContext == null) { throw new InvalidContainerException( "Spring Container Does Not Contain Valid UimaEEAdminSpringContext Object"); } // Fetch instance of the Container from its context ApplicationContext ctx = adminContext.getSpringContainer(); // Query the container for objects that implement // ControllerLifecycle interface. These // objects are typically of type AnalysisEngineController or // UimacppServiceController. String[] asyncServiceList = ctx .getBeanNamesForType(org.apache.uima.aae.controller.ControllerLifecycle.class); // Given a valid list of controllers select the first from the list // and // initiate a shutdown. We don't care which controller will be // invoked. In case of // AggregateAnalysisEngineController the terminate event will // propagate all the way // to the top controller in the hierarchy and the shutdown will take // place from there. // If the controller is of kind UimecppServiceController or // PrimitiveAnalysisController // the termination logic will be immediately triggered in the // terminate() method. if (asyncServiceList != null && asyncServiceList.length > 0) { boolean topLevelController = false; ControllerLifecycle ctrer = null; int indx = 0; while (!topLevelController) { ctrer = (ControllerLifecycle) ctx.getBean(asyncServiceList[indx++]); if (ctrer instanceof UimacppServiceController || ((AnalysisEngineController) ctrer).isTopLevelComponent()) { topLevelController = true; } } // Send a trigger to initiate shutdown. if (ctrer != null) { if (ctrer instanceof AnalysisEngineController) { ((AnalysisEngineController) ctrer).getControllerLatch().release(); } switch (stop_level) { case SpringContainerDeployer.QUIESCE_AND_STOP: ((AnalysisEngineController) ctrer).quiesceAndStop(); break; case SpringContainerDeployer.STOP_NOW: ((AnalysisEngineController) ctrer).terminate(); break; } } } if (ctx instanceof FileSystemXmlApplicationContext) { ((FileSystemXmlApplicationContext) ctx).destroy(); } // Remove the container from a local registry springContainerRegistry.remove(aSpringContainerId); } /** * Use dd2spring to generate Spring context file from a given deployment descriptor file. * * @param aDeploymentDescriptor * - deployment descriptor to generate Spring Context from * @param anApplicationContext * - a Map containing properties required by dd2spring * @return - an absolute path to the generated Spring Context file * * @throws Exception * - if failure occurs */ private String generateSpringContext(String aDeploymentDescriptor, Map anApplicationContext) throws Exception { String dd2SpringXsltFilePath = null; String saxonClasspath = null; if (anApplicationContext.containsKey(UimaAsynchronousEngine.DD2SpringXsltFilePath)) { dd2SpringXsltFilePath = (String) anApplicationContext .get(UimaAsynchronousEngine.DD2SpringXsltFilePath); } else { throw new ResourceConfigurationException( ResourceConfigurationException.MANDATORY_VALUE_MISSING, new Object[] { "Xslt File Path" }); } if (anApplicationContext.containsKey(UimaAsynchronousEngine.SaxonClasspath)) { saxonClasspath = (String) anApplicationContext.get(UimaAsynchronousEngine.SaxonClasspath); } else { throw new ResourceConfigurationException( ResourceConfigurationException.MANDATORY_VALUE_MISSING, new Object[] { "Saxon Classpath" }); } Dd2spring dd2Spring = new Dd2spring(); File springContextFile = dd2Spring.convertDd2Spring(aDeploymentDescriptor, dd2SpringXsltFilePath, saxonClasspath, (String) anApplicationContext .get(UimaAsynchronousEngine.UimaEeDebug)); return springContextFile.getAbsolutePath(); } /** * Deploys provided context files ( and beans) in a new Spring container. * */ protected String deploySpringContainer(String[] springContextFiles) throws ResourceInitializationException { SpringContainerDeployer springDeployer = new SpringContainerDeployer(); try { return springDeployer.deploy(springContextFiles); } catch (ResourceInitializationException e) { // turn on the global flag so that the stop() can do the cleanup running = true; throw e; } } protected void waitForServiceNotification() throws Exception { while (!serviceInitializationCompleted) { if (serviceInitializationException) { throw new ResourceInitializationException(); } if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "waitForServiceNotification", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_awaiting_container_init__INFO", new Object[] {}); } try { serviceSemaphore.acquire(); } catch (InterruptedException e) { } finally { serviceSemaphore.release(); } if (serviceInitializationException) { throw new ResourceInitializationException(); } } } protected void deployEmbeddedBroker() throws Exception { // TBI } public static void main(String[] args) { try { BaseUIMAAsynchronousEngineCommon_impl uimaee = new BaseUIMAAsynchronousEngine_impl(); Map appContext = new HashMap(); appContext.put(UimaAsynchronousEngine.DD2SpringXsltFilePath, args[1]); appContext.put(UimaAsynchronousEngine.SaxonClasspath, args[2]); String containerId = uimaee.deploy(args[0], appContext); // args[1], // args[2]); uimaee.undeploy(containerId); } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "main", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } public void setReleaseCASMessage(TextMessage msg, String aCasReferenceId) throws Exception { msg.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.None); msg.setStringProperty(AsynchAEMessage.CasReference, aCasReferenceId); msg.setIntProperty(AsynchAEMessage.MessageType, AsynchAEMessage.Request); msg.setIntProperty(AsynchAEMessage.Command, AsynchAEMessage.ReleaseCAS); msg.setStringProperty(UIMAMessage.ServerURI, brokerURI); msg.setJMSReplyTo(consumerDestination); } public void notifyOnInitializationFailure(Exception e) { notifyOnInitializationFailure(null, e); } public void notifyOnInitializationSuccess() { notifyOnInitializationSuccess(null); } public void notifyOnInitializationFailure(AnalysisEngineController aController, Exception e) { // Initialization exception. Notify blocking thread and indicate a problem serviceInitializationException = true; if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "notifyOnInitializationFailure", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_container_init_exception__WARNING", e); } serviceSemaphore.release(); } public void notifyOnInitializationSuccess(AnalysisEngineController aController) { serviceInitializationCompleted = true; serviceSemaphore.release(); } public void notifyOnTermination(String aServiceName) { notifyOnTermination(aServiceName, null, null); } public void notifyOnTermination(String aServiceName, String aCasReferenceId, Exception cause) { // super.n } protected MessageProducer getMessageProducer(Destination destination) throws Exception { return sender.getMessageProducer(destination); } /** * Request Uima AS client to initiate sending Stop requests to a service for all outstanding CASes * awaiting reply. * */ public void stopProducingCases() { List outstandingCasList = serviceDelegate.getDelegateCasesPendingReply(); for (DelegateEntry entry : outstandingCasList) { // The Cas is still being processed ClientRequest clientCachedRequest = (ClientRequest) clientCache .get(entry.getCasReferenceId()); if (clientCachedRequest != null && !clientCachedRequest.isMetaRequest() && clientCachedRequest.getCasReferenceId() != null) { stopProducingCases(clientCachedRequest); } } } /** * Request Uima AS client to initiate sending Stop request to a service for a given CAS id If the * service is a Cas Multiplier, it will stop producing new CASes, will wait until all child CASes * finish and finally returns the input CAS. * */ public void stopProducingCases(String aCasReferenceId) { // The Cas is still being processed ClientRequest clientCachedRequest = (ClientRequest) clientCache.get(aCasReferenceId); if (clientCachedRequest != null) { stopProducingCases(clientCachedRequest); } } private void stopProducingCases(ClientRequest clientCachedRequest) { try { if (clientCachedRequest.getFreeCasNotificationQueue() != null) { TextMessage msg = createTextMessage(); msg.setText(""); msg.setIntProperty(AsynchAEMessage.Payload, AsynchAEMessage.None); msg .setStringProperty(AsynchAEMessage.CasReference, clientCachedRequest .getCasReferenceId()); msg.setIntProperty(AsynchAEMessage.MessageType, AsynchAEMessage.Request); msg.setIntProperty(AsynchAEMessage.Command, AsynchAEMessage.Stop); msg.setStringProperty(UIMAMessage.ServerURI, brokerURI); try { MessageProducer msgProducer = getMessageProducer(clientCachedRequest .getFreeCasNotificationQueue()); if (msgProducer != null) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "stopProducingCases", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_client_sending_stop_to_service__INFO", new Object[] {clientCachedRequest.getCasReferenceId(),clientCachedRequest.getFreeCasNotificationQueue()}); } // Send STOP message to Cas Multiplier Service msgProducer.send(msg); } else { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "stopProducingCases", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_client_unable_to_send_stop_to_cm__WARNING"); } } } catch (Exception ex) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "stopProducingCases", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", ex); } } } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "stopProducingCases", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } protected MessageSender getDispatcher() { return sender; } public void notifyOnReconnecting(String aMessage) { } public void notifyOnReconnectionSuccess() { } } InvalidContainerException.java000066400000000000000000000023521160020716200353450ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/client/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.client; public class InvalidContainerException extends Exception { public InvalidContainerException() { } public InvalidContainerException(String message) { super(message); } public InvalidContainerException(Throwable cause) { super(cause); } public InvalidContainerException(String message, Throwable cause) { super(message, cause); } } uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/service/000077500000000000000000000000001160020716200276315ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/service/UIMA_Service.java000066400000000000000000000471341160020716200327200ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.adapter.jms.service; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InvalidClassException; import java.net.Socket; import org.apache.uima.UIMAFramework; import org.apache.uima.UimaContext; import org.apache.uima.UimaContextAdmin; import org.apache.uima.aae.UimaAsVersion; import org.apache.uima.aae.controller.AnalysisEngineController; import org.apache.uima.aae.jmx.monitor.BasicUimaJmxMonitorListener; import org.apache.uima.aae.jmx.monitor.JmxMonitor; import org.apache.uima.aae.jmx.monitor.JmxMonitorListener; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.adapter.jms.activemq.SpringContainerDeployer; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.support.FileSystemXmlApplicationContext; public class UIMA_Service implements ApplicationListener { private static final Class CLASS_NAME = UIMA_Service.class; protected boolean serviceInitializationCompleted; protected boolean serviceInitializationException; protected Object serviceMonitor = new Object(); private JmxMonitor monitor = null; private Thread monitorThread = null; /** * Parse command args, run dd2spring on the deployment descriptors to generate Spring context * files. * * @param args * - command line arguments * @return - an array of Spring context files generated from provided deployment descriptors * @throws Exception */ public String[] initialize(String[] args) throws Exception { UIMAFramework.getLogger(CLASS_NAME).log(Level.INFO, "UIMA-AS version " + UimaAsVersion.getFullVersionString()); String[] springConfigFileArray = {}; String[] deploymentDescriptors = {}; int nbrOfArgs = args.length; deploymentDescriptors = getMultipleArg("-d", args); if (deploymentDescriptors.length == 0) { // allow multiple args for one key deploymentDescriptors = getMultipleArg2("-dd", args); } String saxonURL = getArg("-saxonURL", args); String xslTransform = getArg("-xslt", args); String uimaAsDebug = getArg("-uimaEeDebug", args); if (nbrOfArgs < 1 || (args[0].startsWith("-") && (deploymentDescriptors.length == 0 || saxonURL.equals("") || xslTransform.equals("")))) { printUsageMessage(); return null; } String brokerURL = getArg("-brokerURL", args); // Check if broker URL is specified on the command line. If it is not, use the default // localhost:61616. In either case, set the System property defaultBrokerURL. It will be used // by Spring Framework to substitute a place holder in Spring xml. if (brokerURL != "") { System.setProperty("defaultBrokerURL", brokerURL); System.out.println(">>> Setting defaultBrokerURL to:" + brokerURL); } else if ( System.getProperty("defaultBrokerURL") == null) { // perhaps already set using -D System.setProperty("defaultBrokerURL", "tcp://localhost:61616"); } if (System.getProperty(JmsConstants.SessionTimeoutOverride) != null) { System.out.println(">>> Setting Inactivity Timeout To: " + System.getProperty(JmsConstants.SessionTimeoutOverride)); } if (deploymentDescriptors.length == 0) { // array of context files passed in springConfigFileArray = args; } else { // create a String array of spring context files springConfigFileArray = new String[deploymentDescriptors.length]; Dd2spring aDd2Spring = new Dd2spring(); for (int dd = 0; dd < deploymentDescriptors.length; dd++) { String deploymentDescriptor = deploymentDescriptors[dd]; File springConfigFile = aDd2Spring.convertDd2Spring(deploymentDescriptor, xslTransform, saxonURL, uimaAsDebug); // if any are bad, fail if (null == springConfigFile) { return null; } springConfigFileArray[dd] = springConfigFile.getAbsolutePath(); // get the descriptor to register with the engine controller String deployDescriptor = ""; File afile = null; FileInputStream fis = null; try { afile = new File(deploymentDescriptor); fis = new FileInputStream(afile); byte[] bytes = new byte[(int) afile.length()]; fis.read(bytes); deployDescriptor = new String(bytes); // Log Deployment Descriptor UIMAFramework.getLogger(CLASS_NAME).logrb(Level.FINEST, CLASS_NAME.getName(), "main", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_deploy_desc__FINEST", new Object[] { deployDescriptor }); } catch (IOException e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "initialize", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { } } } } } return springConfigFileArray; } /** * Deploy Spring context files in a Spring Container. * * @param springContextFiles * - array of Spring context files * * @throws Exception */ public SpringContainerDeployer deploy(String[] springContextFiles) throws Exception { SpringContainerDeployer springDeployer = new SpringContainerDeployer(); // now try to deploy the array of spring context files springDeployer.deploy(springContextFiles); // Poll the deployer for the initialization status. Wait for either successful // initialization or failure. while (!springDeployer.isInitialized() ) { if ( springDeployer.initializationFailed()) { throw new ResourceInitializationException(); } synchronized (springDeployer) { springDeployer.wait(100); } } // Check if the deployer failed // Register this class to receive Spring container notifications. Specifically, looking // for an even signaling the container termination. This is done so that we can stop // the monitor thread FileSystemXmlApplicationContext context = springDeployer.getSpringContext(); context.addApplicationListener(this); springDeployer.startListeners(); return springDeployer; } /** * Creates an instance of a {@link JmxMonitor}, initializes it with the JMX Server URI and * checkpoint frequency, and finally starts the monitor. * * @param samplingFrequency * - how often the JmxMonitor should checkpoint to fetch service metrics * * @throws Exception * - error on monitor initialization or startup */ public void startMonitor(long samplingFrequency) throws Exception { monitor = new JmxMonitor(); // Check if the monitor should run in the verbose mode. In this mode // the monitor dumps JMX Server URI, and a list of UIMA-AS services // found in that server. The default is to not show this info. if (System.getProperty("verbose") != null) { monitor.setVerbose(); } // Use the URI provided in the first arg to connect to the JMX server. // Also define sampling frequency. The monitor will collect the metrics // at this interval. String jmxServerPort = null; // get the port of the JMX Server. This property can be set on the command line via -d // OR it is set automatically by the code that creates an internal JMX Server. The latter // is created in the {@link BaseAnalysisEngineController} constructor. if ((jmxServerPort = System.getProperty("com.sun.management.jmxremote.port")) != null) { // parameter is set, compose the URI String jmxServerURI = "service:jmx:rmi:///jndi/rmi://localhost:" + jmxServerPort + "/jmxrmi"; // Connect to the JMX Server, configure checkpoint frequency, create MBean proxies for // UIMA-AS MBeans and service input queues monitor.initialize(jmxServerURI, samplingFrequency); // Create formatter listener JmxMonitorListener listener = null; String formatterListenerClass = null; // Check if a custom monitor formatter listener class is provided. The user provides this // formatter by adding a -Duima.jmx.monitor.formatter= parameter which specifies a class // that implements {@link JmxMonitorListener} interface if ((formatterListenerClass = System.getProperty(JmxMonitor.FormatterListener)) != null) { Object object = null; try { // Instantiate the formatter listener class Class formatterClass = Class.forName(formatterListenerClass); object = formatterClass.newInstance(); } catch (ClassNotFoundException e) { System.out .println("Class Not Found:" + formatterListenerClass + ". Provide a Formatter Class Which Implements:org.apache.uima.aae.jmx.monitor.JmxMonitorListener"); throw e; } if (object instanceof JmxMonitorListener) { listener = (JmxMonitorListener) object; } else { throw new InvalidClassException( "Invalid Monitor Formatter Class:" + formatterListenerClass + ".The Monitor Requires a Formatter Which Implements:org.apache.uima.aae.jmx.monitor.JmxMonitorListener"); } } else { // The default formatter listener which logs to the UIMA log listener = new BasicUimaJmxMonitorListener(monitor.getMaxServiceNameLength()); } // Plug in the monitor listener monitor.addJmxMonitorListener(listener); // Create and start the monitor thread monitorThread = new Thread(monitor); // Start the monitor thread. It will run until the Spring container stops. When this happens // the UIMA_Service receives notication via a {@code onApplicationEvent()} callback. There // the monitor is stopped allowing the service to terminate. monitorThread.start(); System.out.println(">>> Started JMX Monitor.\n\t>>> MBean Server Port:" + jmxServerPort + "\n\t>>> Monitor Sampling Interval:" + samplingFrequency + "\n\t>>> Monitor Formatter Class:" + listener.getClass().getName()); } } /** * scan args for a particular arg, return the following token or the empty string if not found * * @param id * the arg to search for * @param args * the array of strings * @return the following token, or a 0 length string if not found */ private static String getArg(String id, String[] args) { for (int i = 0; i < args.length; i++) { if (id.equals(args[i])) return (i + 1 < args.length) ? args[i + 1] : ""; } return ""; } /** * scan args for a particular arg, return the following token(s) or the empty string if not found * * @param id * the arg to search for * @param args * the array of strings * @return the following token, or a 0 length string array if not found */ private static String[] getMultipleArg(String id, String[] args) { String[] retr = {}; for (int i = 0; i < args.length; i++) { if (id.equals(args[i])) { String[] temp = new String[retr.length + 1]; for (int s = 0; s < retr.length; s++) { temp[s] = retr[s]; } retr = temp; retr[retr.length - 1] = (i + 1 < args.length) ? args[i + 1] : null; } } return retr; } /** * scan args for a particular arg, return the following token(s) or the empty string if not found * * @param id * the arg to search for * @param args * the array of strings * @return the following token, or a 0 length string array if not found */ private static String[] getMultipleArg2(String id, String[] args) { String[] retr = {}; for (int i = 0; i < args.length; i++) { if (id.equals(args[i])) { int j = 0; while ((i + 1 + j < args.length) && !args[i + 1 + j].startsWith("-")) { String[] temp = new String[retr.length + 1]; for (int s = 0; s < retr.length; s++) { temp[s] = retr[s]; } retr = temp; retr[retr.length - 1] = args[i + 1 + j++]; } return retr; } } return retr; } protected void finalize() { System.err.println(this + " finalized"); } private static void printUsageMessage() { System.out .println(" Arguments to the program are as follows : \n" + "-d path-to-UIMA-Deployment-Descriptor [-d path-to-UIMA-Deployment-Descriptor ...] \n" + "-saxon path-to-saxon.jar \n" + "-xslt path-to-dd2spring-xslt\n" + " or\n" + "path to Spring XML Configuration File which is the output of running dd2spring\n" + "-defaultBrokerURL the default broker URL to use for the service and all its delegates"); } public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ContextClosedEvent && monitor != null && monitor.isRunning()) { System.out.println("Stopping Monitor"); // Stop the monitor. The service has stopped monitor.doStop(); } } /** * The main routine for starting the deployment of a UIMA-AS instance. The args are either: 1 or * more "paths" to Spring XML descriptors representing the information needed or some number of * parameters, preceeded by a "-" sign. If the first arg doesn't start with a "-" it is presumed * to be the first format. * * For the 2nd style, the arguments are: -saxonURL a-URL-to-the-saxon-jar usually starting with * "file:", -xslt path-to-the-dd2spring.xsl file, -d path-to-UIMA-deployment-descriptor [-d * path-to-another-dd ...] these arguments may be in any order) * * For the 3rd style, like #2 but with multiple dd-files following a single -dd Useful for calling * from scripts. * * @param args */ public static void main(String[] args) { try { UIMA_Service service = new UIMA_Service(); // parse command args and run dd2spring to generate spring context // files from deployment descriptors String contextFiles[] = service.initialize(args); // If no context files generated there is nothing to do if (contextFiles == null) { return; } // Deploy components defined in Spring context files. This method blocks until // the container is fully initialized and all UIMA-AS components are succefully // deployed. SpringContainerDeployer serviceDeployer = service.deploy(contextFiles); if (serviceDeployer == null) { System.out.println(">>> Failed to Deploy UIMA Service. Check Logs for Details"); System.exit(1); } // Add a shutdown hook to catch kill signal and to force quiesce and stop ServiceShutdownHook shutdownHook = new ServiceShutdownHook(serviceDeployer); Runtime.getRuntime().addShutdownHook(shutdownHook); // Check if we should start an optional JMX-based monitor that will provide service metrics // The monitor is enabled by existence of -Duima.jmx.monitor.interval= parameter. By // default // the monitor is not enabled. String monitorCheckpointFrequency; if ((monitorCheckpointFrequency = System.getProperty(JmxMonitor.SamplingInterval)) != null) { // Found monitor checkpoint frequency parameter, configure and start the monitor. // If the monitor fails to initialize the service is not effected. service.startMonitor(Long.parseLong(monitorCheckpointFrequency)); } AnalysisEngineController topLevelControllor = serviceDeployer.getTopLevelController(); String prompt = "Press 'q'+'Enter' to quiesce and stop the service or 's'+'Enter' to stop it now.\nNote: selected option is not echoed on the console."; if (topLevelControllor != null) { System.out.println(prompt); // Loop forever or until the service is stopped while (!topLevelControllor.isStopped()) { if (System.in.available() > 0) { int c = System.in.read(); if (c == 's') { serviceDeployer.undeploy(SpringContainerDeployer.STOP_NOW); } else if (c == 'q') { serviceDeployer.undeploy(SpringContainerDeployer.QUIESCE_AND_STOP); } else if (Character.isLetter(c) || Character.isDigit(c)) { System.out.println(prompt); } } // This is a polling loop. Sleep for 1 sec try { if (!topLevelControllor.isStopped()) Thread.sleep(1000); } catch (InterruptedException ex) { } } // while } } catch (Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "main", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } static class ServiceShutdownHook extends Thread { public SpringContainerDeployer serviceDeployer; public ServiceShutdownHook(SpringContainerDeployer serviceDeployer) { this.serviceDeployer = serviceDeployer; } public void run() { try { AnalysisEngineController topLevelController = serviceDeployer.getTopLevelController(); if (topLevelController != null && !topLevelController.isStopped() ) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "run", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_caught_signal__INFO", new Object[] { topLevelController.getComponentName() }); serviceDeployer.undeploy(SpringContainerDeployer.QUIESCE_AND_STOP); } } catch( Exception e) { if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, CLASS_NAME.getName(), "run", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, "UIMAJMS_exception__WARNING", e); } } } } } uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/examples/000077500000000000000000000000001160020716200255765ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/examples/as/000077500000000000000000000000001160020716200262015ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/examples/as/GetMetaRequest.java000066400000000000000000000246631160020716200317560ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.examples.as; import java.net.URI; import java.util.HashSet; import java.util.Set; import javax.jms.Connection; import javax.jms.MessageConsumer; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TemporaryQueue; import javax.jms.TextMessage; import javax.management.MBeanServerConnection; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; import javax.management.QueryExp; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.jmx.QueueViewMBean; import org.apache.activemq.command.ActiveMQTextMessage; import org.apache.uima.aae.message.AsynchAEMessage; import org.apache.uima.aae.message.UIMAMessage; import org.springframework.jmx.JmxException; /** * */ public class GetMetaRequest { private static MBeanServerConnection brokerMBeanServer = null; private static String brokerName; private static JMXConnector jmxc = null; private static boolean initialized = false; private static enum QueueState {exists, existsnot, jmxnot}; private static String jmxPort; public static void main(String[] args) { if (args.length < 2) { System.err.println("Need arguments: brokerURI serviceName [-verbose]"); System.exit(1); } String brokerURI = args[0]; String queueName = args[1]; boolean printReply = false; if(args.length > 2) { if (args[2].equalsIgnoreCase("-verbose")) { printReply = true; } else { System.err.println("Unknown argument: " + args[2]); System.exit(1); } } Connection connection = null; Session producerSession = null; Queue producerQueue = null; MessageProducer producer = null; MessageConsumer consumer = null; Session consumerSession = null; TemporaryQueue consumerDestination = null; long startTime = 0; // Check if JMX server port number was specified jmxPort = System.getProperty("activemq.broker.jmx.port"); if ( jmxPort == null || jmxPort.trim().length() == 0 ) { jmxPort = "1099"; // default } try { URI target = new URI(brokerURI); String brokerHost = target.getHost(); attachToRemoteBrokerJMXServer(brokerURI); if (isQueueAvailable(queueName) == QueueState.exists) { System.out.println("Queue "+queueName+" found on "+ brokerURI); System.out.println("Sending getMeta..."); } else if (isQueueAvailable(queueName) == QueueState.existsnot) { System.err.println("Queue "+queueName+" does not exist on "+ brokerURI); System.exit(1); } else { System.out.println("Cannot see queues on JMX port "+brokerHost+":"+jmxPort); System.out.println("Sending getMeta anyway..."); } ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(brokerURI); connection = factory.createConnection(); connection.start(); producerSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); producerQueue = producerSession.createQueue(queueName); producer = producerSession.createProducer(producerQueue); consumerSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); consumerDestination = consumerSession.createTemporaryQueue(); consumer = consumerSession.createConsumer(consumerDestination); TextMessage msg = producerSession.createTextMessage(); msg.setStringProperty(AsynchAEMessage.MessageFrom, consumerDestination.getQueueName()); msg.setStringProperty(UIMAMessage.ServerURI, brokerURI); msg.setIntProperty(AsynchAEMessage.MessageType, AsynchAEMessage.Request); msg.setIntProperty(AsynchAEMessage.Command, AsynchAEMessage.GetMeta); msg.setJMSReplyTo(consumerDestination); msg.setText(""); producer.send(msg); startTime = System.nanoTime(); System.out.println("Sent getMeta request to " + queueName + " at " + brokerURI); System.out.println("Waiting for reply..."); ActiveMQTextMessage reply = (ActiveMQTextMessage) consumer.receive(); long waitTime = (System.nanoTime() - startTime)/1000000; System.out.println("Reply received in " + waitTime + " ms"); if (printReply) { System.out.println("Reply MessageText: " + reply.getText()); } System.exit(0); } catch (Exception e) { System.err.println(e.toString()); // e.printStackTrace(); } } /** * Connects to this service Broker's JMX Server. If unable to connect, this method * fails silently. The method uses default JMX Port number 1099 to create a connection * to the Broker's JMX MBean server. The default can be overridden via System * property 'activemq.broker.jmx.port'. If connection cannot be established the * method silently fails. * */ private static void attachToRemoteBrokerJMXServer(String brokerUri) throws Exception { // Fetch AMQ jmx domain from system properties. This property is not required // and the default AMQ jmx is used. The only exception is when the service is // deployed in a jvm with multiple brokers deployed as it is the case with jUnit // tests. In such a case, each broker will register self with JMX using a different // domain. String jmxAMQDomain = System.getProperty("activemq.broker.jmx.domain"); if ( jmxAMQDomain == null ) { jmxAMQDomain = "org.apache.activemq"; // default } String brokerHostname=""; URI target = new URI(brokerUri); brokerHostname = target.getHost(); initialize(jmxAMQDomain, brokerHostname,jmxPort); } /** * Creates a connection to an MBean Server identified by * remoteJMXServerHostName and remoteJMXServerPort * * @param remoteJMXServerHostName * - MBeanServer host name * @param remoteJMXServerPort * - MBeanServer port * @return - none * * @throws Exception */ private static void initialize(String jmxDomain, String remoteJMXServerHostname, String remoteJMXServerPort) throws Exception { // Construct connect string to the JMX MBeanServer String remoteJmxUrl = "service:jmx:rmi:///jndi/rmi://" + remoteJMXServerHostname + ":" + remoteJMXServerPort + "/jmxrmi"; try { JMXServiceURL url = new JMXServiceURL(remoteJmxUrl); jmxc = JMXConnectorFactory.connect(url, null); brokerMBeanServer = jmxc.getMBeanServerConnection(); // Its possible that the above code succeeds even though the broker runs // with no JMX Connector. At least on windows the above does not throw an // exception as expected. It appears that the broker registers self JVMs MBeanServer // but it does *not* register any Connections, nor Queues. The code below // checks if the MBean server we are connected to has any QueueMBeans registered. // A broker with jmx connector should have queue mbeans registered and thus // the code below should always succeed. Conversely, a broker with no jmx connector // reports no queue mbeans. // Query broker MBeanServer for QueueMBeans Set queueSet = brokerMBeanServer.queryNames(new ObjectName(jmxDomain + ":*,Type=Queue"), (QueryExp) null); if ( queueSet.isEmpty() ) { // No QueueMBeans, meaning no JMX support throw new JmxException("ActiveMQ Broker Not Configured With JMX Support"); } } catch (Exception e) { return; } // Query JMX Server for Broker MBean. We need the broker's name from an MBean to construct // queue query string. for (Object nameObject : brokerMBeanServer.queryNames(new ObjectName(jmxDomain + ":*,Type=Broker"), (QueryExp) null)) { ObjectName brokerObjectName = (ObjectName) nameObject; if (brokerObjectName.getCanonicalName().endsWith("Type=Broker")) { // Extract just the name from the canonical name brokerName = brokerObjectName.getCanonicalName().substring(0, brokerObjectName.getCanonicalName().indexOf(",")); initialized = true; break; // got the broker name } } } private static boolean isServerAvailable() { try { brokerMBeanServer.getMBeanCount(); return true; } catch (Exception e) { return false; } } private static QueueState isQueueAvailable(String queueName) throws Exception { if (!initialized) { return QueueState.jmxnot; } ObjectName uimaServiceQueuePattern = new ObjectName(brokerName + ",Type=Queue,Destination=" + queueName); // Tests if queue exists. If a client terminates, the reply queue will be removed and we // expect null from getQueueMBean() if (isServerAvailable() && getQueueMBean(queueName, uimaServiceQueuePattern) == null) { return QueueState.existsnot; } return QueueState.exists; } private static QueueViewMBean getQueueMBean(String key, ObjectName matchPattern) throws Exception { // Fetch queue names matching a given pattern. Set queues = new HashSet(brokerMBeanServer.queryNames(matchPattern, null)); for (ObjectName name : queues) { // Create and return a proxy to the queue's MBean return (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(brokerMBeanServer, name, QueueViewMBean.class, true); } return null; } } uima-as-2.3.1/uimaj-as-activemq/src/main/java/org/apache/uima/examples/as/RunRemoteAsyncAE.java000066400000000000000000000506431160020716200322000ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.examples.as; import java.io.File; import java.io.FileOutputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.client.UimaASProcessStatus; import org.apache.uima.aae.client.UimaAsBaseCallbackListener; import org.apache.uima.aae.client.UimaAsynchronousEngine; import org.apache.uima.adapter.jms.client.BaseUIMAAsynchronousEngine_impl; import org.apache.uima.cas.CAS; import org.apache.uima.cas.FSIterator; import org.apache.uima.cas.Feature; import org.apache.uima.cas.FeatureStructure; import org.apache.uima.cas.Type; import org.apache.uima.cas.impl.XmiCasSerializer; import org.apache.uima.collection.CollectionReader; import org.apache.uima.collection.CollectionReaderDescription; import org.apache.uima.collection.EntityProcessStatus; import org.apache.uima.util.ProcessTraceEvent; import org.apache.uima.util.XMLInputSource; /** * Example application that calls a Remote Asynchronous Analysis Engine on a collection. *

* Arguments: brokerUrl endpoint [options] [-t Timeout] [-i] *

* This connects to a remote AE at specified brokerUrl and endpoint (which must match what is in the * service's deployment descriptor. The following optional arguments are accepted: *

    *
  • -d Specifies a deployment descriptor. The specified service will be deployed before * processing begin, and the service will be undeployed after processing completes. Multiple -d * entries can be given.
  • *
  • -c Specifies a CollectionReader descriptor. The client will read CASes from the * CollectionReader and send them to the service for processing. If this option is ommitted, one * empty CAS will be sent to the service (useful for services containing a CAS Multiplier acting as * a collection reader).
  • *
  • -p Specifies CAS pool size, which determines the maximum number of requests that can be * outstanding.
  • *
  • -f Specifies the initial FS heap size in bytes of each CAS in the pool.
  • *
  • -o Specifies an Output Directory. All CASes received by the client's CallbackListener will be * serialized to XMI in the specified OutputDir. If ommitted, no XMI files will be output.
  • *
  • -t Specifies a timeout period in seconds. If a CAS does not return within this time period it * is considered an error. By default there is no timeout, so the client will wait forever.
  • *
  • -i Causes the client to ignore errors returned from the service. If not specified, the client * terminates on the first error.
  • *
  • -log Output details on each process request.
  • *
  • -uimaEeDebug true causes various debugging things to happen, including *not* deleting the * generated spring file generated by running dd-2-spring. This parameter only affects deployments * specified using the -d parameter that follow it in the command line sequence.
  • *
*/ public class RunRemoteAsyncAE { private String brokerUrl = null; private String endpoint = null; private File collectionReaderDescriptor = null; private int casPoolSize = 2; private int fsHeapSize = 2000000; private File outputDir = null; private int timeout = 0; private int getmeta_timeout = 60; private int cpc_timeout = 0; private boolean ignoreErrors = false; private boolean logCas = false; /** * Start time of the processing - used to compute elapsed time. */ private static long mStartTime = System.nanoTime() / 1000000; private UimaAsynchronousEngine uimaEEEngine = null; Map appCtx; // For logging CAS activity private ConcurrentHashMap casMap = new ConcurrentHashMap(); /** * Constructor for the class. Parses command line arguments and sets the values of fields in this * instance. If command line is invalid prints a message and calls System.exit(). * * @param args * command line arguments into the program - see class description */ public RunRemoteAsyncAE(String args[]) throws Exception { appCtx = new HashMap(); appCtx.put(UimaAsynchronousEngine.DD2SpringXsltFilePath, System.getenv("UIMA_HOME") + "/bin/dd2spring.xsl"); appCtx.put(UimaAsynchronousEngine.SaxonClasspath, "file:" + System.getenv("UIMA_HOME") + "/saxon/saxon8.jar"); // parse command line for (int i = 0; i < args.length; i++) { if (args[i].startsWith("-")) { if (args[i].equals("-log")) { logCas = true; } else if (args[i].equals("-b")) { appCtx.put(UimaAsynchronousEngine.SerializationStrategy, "binary"); } else if (args[i].equals("-i")) { ignoreErrors = true; } else { if (i + 1 >= args.length) { printUsageAndExit(); } if (args[i].equals("-c")) { collectionReaderDescriptor = new File(args[++i]); if (!collectionReaderDescriptor.exists()) { System.err.println("Collection Reader Descriptor file " + collectionReaderDescriptor.getPath() + " does not exist."); printUsageAndExit(); } } else if (args[i].equals("-p")) { casPoolSize = Integer.parseInt(args[++i]); } else if (args[i].equals("-f")) { fsHeapSize = Integer.parseInt(args[++i]); } else if (args[i].equals("-o")) { outputDir = new File(args[++i]); if (outputDir.exists()) { if (!outputDir.isDirectory()) { System.err.println(outputDir.getPath() + " is not a directory."); printUsageAndExit(); } } else { if (!outputDir.mkdirs()) { System.err.println("Could not create directory " + outputDir.getPath()); printUsageAndExit(); } } } else if (args[i].equals("-d")) { if (uimaEEEngine == null) { // create Asynchronous Engine uimaEEEngine = new BaseUIMAAsynchronousEngine_impl(); } String service = args[++i]; System.out.println("Attempting to deploy " + service + " ..."); uimaEEEngine.deploy(service, appCtx); } else if (args[i].equals("-t")) { timeout = Integer.parseInt(args[++i]); } else if (args[i].equals("-it")) { getmeta_timeout = Integer.parseInt(args[++i]); } else if (args[i].equals("-cpct")) { cpc_timeout = Integer.parseInt(args[++i]); } else if (args[i].equals(UimaAsynchronousEngine.UimaEeDebug)) { appCtx.put(UimaAsynchronousEngine.UimaEeDebug, args[++i]); } else { System.err.println("Unknown switch " + args[i]); printUsageAndExit(); } } } else { if (brokerUrl == null) { brokerUrl = args[i]; // Set System property that may be used by Spring while resolving a broker URL // placeholder in the deployment descriptor. This is only used when launching // RunRemoteAsyncAE with -d option. System.setProperty("defaultBrokerURL", brokerUrl); } else if (endpoint == null) { endpoint = args[i]; } else { printUsageAndExit(); } } } if (brokerUrl == null || endpoint == null) { printUsageAndExit(); } } public void run() throws Exception { if (uimaEEEngine == null) { // create Asynchronous Engine uimaEEEngine = new BaseUIMAAsynchronousEngine_impl(); } // add Collection Reader if specified if (collectionReaderDescriptor != null) { CollectionReaderDescription collectionReaderDescription = UIMAFramework.getXMLParser() .parseCollectionReaderDescription(new XMLInputSource(collectionReaderDescriptor)); CollectionReader collectionReader = UIMAFramework .produceCollectionReader(collectionReaderDescription); uimaEEEngine.setCollectionReader(collectionReader); } uimaEEEngine.addStatusCallbackListener(new StatusCallbackListenerImpl()); // set server URI and Endpoint // Add Broker URI appCtx.put(UimaAsynchronousEngine.ServerUri, brokerUrl); // Add Queue Name appCtx.put(UimaAsynchronousEngine.Endpoint, endpoint); // Add timeouts (UIMA EE expects it in milliseconds, but we use seconds on the command line) appCtx.put(UimaAsynchronousEngine.Timeout, timeout * 1000); appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, getmeta_timeout * 1000); appCtx.put(UimaAsynchronousEngine.CpcTimeout, cpc_timeout * 1000); // Add the Cas Pool Size and initial FS heap size appCtx.put(UimaAsynchronousEngine.CasPoolSize, casPoolSize); appCtx.put(UIMAFramework.CAS_INITIAL_HEAP_SIZE, Integer.valueOf(fsHeapSize / 4).toString()); // initialize uimaEEEngine.initialize(appCtx); // run if (logCas) { System.out.println("\nService-IPaddr\tSent\tDuration"); } if (collectionReaderDescriptor != null) { uimaEEEngine.process(); } else { // send an empty CAS CAS cas = uimaEEEngine.getCAS(); uimaEEEngine.sendCAS(cas); uimaEEEngine.collectionProcessingComplete(); } // if (logCas) { // System.out.println(); // List log = getLog(); // Iterator logline = log.iterator(); // while (logline.hasNext()) { // System.out.println(logline.next()); // } // } uimaEEEngine.stop(); } /** * */ private static void printUsageAndExit() { System.out .println("Usage: runRemoteAsyncAE brokerUrl endpoint [options]\n\n" + "This connects to a remote AE at specified brokerUrl and endpoint (which must match what is in the service's\n" + "deployment descriptor.\n\nThe following optional arguments are accepted:\n" + "-d Specifies a deployment descriptor. The specified service will be deployed before processing begins." + " Multiple -d entries can be given.\n" + "-c Specifies a CollectionReader descriptor. The client will read CASes from the CollectionReader" + " and send them to the service for processing. If this option is ommitted, one empty CAS will be" + " sent to the service (useful for services containing a CAS Multiplier acting as a collection reader).\n" + "-b Use binary serialization (default is xmi)\n" + "-p Specifies CAS pool size, which determines the maximum number of requests that can be outstanding.\n" + "-f Specifies the initial FS heap size in bytes of each CAS in the pool.\n" + "-o Specifies an Output Directory. All CASes received by the client's CallbackListener will be serialized to XMI" + " in the specified OutputDir. If ommitted, no XMI files will be output.\n" + "-t Specifies a timeout period in seconds. If a CAS does not return within this time period it" + " is considered an error. By default there is no timeout, so the client will wait forever.\n" + "-it Specifies a timeout period in seconds. If the initialization request does not return within this time period it" + " is considered an error. By default the timeout is 60 seconds.\n" + "-cpct Specifies a timeout period in seconds. When all CAS requests are completed, a collection process complete" + " command is sent. By default there is no timeout for CPC, so the client will wait forever.\n" + "-log Output details on each process request: IP address of service that handled the request,\n" + " time in ms the CAS was sent, duration in ms from sendCas to receipt.\n" + "-i Causes the client to ignore errors returned from the service. If not specified, the client" + " terminates on the first error (including a timeout if the -t option is specified.\n" + "-uimaEeDebug true This is optional. Leave it out for normal operation. If specified, causes" + " additional debugging things to happen, including *not* deleting the generated Spring xml file generated" + " from running dd2spring. It only affects deployments specified using the -d parameter that follow it on" + " the command line"); System.exit(1); } /** * main class. * * @param args * Command line arguments - see class description */ public static void main(String[] args) throws Exception { RunRemoteAsyncAE runner = new RunRemoteAsyncAE(args); runner.run(); } /** * Callback Listener. Receives event notifications from CPE. * * */ class StatusCallbackListenerImpl extends UimaAsBaseCallbackListener { int entityCount = 0; long size = 0; /** * Called when the initialization is completed. * * @see org.apache.uima.collection.processing.StatusCallbackListener#initializationComplete() */ public void initializationComplete(EntityProcessStatus aStatus) { if (aStatus != null && aStatus.isException()) { System.err.println("Error on getMeta call to remote service:"); List exceptions = aStatus.getExceptions(); for (int i = 0; i < exceptions.size(); i++) { ((Throwable) exceptions.get(i)).printStackTrace(); } System.err.println("Terminating Client..."); stop(); } System.out.println("UIMA AS Service Initialization Complete"); } private void stop() { try { uimaEEEngine.stop(); } catch( Exception e) { } System.exit(1); } /** * Called when the collection processing is completed. * * @see org.apache.uima.collection.processing.StatusCallbackListener#collectionProcessComplete() */ public void collectionProcessComplete(EntityProcessStatus aStatus) { if (aStatus != null && aStatus.isException()) { System.err.println("Error on collection process complete call to remote service:"); List exceptions = aStatus.getExceptions(); for (int i = 0; i < exceptions.size(); i++) { ((Throwable) exceptions.get(i)).printStackTrace(); } System.err.println("Terminating Client..."); stop(); } System.out.print("Completed " + entityCount + " documents"); if (size > 0) { System.out.print("; " + size + " characters"); } System.out.println(); long elapsedTime = System.nanoTime() / 1000000 - mStartTime; System.out.println("Time Elapsed : " + elapsedTime + " ms "); String perfReport = uimaEEEngine.getPerformanceReport(); if (perfReport != null) { System.out.println("\n\n ------------------ PERFORMANCE REPORT ------------------\n"); System.out.println(uimaEEEngine.getPerformanceReport()); } // stop the JVM. stop(); } /** * Called when the processing of a Document is completed.
* The process status can be looked at and corresponding actions taken. * * @param aCas * CAS corresponding to the completed processing * @param aStatus * EntityProcessStatus that holds the status of all the events for aEntity */ public void entityProcessComplete(CAS aCas, EntityProcessStatus aStatus) { if (aStatus != null) { if (aStatus.isException()) { System.err.println("Error on process CAS call to remote service:"); List exceptions = aStatus.getExceptions(); for (int i = 0; i < exceptions.size(); i++) { ((Throwable) exceptions.get(i)).printStackTrace(); } if (!ignoreErrors) { System.err.println("Terminating Client..."); stop(); } } if (logCas) { String ip = "no IP"; List eList = aStatus.getProcessTrace().getEventsByComponentName("UimaEE", false); for (int e = 0; e < eList.size(); e++) { ProcessTraceEvent event = (ProcessTraceEvent) eList.get(e); if (event.getDescription().equals("Service IP")) { ip = event.getResultMessage(); } } String casId = ((UimaASProcessStatus) aStatus).getCasReferenceId(); if (casId != null) { long current = System.nanoTime() / 1000000 - mStartTime; if (casMap.containsKey(casId)) { Object value = casMap.get(casId); if (value != null && value instanceof Long) { long start = ((Long) value).longValue(); System.out.println(ip + "\t" + start + "\t" + (current - start)); } } } } else { System.out.print("."); if (0 == (entityCount + 1) % 50) { System.out.print((entityCount + 1) + " processed\n"); } } } // if output dir specified, dump CAS to XMI if (outputDir != null) { // try to retreive the filename of the input file from the CAS File outFile = null; Type srcDocInfoType = aCas.getTypeSystem().getType( "org.apache.uima.examples.SourceDocumentInformation"); if (srcDocInfoType != null) { FSIterator it = aCas.getIndexRepository().getAllIndexedFS(srcDocInfoType); if (it.hasNext()) { FeatureStructure srcDocInfoFs = it.get(); Feature uriFeat = srcDocInfoType.getFeatureByBaseName("uri"); Feature offsetInSourceFeat = srcDocInfoType.getFeatureByBaseName("offsetInSource"); String uri = srcDocInfoFs.getStringValue(uriFeat); int offsetInSource = srcDocInfoFs.getIntValue(offsetInSourceFeat); File inFile; try { inFile = new File(new URL(uri).getPath()); String outFileName = inFile.getName(); if (offsetInSource > 0) { outFileName += ("_" + offsetInSource); } outFileName += ".xmi"; outFile = new File(outputDir, outFileName); } catch (MalformedURLException e1) { // invalid URI, use default processing below } } } if (outFile == null) { outFile = new File(outputDir, "doc" + entityCount); } try { FileOutputStream outStream = new FileOutputStream(outFile); try { XmiCasSerializer.serialize(aCas, outStream); } finally { outStream.close(); } } catch (Exception e) { System.err.println("Could not save CAS to XMI file"); e.printStackTrace(); } } // update stats entityCount++; String docText = aCas.getDocumentText(); if (docText != null) { size += docText.length(); } // Called just before sendCas with next CAS from collection reader } public void onBeforeMessageSend(UimaASProcessStatus status) { long current = System.nanoTime() / 1000000 - mStartTime; casMap.put(status.getCasReferenceId(), current); } } } uima-as-2.3.1/uimaj-as-activemq/src/test/000077500000000000000000000000001160020716200201275ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/000077500000000000000000000000001160020716200210505ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/000077500000000000000000000000001160020716200216375ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/000077500000000000000000000000001160020716200230605ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/000077500000000000000000000000001160020716200240135ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/000077500000000000000000000000001160020716200244005ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/multiplier/000077500000000000000000000000001160020716200265665ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/multiplier/SimpleCasGenerator.java000066400000000000000000000114711160020716200331640ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ae.multiplier; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import java.io.File; import java.io.FileInputStream; import java.net.URL; import java.util.Random; import org.apache.uima.UIMAFramework; import org.apache.uima.UimaContext; import org.apache.uima.analysis_component.CasMultiplier_ImplBase; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.cas.AbstractCas; import org.apache.uima.cas.CAS; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; /** * An example CasMultiplier, which generates the specified number of output CASes. */ public class SimpleCasGenerator extends CasMultiplier_ImplBase { private int mCount; private int nToGen; private String text; long docCount = 0; /* * (non-Javadoc) * * @seeorg.apache.uima.analysis_component.AnalysisComponent_ImplBase#initialize(org.apache.uima. * UimaContext) */ public void initialize(UimaContext aContext) throws ResourceInitializationException { super.initialize(aContext); this.nToGen = ((Integer) aContext.getConfigParameterValue("NumberToGenerate")).intValue(); FileInputStream fis = null; try { String filename = ((String) aContext.getConfigParameterValue("InputFile")).trim(); File file = null; try { URL url = this.getClass().getClassLoader().getResource(filename); System.out.println("************ File::::" + url.getPath()); // open input stream to file file = new File(url.getPath()); } catch (Exception e) { file = new File(filename); } fis = new FileInputStream(file); byte[] contents = new byte[(int) file.length()]; fis.read(contents); text = new String(contents); } catch (Exception e) { throw new ResourceInitializationException(e); } finally { if (fis != null) { try { fis.close(); } catch (Exception e) { } } } } /* * (non-Javadoc) * * @see JCasMultiplier_ImplBase#process(JCas) */ public void process(CAS aCas) throws AnalysisEngineProcessException { this.mCount = 0; this.docCount = 0; } /* * (non-Javadoc) * * @see org.apache.uima.analysis_component.AnalysisComponent#hasNext() */ public boolean hasNext() throws AnalysisEngineProcessException { return this.mCount < this.nToGen; } /* * (non-Javadoc) * * @see org.apache.uima.analysis_component.AnalysisComponent#next() */ public AbstractCas next() throws AnalysisEngineProcessException { CAS cas = getEmptyCAS(); /* * int junk = this.gen.nextInt(); if ((junk & 1) != 0) { cas.setDocumentText(this.mDoc1); } else * { cas.setDocumentText(this.mDoc2); } */ if (docCount == 0 && UIMAFramework.getLogger().isLoggable(Level.FINE)) { System.out.println("Initializing CAS with a Document of Size:" + text.length()); } docCount++; if (UIMAFramework.getLogger().isLoggable(Level.FINE)) System.out.println("CasMult creating document#" + docCount); cas.setDocumentText(this.text); this.mCount++; return cas; } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/multiplier/SimpleCasMerger.java000066400000000000000000000100731160020716200324540ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ae.multiplier; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import java.io.File; import java.io.FileInputStream; import java.net.URL; import org.apache.uima.UIMAFramework; import org.apache.uima.UimaContext; import org.apache.uima.analysis_component.CasMultiplier_ImplBase; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.cas.AbstractCas; import org.apache.uima.cas.CAS; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; /** * An example CasMultiplier, which simulates merging of the input CASes. Generates 1 output CAS for * every N input CASes. */ public class SimpleCasMerger extends CasMultiplier_ImplBase { private int docCount = 0; private int genCount = 0; private int nToMerge; private String casMultName; /* * (non-Javadoc) * * @seeorg.apache.uima.analysis_component.AnalysisComponent_ImplBase#initialize(org.apache.uima. * UimaContext) */ public void initialize(UimaContext aContext) throws ResourceInitializationException { super.initialize(aContext); this.nToMerge = ((Integer) aContext.getConfigParameterValue("NumberToMerge")).intValue(); this.casMultName = (String) aContext.getConfigParameterValue("AnnotatorName"); if (this.casMultName == null) { this.casMultName = "CasMerger"; } } /* * (non-Javadoc) * * @see JCasMultiplier_ImplBase#process(JCas) */ public void process(CAS aCas) throws AnalysisEngineProcessException { this.docCount++; if (UIMAFramework.getLogger().isLoggable(Level.FINE)) System.out.println(casMultName + ".process() received document " + this.docCount); } /* * (non-Javadoc) * * @see org.apache.uima.analysis_component.AnalysisComponent#hasNext() */ public boolean hasNext() throws AnalysisEngineProcessException { // Generate N-th when receive M * N-th input return (docCount >= (genCount + 1) * nToMerge); } /* * (non-Javadoc) * * @see org.apache.uima.analysis_component.AnalysisComponent#next() */ public AbstractCas next() throws AnalysisEngineProcessException { CAS cas = getEmptyCAS(); this.genCount++; String text = casMultName + " created #" + this.genCount + " from #" + this.docCount; if (UIMAFramework.getLogger().isLoggable(Level.FINE)) System.out.println(text); cas.setDocumentText(text); return cas; } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/noop/000077500000000000000000000000001160020716200253535ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/noop/CheckTextAnnotator.java000066400000000000000000000126251160020716200317740ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ae.noop; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import org.apache.uima.UIMAFramework; import org.apache.uima.UimaContext; import org.apache.uima.analysis_component.CasAnnotator_ImplBase; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.cas.CAS; import org.apache.uima.cas.CASException; import org.apache.uima.cas.FSIterator; import org.apache.uima.cas.TypeSystem; import org.apache.uima.cas.text.AnnotationIndex; import org.apache.uima.examples.SourceDocumentInformation; import org.apache.uima.jcas.JCas; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; import org.apache.uima.util.Logger; /** * Checks that the sofa data of every N-th CAS starts with the correct value. Validates output of a * CasMultiplier that merges its input CASes */ public class CheckTextAnnotator extends CasAnnotator_ImplBase { String name = "CheckText"; int counter; int checkInterval = 0; int finalCount = 0; String textPrefix; public void initialize(UimaContext aContext) throws ResourceInitializationException { super.initialize(aContext); counter = 0; textPrefix = (String) getContext().getConfigParameterValue("TextPrefix"); checkInterval = ((Integer) getContext().getConfigParameterValue("CheckInterval")).intValue(); if (getContext().getConfigParameterValue("FinalCount") != null) { finalCount = ((Integer) getContext().getConfigParameterValue("FinalCount")).intValue(); } // write log messages Logger logger = getContext().getLogger(); logger.log(Level.CONFIG, name + " initialized"); } public void typeSystemInit(TypeSystem aTypeSystem) throws AnalysisEngineProcessException { } public void collectionProcessComplete() throws AnalysisEngineProcessException { System.out.println(name + ".collectionProcessComplete() Called -------------------------------------"); if (finalCount > 0 && finalCount != counter) { String msg = name + " expected " + finalCount + " CASes but was given " + counter; System.out.println(msg); throw new AnalysisEngineProcessException(new Exception(msg)); } if (UIMAFramework.getLogger().isLoggable(Level.INFO)) { System.out.println(name + " processed " + counter + " CASes"); } counter = 0; } public void process(CAS aCAS) throws AnalysisEngineProcessException { ++counter; String line = aCAS.getDocumentText(); if (UIMAFramework.getLogger().isLoggable(Level.FINE)) { if (line.length() > 60) line = line.substring(0, 30) + " ..."; System.out.println(name + ".process() called for the " + counter + "th time: \"" + line + "\""); } if (checkInterval > 0 && counter % checkInterval == 0) { if (!line.startsWith(textPrefix)) { String msg = name + " expected " + counter + "-th CAS to start with: " + textPrefix; System.out.println(msg); throw new AnalysisEngineProcessException(new Exception(msg)); } } // If not checking the document text check if a SourceDocumentInformation annotation has been // added if (checkInterval == 0) { JCas jcas; try { jcas = aCAS.getJCas(); } catch (CASException e) { throw new AnalysisEngineProcessException(e); } AnnotationIndex aIndx = jcas.getAnnotationIndex(SourceDocumentInformation.type); FSIterator aIter = aIndx.iterator(); if (!aIter.isValid()) { String msg = name + " didn't find a SourceDocumentInformation annotation"; System.out.println(msg); throw new AnalysisEngineProcessException(new Exception(msg)); } System.out.println(name + " found a SourceDocumentInformation"); } } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/noop/NoOpAnnotator.java000066400000000000000000000121321160020716200307560ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ae.noop; import java.io.FileNotFoundException; import org.apache.uima.UIMAFramework; import org.apache.uima.UimaContext; import org.apache.uima.analysis_component.CasAnnotator_ImplBase; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.cas.CAS; import org.apache.uima.cas.TypeSystem; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; import org.apache.uima.util.Logger; public class NoOpAnnotator extends CasAnnotator_ImplBase { private long counter = 0; private long countDown = 0; int errorFrequency = 0; int processDelay = 0; int finalCount = 0; int cpcDelay = 0; public void initialize(UimaContext aContext) throws ResourceInitializationException { super.initialize(aContext); if (getContext().getConfigParameterValue("FailDuringInitialization") != null) { throw new ResourceInitializationException(new FileNotFoundException("Simulated Exception")); } if (getContext().getConfigParameterValue("ErrorFrequency") != null) { errorFrequency = ((Integer) getContext().getConfigParameterValue("ErrorFrequency")) .intValue(); countDown = errorFrequency; } if (getContext().getConfigParameterValue("CpCDelay") != null) { cpcDelay = ((Integer) getContext().getConfigParameterValue("CpCDelay")).intValue(); System.out.println("NoOpAnnotator.initialize() Initializing With CpC Delay of " + cpcDelay + " millis"); } if (getContext().getConfigParameterValue("ProcessDelay") != null) { processDelay = ((Integer) getContext().getConfigParameterValue("ProcessDelay")).intValue(); System.out.println("NoOpAnnotator.initialize() Initializing With Process Delay of " + processDelay + " millis"); } if (getContext().getConfigParameterValue("FinalCount") != null) { finalCount = ((Integer) getContext().getConfigParameterValue("FinalCount")).intValue(); } // write log messages Logger logger = getContext().getLogger(); logger.log(Level.CONFIG, "NAnnotator initialized"); } public void typeSystemInit(TypeSystem aTypeSystem) throws AnalysisEngineProcessException { } public void collectionProcessComplete() throws AnalysisEngineProcessException { System.out .println("NoOpAnnotator.collectionProcessComplete() Called -------------------------------------"); if (cpcDelay > 0) { try { System.out.println("NoOpAnnotator.collectionProcessComplete() Delaying CpC Reply For " + cpcDelay + " millis"); synchronized (this) { this.wait(cpcDelay); } } catch (InterruptedException e) { } } if (finalCount > 0 && finalCount != counter) { String msg = "NoOpAnnotator expected " + finalCount + " CASes but was given " + counter; System.out.println(msg); throw new AnalysisEngineProcessException(new Exception(msg)); } counter = 0; } public void process(CAS aCAS) throws AnalysisEngineProcessException { ++counter; try { if (processDelay == 0) { if (UIMAFramework.getLogger().isLoggable(Level.FINE)) System.out.println("NoOpAnnotator.process() called for the " + counter + "th time. Hashcode:" + hashCode()); } else { // if ( UIMAFramework.getLogger().isLoggable(Level.FINE)) System.out.println("NoOpAnnotator.process() called for the " + counter + "th time, delaying Response For:" + processDelay + " millis"); synchronized (this) { try { wait(processDelay); } catch (InterruptedException e) { } } } // If creating exceptions, reduce interval between them each time. if (errorFrequency > 0) { if (--countDown == 0) { System.out.println("Generating OutOfBoundsException on " + counter + "th call."); if (errorFrequency > 1) { --errorFrequency; } countDown = errorFrequency; throw new IndexOutOfBoundsException(); } } } catch (Exception e) { throw new AnalysisEngineProcessException(e); } } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/noop/NoOpCC.java000066400000000000000000000025031160020716200272770ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ae.noop; import org.apache.uima.cas.CAS; import org.apache.uima.collection.CasConsumer_ImplBase; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.resource.ResourceProcessException; public class NoOpCC extends CasConsumer_ImplBase { public void initialize() throws ResourceInitializationException { } public void processCas(CAS aCAS) throws ResourceProcessException { System.out.println("NoOpCC process() called"); } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/noop/SimpleAnnotator.java000066400000000000000000000100461160020716200313360ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ae.noop; import org.apache.uima.UIMAFramework; import org.apache.uima.UimaContext; import org.apache.uima.analysis_component.CasAnnotator_ImplBase; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.cas.CAS; import org.apache.uima.cas.CASException; import org.apache.uima.cas.TypeSystem; import org.apache.uima.examples.SourceDocumentInformation; import org.apache.uima.jcas.JCas; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; import org.apache.uima.util.Logger; public class SimpleAnnotator extends CasAnnotator_ImplBase { private long counter = 0; int processDelay = 0; int finalCount = 0; public void initialize(UimaContext aContext) throws ResourceInitializationException { super.initialize(aContext); if (getContext().getConfigParameterValue("ProcessDelay") != null) { processDelay = ((Integer) getContext().getConfigParameterValue("ProcessDelay")).intValue(); System.out.println("SimpleAnnotator.initialize() Initializing With Process Delay of " + processDelay + " millis"); } if (getContext().getConfigParameterValue("FinalCount") != null) { finalCount = ((Integer) getContext().getConfigParameterValue("FinalCount")).intValue(); } // write log messages Logger logger = getContext().getLogger(); logger.log(Level.CONFIG, "SimpleAnnotator initialized"); } public void typeSystemInit(TypeSystem aTypeSystem) throws AnalysisEngineProcessException { } public void collectionProcessComplete() throws AnalysisEngineProcessException { System.out .println("SimpleAnnotator.collectionProcessComplete() Called -------------------------------------"); if (finalCount > 0 && finalCount != counter) { String msg = "SimpleAnnotator expected " + finalCount + " CASes but was given " + counter; System.out.println(msg); throw new AnalysisEngineProcessException(new Exception(msg)); } counter = 0; } public void process(CAS aCAS) throws AnalysisEngineProcessException { ++counter; if (processDelay == 0) { if (UIMAFramework.getLogger().isLoggable(Level.FINE)) System.out.println("SimpleAnnotator.process() called for the " + counter + "th time. Hashcode:" + hashCode()); } else { if (UIMAFramework.getLogger().isLoggable(Level.FINE)) System.out.println("SimpleAnnotator.process() called for the " + counter + "th time, delaying Response For:" + processDelay + " millis"); synchronized (this) { try { wait(processDelay); } catch (InterruptedException e) { } } } JCas jcas; try { jcas = aCAS.getJCas(); } catch (CASException e) { throw new AnalysisEngineProcessException(e); } SourceDocumentInformation sda = new SourceDocumentInformation(jcas, 0, jcas.getDocumentText() .length()); sda.setOffsetInSource(0); sda.addToIndexes(); if (UIMAFramework.getLogger().isLoggable(Level.FINE)) System.out.println("SimpleAnnotator.process() added a SourceDocumentInformation annotation"); } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ae/noop/WriterAnnotator.java000066400000000000000000000046651160020716200313730ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ae.noop; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.apache.uima.UimaContext; import org.apache.uima.analysis_component.CasAnnotator_ImplBase; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.cas.CAS; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; import org.apache.uima.util.Logger; public class WriterAnnotator extends CasAnnotator_ImplBase { String name = "WriterAnnotator"; private int counter = 0; public void initialize(UimaContext aContext) throws ResourceInitializationException { super.initialize(aContext); if (getContext().getConfigParameterValue("AnnotatorName") != null) { name = ((String) getContext().getConfigParameterValue("AnnotatorName")).trim(); } // write log messages Logger logger = getContext().getLogger(); logger.log(Level.CONFIG, name + " initialized"); } public void process(CAS aCAS) throws AnalysisEngineProcessException { ++counter; File out = new File("target/temp", name + "." + counter); FileWriter os; try { os = new FileWriter(out); os.write(aCAS.getDocumentText(), 0, 100); os.close(); System.out.println(name + ".process() called for the " + counter + "-th time to write file " + out); } catch (IOException e) { System.out.println("ERROR: " + name + " failed to open file " + out); throw new AnalysisEngineProcessException(e); } throw new IndexOutOfBoundsException(); } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/000077500000000000000000000000001160020716200244045ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/000077500000000000000000000000001160020716200253635ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/TestUimaASBasic.java000066400000000000000000000240551160020716200311550ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ee.test; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CountDownLatch; import javax.jms.Connection; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.Session; import org.apache.activemq.ActiveMQMessageConsumer; import org.apache.activemq.command.ActiveMQDestination; import org.apache.uima.UIMA_IllegalStateException; import org.apache.uima.aae.UimaClassFactory; import org.apache.uima.aae.client.UimaAsynchronousEngine; import org.apache.uima.aae.controller.Endpoint; import org.apache.uima.aae.error.ServiceShutdownException; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.adapter.jms.activemq.JmsOutputChannel; import org.apache.uima.adapter.jms.client.BaseUIMAAsynchronousEngine_impl; import org.apache.uima.adapter.jms.message.JmsMessageContext; import org.apache.uima.analysis_engine.AnalysisEngineDescription; import org.apache.uima.ee.test.utils.BaseTestSupport; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.resource.ResourceSpecifier; import org.apache.uima.resource.metadata.ProcessingResourceMetaData; public class TestUimaASBasic extends BaseTestSupport { private static final int DEFAULT_HTTP_PORT = 8888; private CountDownLatch getMetaCountLatch = null; private static final int MaxGetMetaRetryCount = 2; private static final String primitiveServiceQueue1 = "NoOpAnnotatorQueue"; private static final String PrimitiveDescriptor1 = "resources/descriptors/analysis_engine/NoOpAnnotator.xml"; private int getMetaRequestCount = 0; /** * Tests Broker startup and shutdown */ public void testBrokerLifecycle() { System.out.println("-------------- testBrokerLifecycle -------------"); } /** * Tests handling of multiple calls to initialize(). A subsequent call to initialize should result * in ResourceInitializationException. * * @throws Exception */ public void testInvalidInitializeCall() throws Exception { System.out.println("-------------- testInvalidInitializeCall -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue"); try { initialize(eeUimaEngine, appCtx); waitUntilInitialized(); System.out.println("First Initialize Call Completed"); eeUimaEngine.initialize(appCtx); fail("Subsequent call to initialize() did not return expected exception:" + UIMA_IllegalStateException.class + " Subsequent call to initialize succeeded with no error"); } catch (ResourceInitializationException e) { if (e.getCause() != null && !(e.getCause() instanceof UIMA_IllegalStateException)) { fail("Invalid Exception Thrown. Expected:" + UIMA_IllegalStateException.class + " Received:" + e.getClass()); } else { System.out.println("Received Expected Exception:" + UIMA_IllegalStateException.class); } } catch (ServiceShutdownException e) { e.printStackTrace(); // expected } catch (Throwable e) { e.printStackTrace(); } finally { eeUimaEngine.stop(); } } /** * Tests deployment of a primitive Uima EE Service (PersontTitleAnnotator). Deploys the primitive * in the same jvm using Uima EE Client API and blocks on a monitor until the Uima Client calls * initializationComplete() method. Once the primitive service starts it is expected to send its * metadata to the Uima client which in turn notifies this object with a call to * initializationComplete() where the monitor is signaled to unblock the thread. This code will * block if the Uima Client does not call initializationComplete() * * @throws Exception */ public void testDeployPrimitiveService() throws Exception { System.out.println("-------------- testDeployPrimitiveService -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue", 0, EXCEPTION_LATCH); } /** * Tests a simple Aggregate with one remote Delegate and collocated Cas Multiplier * * @throws Exception */ public void testDeployAggregateService() throws Exception { System.out.println("-------------- testDeployAggregateService -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); System.setProperty(JmsConstants.SessionTimeoutOverride, "2500000"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotator.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 0, EXCEPTION_LATCH); } /** * This tests GetMeta retries. It deploys a simple Aggregate service that contains a collocated * Primitive service and a Primitive remote. The Primitive remote is simulated in this code. The * code starts a listener where the Aggregate sends GetMeta requests. The listener responds to the * Aggregate with its metadata only when an expected number of GetMeta retries is met. If the * Aggregate fails to send expected number of GetMeta requests, the listener will not adjust its * CountDownLatch and will cause this test to hang. * * @throws Exception */ public void getMetaRetry() throws Exception { getMetaCountLatch = new CountDownLatch(MaxGetMetaRetryCount); Connection connection = getConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = (ActiveMQDestination) session .createQueue(primitiveServiceQueue1); ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) session .createConsumer(destination); consumer.setMessageListener(new MessageListener() { public void onMessage(Message aMessage) { try { if (isMetaRequest(aMessage)) { // Reply with metadata when retry count reaches defined threshold if (getMetaRequestCount > 0 && getMetaRequestCount % MaxGetMetaRetryCount == 0) { JmsMessageContext msgContext = new JmsMessageContext(aMessage, primitiveServiceQueue1); JmsOutputChannel outputChannel = new JmsOutputChannel(); outputChannel.setServiceInputEndpoint(primitiveServiceQueue1); outputChannel.setServerURI(getBrokerUri()); Endpoint endpoint = msgContext.getEndpoint(); outputChannel.sendReply(getPrimitiveMetadata1(PrimitiveDescriptor1), endpoint, true); } getMetaRequestCount++; getMetaCountLatch.countDown(); // Count down to unblock the thread } } catch (Exception e) { e.printStackTrace(); } } }); consumer.start(); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); String containerId = deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotator.xml"); Map appCtx = new HashMap(); appCtx.put(UimaAsynchronousEngine.ServerUri, String.valueOf(broker.getMasterConnectorURI())); appCtx.put(UimaAsynchronousEngine.Endpoint, "TopLevelTaeQueue"); appCtx.put(UimaAsynchronousEngine.CasPoolSize, Integer.valueOf(4)); appCtx.put(UimaAsynchronousEngine.ReplyWindow, 15); appCtx.put(UimaAsynchronousEngine.Timeout, 0); initialize(eeUimaEngine, appCtx); System.out .println("TestBroker.testGetMetaRetry()-Blocking On GetMeta Latch. Awaiting GetMeta Requests"); /*********************************************************************************/ /**** This Code Will Block Until Expected Number Of GetMeta Requests Arrive ******/ getMetaCountLatch.await(); /*********************************************************************************/ consumer.stop(); connection.stop(); eeUimaEngine.undeploy(containerId); eeUimaEngine.stop(); } public ProcessingResourceMetaData getPrimitiveMetadata1(String aDescriptor) throws Exception { ResourceSpecifier resourceSpecifier = UimaClassFactory.produceResourceSpecifier(aDescriptor); return ((AnalysisEngineDescription) resourceSpecifier).getAnalysisEngineMetaData(); } private static boolean deleteAllFiles(File directory) { if (directory.isDirectory()) { String[] files = directory.list(); for (int i = 0; i < files.length; i++) { deleteAllFiles(new File(directory, files[i])); } } // Now have an empty directory or simple file return directory.delete(); } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/TestUimaASExtended.java000066400000000000000000004244271160020716200317030ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ee.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CountDownLatch; import javax.jms.Connection; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.Session; import junit.framework.Assert; import org.apache.activemq.ActiveMQMessageConsumer; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.command.ActiveMQDestination; import org.apache.uima.UIMAFramework; import org.apache.uima.UIMA_IllegalStateException; import org.apache.uima.aae.UimaClassFactory; import org.apache.uima.aae.client.UimaASProcessStatus; import org.apache.uima.aae.client.UimaAsBaseCallbackListener; import org.apache.uima.aae.client.UimaAsynchronousEngine; import org.apache.uima.aae.controller.Endpoint; import org.apache.uima.aae.error.ServiceShutdownException; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.adapter.jms.activemq.JmsOutputChannel; import org.apache.uima.adapter.jms.activemq.SpringContainerDeployer; import org.apache.uima.adapter.jms.client.BaseUIMAAsynchronousEngine_impl; import org.apache.uima.adapter.jms.message.JmsMessageContext; import org.apache.uima.analysis_engine.AnalysisEngineDescription; import org.apache.uima.cas.CAS; import org.apache.uima.cas.TypeSystem; import org.apache.uima.collection.CollectionReader; import org.apache.uima.collection.CollectionReaderDescription; import org.apache.uima.collection.EntityProcessStatus; import org.apache.uima.ee.test.utils.BaseTestSupport; import org.apache.uima.internal.util.XMLUtils; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.resource.ResourceProcessException; import org.apache.uima.resource.ResourceSpecifier; import org.apache.uima.resource.metadata.ProcessingResourceMetaData; import org.apache.uima.util.XMLInputSource; public class TestUimaASExtended extends BaseTestSupport { private CountDownLatch getMetaCountLatch = null; private static final int MaxGetMetaRetryCount = 2; private static final String primitiveServiceQueue1 = "NoOpAnnotatorQueue"; private static final String PrimitiveDescriptor1 = "resources/descriptors/analysis_engine/NoOpAnnotator.xml"; private int getMetaRequestCount = 0; public BaseTestSupport superRef = null; /** * Tests Broker startup and shutdown */ public void testBrokerLifecycle() { System.out.println("-------------- testBrokerLifecycle -------------"); System.out.println("UIMA_HOME=" + System.getenv("UIMA_HOME") + System.getProperty("file.separator") + "bin" + System.getProperty("file.separator") + "dd2spring.xsl"); } public void testAggregateHttpTunnelling() throws Exception { System.out.println("-------------- testAggregateHttpTunnelling -------------"); // Create Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); // Deploy top level aggregate that communicates with the remote via Http Tunnelling deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithHttpDelegate.xml"); // Initialize and run the Test. Wait for a completion and cleanup resources. runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 10, CPC_LATCH); } public void testClientHttpTunnellingToAggregate() throws Exception { System.out.println("-------------- testClientHttpTunnellingToAggregate -------------"); // Add HTTP Connector to the broker. String httpURI = getHttpURI(); // Create Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotator.xml"); // Initialize and run the Test. Wait for a completion and cleanup resources. System.out.println("-------- Connecting Client To Service: "+httpURI); runTest(null, eeUimaEngine, httpURI, "TopLevelTaeQueue", 1, CPC_LATCH); } public void testClientHttpTunnelling() throws Exception { System.out.println("-------------- testClientHttpTunnelling -------------"); String httpURI = getHttpURI(); // Create Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); // Initialize and run the Test. Wait for a completion and cleanup resources. System.out.println("-------- Connecting Client To Service: "+httpURI); runTest(null, eeUimaEngine, httpURI, "NoOpAnnotatorQueue", 1, PROCESS_LATCH); } public void testClientHttpTunnellingWithDoubleByteText() throws Exception { System.out.println("-------------- testClientHttpTunnellingWithDoubleByteText -------------"); BufferedReader in = null; try { File file = new File(relativeDataPath + "/DoubleByteText.txt"); System.out.println("Checking for existence of File:" + file.getAbsolutePath()); // Process only if the file exists if (file.exists()) { System.out .println(" *** DoubleByteText.txt exists and will be sent through http connector."); System.out.println(" *** If the vanilla activemq release is being used,"); System.out .println(" *** and DoubleByteText.txt is bigger than 64KB or so, this test case will hang."); System.out .println(" *** To fix, override the classpath with the jar files in and under the"); System.out .println(" *** apache-uima-as/uima-as/src/main/apache-activemq-X.y.z directory"); System.out.println(" *** in the apache-uima-as source distribution."); String httpURI = getHttpURI(); // Create Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); InputStream fis = new FileInputStream(file); Reader rd = new InputStreamReader(fis, "UTF-8"); in = new BufferedReader(rd); // Set the double-byte text. This is what will be sent to the service String line = in.readLine(); super.setDoubleByteText(line); int err = XMLUtils.checkForNonXmlCharacters(line); if (err >= 0) { fail("Illegal XML char at offset " + err); } System.out.println("-------- Connecting Client To Service: "+httpURI); // Initialize and run the Test. Wait for a completion and cleanup resources. runTest(null, eeUimaEngine, httpURI, "NoOpAnnotatorQueue", 1, CPC_LATCH); } } catch (Exception e) { // Double-Byte Text file not present. Continue on with the next test e.printStackTrace(); fail("Could not complete test"); } finally { if (in != null) { in.close(); } } } /** * Tests support for ActiveMQ failover protocol expressed in broker * URL as follows "failover:(tcp:IP:Port1,tcp:IP:Port2)". The test launches a secondary * broker, launches a Primitive service that uses that broker, * and finally configures the UIMA AS Client to connect to the secondary broker * and specifies an alternative broker on a different port. This test * only tests ability of UIMA AS to handle a complex URL, and it does *not* * test the actual failover from one broker to the next. * * @throws Exception */ public void testBrokerFailoverSupportUsingHTTP() throws Exception { System.out.println("-------------- testBrokerFailoverSupportUsingTCP -------------"); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); BrokerService broker2 = setupSecondaryBroker(false); String bhttpURL = addHttpConnector(broker2, DEFAULT_HTTP_PORT2); String burl = "failover:("+bhttpURL+","+broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString().replaceAll("tcp","http")+")?randomize=false"; System.setProperty("BrokerURL", burl); // Deploy Uima AS Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_NoOpAnnotatorWithPlaceholder.xml"); Map appCtx = buildContext(burl,"NoOpAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); int errorCount = 0; for (int i = 0; i < 15; i++) { CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); try { uimaAsEngine.sendAndReceiveCAS(cas); } catch( Exception e) { errorCount++; } finally { cas.release(); } } uimaAsEngine.stop(); super.cleanBroker(broker2); broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } } /** * Tests support for ActiveMQ failover protocol expressed in broker * URL as follows "failover:(tcp:IP:Port1,tcp:IP:Port2)". The test launches a secondary * broker, launches a Primitive service that uses that broker, * and finally configures the UIMA AS Client to connect to the secondary broker * and specifies an alternate broker on a different port. This test * only tests ability of UIMA AS to handle a complex URL, and it does *not* * test the actual failover from one broker to the next. * * @throws Exception */ public void testBrokerFailoverSupportUsingTCP() throws Exception { System.out.println("-------------- testBrokerFailoverSupportUsingTCP -------------"); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); BrokerService broker2 = setupSecondaryBroker(true); // Deploy Uima AS Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_NoOpAnnotatorWithPlaceholder.xml"); Map appCtx = buildContext("failover:("+System.getProperty("BrokerURL")+","+getBrokerUri()+")?randomize=false","NoOpAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); int errorCount = 0; for (int i = 0; i < 15; i++) { CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); try { uimaAsEngine.sendAndReceiveCAS(cas); } catch( Exception e) { errorCount++; } finally { cas.release(); } } uimaAsEngine.stop(); super.cleanBroker(broker2); broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } } /** * This test starts a secondary broker, starts NoOp Annotator, and * using synchronous sendAndReceive() sends 10 CASes for analysis. Before sending 11th, the test * stops the secondary broker and sends 5 more CASes. All CASes sent after * the broker shutdown result in GetMeta ping and a subsequent timeout. * @throws Exception */ public void testSyncClientRecoveryFromBrokerStop() throws Exception { System.out.println("-------------- testSyncClientRecoveryFromBrokerStop -------------"); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); BrokerService broker2 = setupSecondaryBroker(true); // Deploy Uima AS Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_NoOpAnnotatorWithPlaceholder.xml"); Map appCtx = buildContext(broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString(), "NoOpAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); int errorCount = 0; for (int i = 0; i < 15; i++) { if ( i == 10 ) { // Stop the broker broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to fully stop } } CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); try { uimaAsEngine.sendAndReceiveCAS(cas); } catch( Exception e) { errorCount++; System.out.println("Client Received Expected Error on CAS:"+(i+1)); } finally { cas.release(); } } uimaAsEngine.stop(); // expecting 5 failures due to broker missing if ( errorCount != 5 ) { fail("Expected 5 failures due to broker down, instead received:"+errorCount+" failures"); } } /** * This test starts a secondary broker, starts NoOp Annotator, and * using synchronous sendAndReceive() sends 5 CASes for analysis. Before sending 6th, the test * stops the secondary broker and sends 5 more CASes. All CASes sent after * the broker shutdown result in GetMeta ping and a subsequent timeout. Before * sending 11th CAS the test starts the broker again and sends 10 more CASes * @throws Exception */ public void testSyncClientRecoveryFromBrokerStopAndRestart() throws Exception { System.out.println("-------------- testSyncClientRecoveryFromBrokerStopAndRestart -------------"); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); BrokerService broker2 = setupSecondaryBroker(true); // Deploy Uima AS Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_NoOpAnnotatorWithPlaceholder.xml"); Map appCtx = buildContext(broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString(), "NoOpAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); int errorCount=0; for (int i = 0; i < 20; i++) { if ( i == 5 ) { broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } } else if ( i == 10 ) { // restart the broker System.setProperty("activemq.broker.jmx.domain","org.apache.activemq.test"); broker2 = setupSecondaryBroker(true); broker2.start(); synchronized(this) { wait(3000); // allow broker some time to start } } CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); try { uimaAsEngine.sendAndReceiveCAS(cas); } catch( Exception e) { errorCount++; System.out.println("Client Received Expected Error on CAS:"+(i+1)); } finally { cas.release(); } } uimaAsEngine.stop(); super.cleanBroker(broker2); broker2.stop(); // expecting 5 failures due to broker missing if ( errorCount != 5 ) { fail("Expected 5 failures due to broker down, instead received:"+errorCount+" failures"); } synchronized(this) { wait(3000); // allow broker some time to stop } } /** * This test creates 4 UIMA AS clients and runs each in a separate thread. There is a single * shared jms connection to a broker that each client uses. After initialization a client * sends 1000 CASes to a remote service. While clients are processing the test kills * the broker, waits for 4 seconds and restarts it. While the broker is down, clients * keep trying sending CASes, receiving Ping timeouts. Once the broker is available again * all clients should recover and begin processing CASes again. This tests recovery of a * shared connection. * * @throws Exception */ public void testMultipleSyncClientsRecoveryFromBrokerStopAndRestart() throws Exception { System.out.println("-------------- testMultipleSyncClientsRecoveryFromBrokerStopAndRestart -------------"); final BrokerService broker2 = setupSecondaryBroker(true); final CountDownLatch latch = new CountDownLatch(4); Thread[] clientThreads = new Thread[4]; // Create 4 Uima AS clients each running in a separate thread for(int i=0; i < 4; i++) { clientThreads[i] = new Thread() { public void run() { BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); try { // Deploy Uima AS Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_NoOpAnnotatorWithPlaceholder.xml"); Map appCtx = buildContext(broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString(), "NoOpAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); for (int i = 0; i < 1000; i++) { if ( i == 5 ) { latch.countDown(); // indicate that some CASes were processed } CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client#"+ Thread.currentThread().getId()+" Sending CAS#"+(i + 1) + " Request to a Service"); try { uimaAsEngine.sendAndReceiveCAS(cas); } catch( Exception e) { System.out.println("Client Received Expected Error on CAS:"+(i+1)); } finally { cas.release(); } } System.out.println("Thread:"+Thread.currentThread().getId()+" Completed run()"); uimaAsEngine.stop(); } catch( Exception e) { e.printStackTrace(); return; } } }; clientThreads[i].start(); } BrokerService broker3 = null; try { latch.await(); // wait for all threads to process a few CASes broker2.stop(); System.out.println("Stopping Broker - wait ..."); synchronized(this) { wait(4000); // allow broker some time to stop } System.out.println("Restarting Broker - wait ..."); // restart the broker broker3 = setupSecondaryBroker(true); synchronized(this) { wait(3000); // allow broker some time to start } } catch ( Exception e ) { } finally { for(int i=0; i < 4; i++ ) { clientThreads[i].join(); } System.out.println("Stopping Broker - wait ..."); if ( broker3 != null ) { super.cleanBroker(broker3); broker3.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } } } } /** * This test starts a secondary broker, starts NoOp Annotator, and * using asynchronous send() sends a total of 15 CASes for analysis. After processing 11th * the test stops the secondary broker and sends 4 more CASes which fails due to broker not running. * * @throws Exception */ public void testAsyncClientRecoveryFromBrokerStop() throws Exception { System.out.println("-------------- testAsyncClientRecoveryFromBrokerStop -------------"); BrokerService broker2 = setupSecondaryBroker(true); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(uimaAsEngine, relativePath + "/Deploy_NoOpAnnotatorWithPlaceholder.xml"); Map appCtx = buildContext(broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString(), "NoOpAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); for (int i = 0; i < 15; i++) { if ( i == 10 ) { broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to start } } CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); uimaAsEngine.sendCAS(cas); } uimaAsEngine.stop(); super.cleanBroker(broker2); broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } } public void testAsyncClientRecoveryFromBrokerStopAndRestart() throws Exception { System.out.println("-------------- testAsyncClientRecoveryFromBrokerStopAndRestart -------------"); BrokerService broker2 = setupSecondaryBroker(true); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima AS Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_NoOpAnnotatorWithPlaceholder.xml"); Map appCtx = buildContext(broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString(), "NoOpAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); for (int i = 0; i < 150; i++) { if ( i == 10 ) { broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } } else if ( i == 20 ) { broker2 = setupSecondaryBroker(true); synchronized(this) { wait(3000); // allow broker some time to start } } CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); uimaAsEngine.sendCAS(cas); } uimaAsEngine.stop(); super.cleanBroker(broker2); broker2.stop(); synchronized(this) { wait(2000); // allow broker some time to stop } } /** * Tests recovery from a broker restart when running multiple instances of * UIMA AS client in the same JVM. The scenario is: * 1) start broker * 2) start service * 3) create 1st client and initialize it * 4) create 2nd client and initialize it * 5) send 1 CAS from client#1 * 6) when reply is received kill broker and restart it * 7) send 2 CAS from client#1 * 8) CAS #2 fails, but forces SharedConnection to reconnect to broker * 9) CAS#3 and #4 are sent from client#1 * 10) CASes 1-4 are sent from client#2 without error * * @throws Exception */ public void testMultipleClientsRecoveryFromBrokerStopAndRestart() throws Exception { System.out.println("-------------- testMultipleClientsRecoveryFromBrokerStopAndRestart -------------"); BrokerService broker2 = setupSecondaryBroker(true); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaClient1 = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima AS Primitive Service deployService(uimaClient1, relativePath + "/Deploy_NoOpAnnotatorWithPlaceholder.xml"); Map appCtx = buildContext(broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString(), "NoOpAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaClient1, appCtx); waitUntilInitialized(); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaClient2 = new BaseUIMAAsynchronousEngine_impl(); Map appCtx2 = buildContext(broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString(), "NoOpAnnotatorQueue"); appCtx2.put(UimaAsynchronousEngine.Timeout, 1100); appCtx2.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaClient2, appCtx2); waitUntilInitialized(); int errorCount=0; for (int i = 0; i < 4; i++) { // Stop broker before second CAS is sent to the service if ( i == 1 ) { broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } // restart broker before 3rd CAS is sent // restart the broker broker2 = setupSecondaryBroker(true); synchronized(this) { wait(3000); // allow broker some time to start } } CAS cas = uimaClient1.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client#1 Sending CAS#" + (i + 1) + " Request to a Service"); try { uimaClient1.sendAndReceiveCAS(cas); } catch( Exception e) { errorCount++; System.out.println("UIMA AS Client#1 Received Expected Error on CAS:"+(i+1)); } finally { cas.release(); } } for (int i = 0; i < 4; i++) { CAS cas = uimaClient2.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client#2 Sending CAS#" + (i + 1) + " Request to a Service"); try { uimaClient2.sendAndReceiveCAS(cas); } catch( Exception e) { errorCount++; System.out.println("UIMA AS Client#2 Received Expected Error on CAS:"+(i+1)); } finally { cas.release(); } } uimaClient1.stop(); uimaClient2.stop(); super.cleanBroker(broker2); broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } } /** * Tests ability of an aggregate to recover from Broker restart. The broker managing * delegate's input queue is stopped after 1st CAS is received from a delegate. The * listener for the temp reply queue is stopped and a delegate marked as FAILED. When * the broker is restarted, a 2nd CAS is sent from a client to the aggregate. This * forces instantiation and initialization of a new temp reply queue and a new listener * Once this is done, 2nd CAS is sent to the delegate and processing continues. * @throws Exception */ public void testAggregateRecoveryFromBrokerStopAndRestart() throws Exception { System.out.println("-------------- testAggregateRecoveryFromBrokerStopAndRestart -------------"); BrokerService broker2 = setupSecondaryBroker(false); System.setProperty("BrokerURL", broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString()); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaClient1 = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima AS Primitive Service deployService(uimaClient1, relativePath + "/Deploy_NoOpAnnotatorWithPlaceholder.xml"); deployService(uimaClient1, relativePath + "/Deploy_AggregateWithRemoteNoOpOnBroker8200.xml"); Map appCtx = buildContext(broker.getMasterConnectorURI(), "TopLevelTaeQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaClient1, appCtx); waitUntilInitialized(); int errorCount=0; for (int i = 0; i < 10; i++) { // Stop broker before second CAS is sent to the service if ( i == 1 ) { System.out.println("Stopping Secondary Broker Running on Port:"+broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString()); broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } // restart broker before 3rd CAS is sent // restart the broker broker2 = setupSecondaryBroker(true); synchronized(this) { wait(3000); // allow broker some time to start } } CAS cas = uimaClient1.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); try { uimaClient1.sendAndReceiveCAS(cas); System.out.println("UIMA AS Client Received Reply For CAS#" + (i + 1) ); } catch( Exception e) { errorCount++; System.out.println("UIMA AS Client Received Expected Error on CAS:"+(i+1)); } finally { cas.release(); } } uimaClient1.stop(); System.out.println("Stopping Broker - wait ..."); super.cleanBroker(broker2); broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } } /** * Tests sending CPC after CAS timeout. The service is a Primitive taking * 6 seconds to process a CAS. The client waits for 5 secs to force * a timeout. This test forces the client to send GetMeta Ping and to * 'hold' the subsequent CPC request. * * @throws Exception */ public void testCpcAfterCasTimeout() throws Exception { System.out.println("-------------- testCpcAfterCasTimeout -------------"); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(uimaAsEngine, relativePath + "/Deploy_NoOpAnnotatorAWithLongDelay.xml"); Map appCtx = buildContext(broker.getMasterConnectorURI(), "NoOpAnnotatorAQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 5000); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); for( int i=0; i < 3; i++ ) { CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); uimaAsEngine.sendCAS(cas); // will timeout after 5 secs uimaAsEngine.collectionProcessingComplete(); // the CPC should not // be sent to a service until the timeout occurs. } uimaAsEngine.stop(); } public void testClientProcess() throws Exception { System.out.println("-------------- testClientProcess -------------"); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima AS Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); appCtx.put(UimaAsynchronousEngine.CpcTimeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); for (int i = 0; i < 50; i++) { CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); uimaAsEngine.sendCAS(cas); } uimaAsEngine.collectionProcessingComplete(); System.clearProperty("DefaultBrokerURL"); uimaAsEngine.stop(); } public void testClientProcessTimeout() throws Exception { System.out .println("-------------- testClientProcessTimeout -------------"); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima AS Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_NoOpAnnotatorWithLongDelay.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "NoOpAnnotatorQueueLongDelay"); appCtx.put(UimaAsynchronousEngine.Timeout, 1100); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); for (int i = 0; i < 1; i++) { CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); uimaAsEngine.sendCAS(cas); } uimaAsEngine.collectionProcessingComplete(); uimaAsEngine.stop(); } public void testClientBrokerPlaceholderSubstitution() throws Exception { System.out.println("-------------- testClientBrokerPlaceholderSubstitution -------------"); // Instantiate Uima AS Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima AS Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); System.setProperty( "defaultBrokerURL", broker.getMasterConnectorURI()); Map appCtx = buildContext("${defaultBrokerURL}","PersonTitleAnnotatorQueue"); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); for (int i = 0; i < 10; i++) { CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); System.out.println("UIMA AS Client Sending CAS#" + (i + 1) + " Request to a Service"); uimaAsEngine.sendCAS(cas); } uimaAsEngine.collectionProcessingComplete(); uimaAsEngine.stop(); } public void testClientCpcTimeout() throws Exception { System.out.println("-------------- testClientCpcTimeout -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); addExceptionToignore(org.apache.uima.aae.error.UimaASCollectionProcessCompleteTimeout.class); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithCpCDelay.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "NoOpAnnotatorQueue"); // Set an explicit CPC timeout as exceptions thrown in the 2nd annotator's CPC don't reach the // client. appCtx.put(UimaAsynchronousEngine.CpcTimeout, 2000); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "NoOpAnnotatorQueue", 1, CPC_LATCH); // PC_LATCH); } /** * Tests handling of multiple calls to initialize(). A subsequent call to initialize should result * in ResourceInitializationException. * * @throws Exception */ public void testInvalidInitializeCall() throws Exception { System.out.println("-------------- testInvalidInitializeCall -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue"); try { initialize(eeUimaEngine, appCtx); waitUntilInitialized(); System.out.println("First Initialize Call Completed"); eeUimaEngine.initialize(appCtx); fail("Subsequent call to initialize() did not return expected exception:" + UIMA_IllegalStateException.class + " Subsequent call to initialize succeeded with no error"); } catch (ResourceInitializationException e) { if (e.getCause() != null && !(e.getCause() instanceof UIMA_IllegalStateException)) { fail("Invalid Exception Thrown. Expected:" + UIMA_IllegalStateException.class + " Received:" + e.getClass()); } else { System.out.println("Received Expected Exception:" + UIMA_IllegalStateException.class); } } catch (ServiceShutdownException e) { // expected } finally { eeUimaEngine.stop(); } } /** * Tests deployment of a primitive Uima EE Service (PersontTitleAnnotator). Deploys the primitive * in the same jvm using Uima EE Client API and blocks on a monitor until the Uima Client calls * initializationComplete() method. Once the primitive service starts it is expected to send its * metadata to the Uima client which in turn notifies this object with a call to * initializationComplete() where the monitor is signaled to unblock the thread. This code will * block if the Uima Client does not call initializationComplete() * * @throws Exception */ public void testDeployPrimitiveService() throws Exception { System.out.println("-------------- testDeployPrimitiveService -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue", 0, EXCEPTION_LATCH); } public void testDeployPrimitiveServiceWithInitFailure() throws Exception { System.out.println("-------------- testDeployPrimitiveServiceWithInitFailure -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service try { deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithInitException.xml"); } catch( ResourceInitializationException e) { System.out.println("Received Expected ResourceInitializationException On Service Deploy"); return; } fail("Expected ResourceInitializationException Not Thrown from deployed Service."); } public void testTypeSystemMerge() throws Exception { System.out.println("-------------- testTypeSystemMerge -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath+ "/Deploy_GovernmentOfficialRecognizer.xml"); deployService(eeUimaEngine, relativePath+ "/Deploy_NamesAndPersonTitlesRecognizer.xml"); deployService(eeUimaEngine, relativePath+ "/Deploy_TokenSentenceRecognizer.xml"); deployService(eeUimaEngine, relativePath+ "/Deploy_AggregateToTestTSMerge.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); try { initialize(eeUimaEngine, appCtx); waitUntilInitialized(); // Check if the type system returned from the service contains // expected types CAS cas = eeUimaEngine.getCAS(); TypeSystem ts = cas.getTypeSystem(); // "example.EmailsAddress" type was 'contributed' by the Flow Controller if ( ts.getType("example.EmailAddress") == null ) { fail("Incomplete Type system. Expected Type 'example.EmailAddress' missing from the CAS type system"); } else if ( ts.getType("example.GovernmentOfficial") == null) { fail("Incomplete Type system. Expected Type 'example.GovernmentOfficial' missing from the CAS type system"); } else if ( ts.getType("example.Name") == null) { fail("Incomplete Type system. Expected Type 'example.Name' missing from the CAS type system"); } else if ( ts.getType("example.PersonTitle") == null) { fail("Incomplete Type system. Expected Type 'example.PersonTitle' missing from the CAS type system"); } else if ( ts.getType("example.PersonTitleKind") == null) { fail("Incomplete Type system. Expected Type 'example.PersonTitleKind' missing from the CAS type system"); } else if ( ts.getType("org.apache.uima.examples.tokenizer.Sentence") == null) { fail("Incomplete Type system. Expected Type 'org.apache.uima.examples.tokenizer.Sentence' missing from the CAS type system"); } else if ( ts.getType("org.apache.uima.examples.tokenizer.Token") == null) { fail("Incomplete Type system. Expected Type 'org.apache.uima.examples.tokenizer.Token' missing from the CAS type system"); } } catch (ResourceInitializationException e) { fail("Initialization Exception"); } catch (Exception e) { } finally { eeUimaEngine.stop(); } } /** * Tests detection of misconfiguration between deployement descriptor and AE descriptor. * The AE descriptor is configured to allow one instance of the AE while the deployment * descriptor attempts to scale out the service containing the AE. ResourceInitializationException * is expected. * * @throws Exception */ public void testMultiInstanceDeployFailureInPrimitiveService() throws Exception { System.out.println("-------------- testMultiInstanceDeployFailureInPrimitiveService -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); try { // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath + "/Deploy_ScaledPersonTitleAnnotator.xml"); fail("Expected ResourceInitializationException Due to Misconfiguration but instead the service initialized successfully"); } catch ( ResourceInitializationException e) { // expected } } /** * Tests processing of an Exception that a service reports on CPC * * @throws Exception */ public void testDeployAggregateWithDelegateCpCException() throws Exception { System.out.println("-------------- testDeployAggregateWithDelegateCpCException -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithCpCException.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotator.xml"); addExceptionToignore(org.apache.uima.aae.error.UimaEEServiceException.class); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); initialize(eeUimaEngine, appCtx); waitUntilInitialized(); System.out.println("Client Initialized"); CAS cas = eeUimaEngine.getCAS(); for (int i = 0; i < 3; i++) { eeUimaEngine.sendAndReceiveCAS(cas); cas.reset(); } System.out.println("Client Sending CPC"); // Send CPC. The service should recreate a session and send CPC reply eeUimaEngine.collectionProcessingComplete(); // Now send some CASes and sleep to let the inactivity timer pop again for (int i = 0; i < 3; i++) { eeUimaEngine.sendAndReceiveCAS(cas); // This will start a timer on reply queue cas.reset(); } // Send another CPC eeUimaEngine.collectionProcessingComplete(); eeUimaEngine.stop(); } public void testDeployPrimitiveServiceWithCpCException() throws Exception { System.out.println("-------------- testDeployPrimitiveServiceWithCpCException -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithCpCException.xml"); // Add expected exception so that we release CPC Latch addExceptionToignore(org.apache.uima.aae.error.UimaEEServiceException.class); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "NoOpAnnotatorQueue", 1, PROCESS_LATCH); } /** * Tests sending CPC request from a client that does not send CASes to a service * * @throws Exception */ public void testCpCWithNoCASesSent() throws Exception { System.out.println("-------------- testCpCWithNoCASesSent -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(uimaAsEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue"); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); for (int i = 0; i < 10; i++) { System.out.println("UIMA AS Client Sending CPC Request to a Service"); uimaAsEngine.collectionProcessingComplete(); } uimaAsEngine.stop(); } /** * Tests inactivity timeout on a reply queue. The service stops a session after 5 seconds of * sending GetMeta reply. The client than waits for 10 seconds and sends a CPC. * * @throws Exception */ public void testServiceInactivityTimeoutOnReplyQueue() throws Exception { System.out.println("-------------- testServiceInactivityTimeoutOnReplyQueue -------------"); String sessionTimeoutOverride = System.getProperty("SessionTimeoutOverride"); System.setProperty("SessionTimeoutOverride", "5000"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "NoOpAnnotatorQueue"); appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 1000); initialize(eeUimaEngine, appCtx); waitUntilInitialized(); System.out.println("Client Initialized"); CAS cas = eeUimaEngine.getCAS(); eeUimaEngine.sendAndReceiveCAS(cas); // This will start a timer on reply queue cas.reset(); // Now sleep for 8 seconds to let the service timeout on its reply queue due // to a 5 second inactivity timeout Thread.currentThread().sleep(8000); System.out.println("Client Sending CPC"); // Send CPC. The service should recreate a session and send CPC reply eeUimaEngine.collectionProcessingComplete(); // Now send some CASes and sleep to let the inactivity timer pop again for (int i = 0; i < 5; i++) { eeUimaEngine.sendAndReceiveCAS(cas); // This will start a timer on reply queue cas.reset(); if (i == 3) { Thread.currentThread().sleep(8000); } } // Send another CPC eeUimaEngine.collectionProcessingComplete(); eeUimaEngine.stop(); // Reset inactivity to original value or remove if it was not set if (sessionTimeoutOverride != null) { System.setProperty("SessionTimeoutOverride", sessionTimeoutOverride); } else { System.clearProperty("SessionTimeoutOverride"); } } /** * Tests handling of ResourceInitializationException that happens in a collocated primitive * * @throws Exception */ public void testDeployAggregateServiceWithFailingCollocatedComponent() throws Exception { System.out .println("-------------- testDeployAggregateServiceWithFailingCollocatedComponent -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); try { deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithFailingCollocatedDelegate.xml"); } catch (ResourceInitializationException e) { // This is expected } catch (Exception e) { e.printStackTrace(); fail("Expected ResourceInitializationException Instead Caught:" + e.getClass().getName()); } } public void testClientProcessTimeoutWithAggregateMultiplier() throws Exception { System.out.println("-------------- testClientProcessTimeoutWithAggregateMultiplier -------------"); addExceptionToignore(org.apache.uima.aae.error.UimaASProcessCasTimeout.class); BaseUIMAAsynchronousEngine_impl uimaAsEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(uimaAsEngine, relativePath + "/Deploy_AggregateMultiplierWithDelay.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 3000); appCtx.put(UimaAsynchronousEngine.CasPoolSize, 1); // reduce the cas pool size and reply window appCtx.remove(UimaAsynchronousEngine.ShadowCasPoolSize); appCtx.put(UimaAsynchronousEngine.ShadowCasPoolSize, Integer.valueOf(1)); initialize(uimaAsEngine, appCtx); waitUntilInitialized(); for( int i=0; i < 2; i++ ) { CAS cas = uimaAsEngine.getCAS(); cas.setDocumentText("Some Text"); uimaAsEngine.sendCAS(cas); // will timeout after 5 secs uimaAsEngine.collectionProcessingComplete(); // the CPC should not // be sent to a service until the timeout occurs. } uimaAsEngine.stop(); } public void testDeployAggregateService() throws Exception { System.out.println("-------------- testDeployAggregateService -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); System.setProperty(JmsConstants.SessionTimeoutOverride, "2500000"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotator.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testDeployAggregateServiceWithDelegateTimeoutAndContinueOnError() throws Exception { System.out.println("-------------- testDeployAggregateServiceWithDelegateTimeoutAndContinueOnError -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); System.setProperty(JmsConstants.SessionTimeoutOverride, "2500000"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithLongDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithDelegateTimeoutAndContinueOnError.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()),"TopLevelTaeQueue"); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testScaledSyncAggregateProcess() throws Exception { System.out.println("-------------- testScaledSyncAggregateProcess -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath + "/Deploy_ScaledPrimitiveAggregateAnnotator.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 5, PROCESS_LATCH); } public void testAggregateWithFailedRemoteDelegate() throws Exception { System.out.println("-------------- testAggregateWithFailedRemoteDelegate -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithExceptionOn5thCAS.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithFailedRemoteDelegate.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); } /** * Tests service quiesce and stop support. This test sets a CasPool to 1 to send just one CAS at a * time. After the first CAS is sent, a thread is started with a timer to expire before the reply * is received. When the timer expires, the client initiates quiesceAndStop on the top level * controller. As part of this, the top level controller stops its listeners on the input queue * (GetMeta and Process Listeners), and registers a callback with the InProcess cache. When the * cache is empty, meaning all CASes are processed, the cache notifies the controller which then * begins the service shutdown. Meanwhile, the client receives a reply for the first CAS, and * sends a second CAS. This CAS, will remain in the queue as the service has previously stopped * its listeners. The client times out after 10 seconds and shuts down. * * @throws Exception */ public void testQuiesceAndStop() throws Exception { System.out.println("-------------- testQuiesceAndStop -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); // Set an explicit process timeout so to test the ping on timeout appCtx.put(UimaAsynchronousEngine.Timeout, 10000); appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 300); appCtx.put(UimaAsynchronousEngine.CasPoolSize, 1); String containers[] = new String[2]; containers[0] = deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); containers[1] = deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithInternalCM1000Docs.xml"); spinShutdownThread(eeUimaEngine, 2000, containers, SpringContainerDeployer.QUIESCE_AND_STOP); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 3, EXCEPTION_LATCH); } public void testStopNow() throws Exception { System.out.println("-------------- testAggregateWithFailedRemoteDelegate -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); String containers[] = new String[2]; containers[0] = deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); containers[1] = deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithInternalCM1000Docs.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); // Set an explicit process timeout so to test the ping on timeout appCtx.put(UimaAsynchronousEngine.Timeout, 4000); appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 300); spinShutdownThread(eeUimaEngine, 3000, containers, SpringContainerDeployer.STOP_NOW); // send may fail since we forcefully stop the service. Tolerate // ResourceProcessException addExceptionToignore(ResourceProcessException.class); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 10, EXCEPTION_LATCH); } public void testCMAggregateClientStopRequest() throws Exception { System.out.println("-------------- testCMAggregateClientStopRequest -------------"); final BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_CMAggregateWithCollocated1MillionDocsCM.xml"); superRef = this; Thread t = new Thread() { public void run() { try { // Wait for some CASes to return from the service while (superRef.getNumberOfCASesProcessed() == 0) { // No reply received yet so wait for 1 second and // check again synchronized (this) { this.wait(1000); // wait for 1 sec } } // The client received at least one reply, wait // at this point the top level service should show a connection error synchronized (this) { // wait for 3 seconds before stopping this.wait(5000); } eeUimaEngine.stopProducingCases(); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } }; t.start(); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testCMAggregateClientStopRequest2() throws Exception { System.out.println("-------------- testCMAggregateClientStopRequest2 -------------"); final BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplierWith1MillionDocs.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplierWith1MillionDocs.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_CMAggregateWithRemote1MillionDocsCM.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_CMAggregateWithRemote1MillionDocsCM.xml"); superRef = this; Thread t = new Thread() { public void run() { try { // Wait for some CASes to return from the service while (superRef.getNumberOfCASesProcessed() == 0) { // No reply received yet so wait for 1 second and // check again synchronized (this) { this.wait(1000); // wait for 1 sec } } // The client received at least one reply, wait // at this point the top level service should show a connection error synchronized (this) { // wait for 3 seconds before stopping this.wait(3000); } eeUimaEngine.stopProducingCases(); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } }; t.start(); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testAggregateCMWithFailedRemoteDelegate() throws Exception { System.out.println("-------------- testAggregateCMWithFailedRemoteDelegate -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithExceptionOn5thCAS.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateCMWithFailedRemoteDelegate.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); } public void testAggregateCMWithFailedCollocatedDelegate() throws Exception { System.out.println("-------------- testAggregateCMWithFailedCollocatedDelegate -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateCMWithFailedCollocatedDelegate.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); } public void testComplexAggregateCMWithFailedCollocatedDelegate() throws Exception { System.out .println("-------------- testComplexAggregateCMWithFailedCollocatedDelegate -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_ComplexAggregateWithFailingInnerAggregateCM.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); } public void testAggregateCMWithRemoteCMAndFailedRemoteDelegate() throws Exception { System.out .println("-------------- testAggregateCMWithRemoteCMAndFailedRemoteDelegate -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithExceptionOn5thCAS.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplierWith1MillionDocs.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateCMWithRemoteCMAndFailedRemoteDelegate.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); } /** * Tests a simple Aggregate with one remote Delegate and collocated Cas Multiplier * * @throws Exception */ public void testDeployAggregateServiceWithBrokerPlaceholder() throws Exception { System.out .println("-------------- testDeployAggregateServiceWithBrokerPlaceholder -------------"); final BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); System.setProperty(JmsConstants.SessionTimeoutOverride, "2500000"); try { Thread t = new Thread() { public void run() { BrokerService bs = null; try { // at this point the top level service should show a connection error synchronized (this) { this.wait(5000); // wait for 5 secs } // Create a new broker that runs a different port that the rest of testcases bs = setupSecondaryBroker(false); System.setProperty("AggregateBroker", bs.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString()); System.setProperty("NoOpBroker", bs.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString()); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorUsingPlaceholder.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorUsingPlaceholder.xml"); // Start the uima AS client. It connects to the top level service and sends // 10 messages runTest(null, eeUimaEngine, System.getProperty("AggregateBroker"), "TopLevelTaeQueue", 1, PROCESS_LATCH); } catch (InterruptedException e) { } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { if (bs != null) { try { bs.stop(); } catch (Exception e) { e.printStackTrace(); } } } } }; t.start(); t.join(); } catch (Exception e) { e.printStackTrace(); } } /** * Tests missing broker on service startup. The service listener on input queue recovers from this * by silently attempting reconnect at 5 second intervals. The test first launches the service, * than spins a thread where a new broker is created after 5 seconds, and finally the uima as * client is started. The test shows initial connection failure and when the broker becomes * available the connection is established and messages begin to flow from the client to the * service and back. * * @throws Exception */ public void testDelayedBrokerWithAggregateService() throws Exception { System.out.println("-------------- testDelayedBrokerWithAggregateService -------------"); final BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); BrokerService bs = null; deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); // set up and start secondary broker. It is started only to detect an open port so that we // define SecondaryBrokerURL property. This property is used to resolve a placeholder // in the aggregate descriptor. Once the property is set we shutdown the secondary broker to // test aggregate recovery from missing broker. Hopefully the same port is still open when // the test starts the secondary broker for the second time. bs = setupSecondaryBroker(false); System.setProperty("SecondaryBrokerURL",bs.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString()); bs.stop(); // wait for the broker to stop while( bs.isStarted() ) { try { synchronized(this) { this.wait(100); } } catch( Exception e) {} } // Deploy aggregate on a secondary broker which was shutdown above. The aggregate should // detect missing broker and silently wait for the broker to come up deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorOnSecondaryBroker.xml"); try { // spin a thread to restart a broker after 5 seconds Thread t = new Thread() { public void run() { BrokerService bs = null; try { // at this point the top level service should show a connection error synchronized (this) { this.wait(5000); // wait for 5 secs } // Create a new broker on port 8119 bs = setupSecondaryBroker(false); System.setProperty("SecondaryBrokerURL",bs.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString()); // Start the uima AS client. It connects to the top level service and sends // 10 messages runTest(null, eeUimaEngine, bs.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString(), "TopLevelTaeQueue", 10, PROCESS_LATCH); } catch (InterruptedException e) { } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } finally { if (bs != null) { try { bs.stop(); } catch (Exception e) { e.printStackTrace(); } } } } }; t.start(); t.join(); } catch (Exception e) { e.printStackTrace(); } } /** * Tests a simple Aggregate with one remote Delegate and collocated Cas Multiplier * * @throws Exception */ public void testDeployAggregateServiceWithTempReplyQueue() throws Exception { System.out.println("-------------- testDeployAggregateServiceWithTempReplyQueue -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateUsingRemoteTempQueue.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } /** * Tests a simple Aggregate with one remote Delegate and collocated Cas Multiplier * * @throws Exception */ public void testProcessAggregateServiceWith1000Docs() throws Exception { System.out.println("-------------- testProcessAggregateServiceWith1000Docs -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithInternalCM1000Docs.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testProcessAggregateWithInnerAggregateCM() throws Exception { System.out.println("-------------- testProcessAggregateWithInnerAggregateCM() -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); System.setProperty(JmsConstants.SessionTimeoutOverride, "2500000"); deployService(eeUimaEngine, relativePath + "/Deploy_ComplexAggregateWithInnerAggregateCM.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } /** * Tests exception thrown in the Uima EE Client when the Collection Reader is added after the uima * ee client is initialized * * @throws Exception */ public void testExceptionOnPostInitializeCollectionReaderInjection() throws Exception { System.out .println("-------------- testExceptionOnPostInitializeCollectionReaderInjection -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue"); initialize(eeUimaEngine, appCtx); waitUntilInitialized(); try { // Simulate plugging in a Collection Reader. This should throw // ResourceInitializationException since the client code has // been already initialized. eeUimaEngine.setCollectionReader(null); } catch (ResourceInitializationException e) { System.out.println("Received Expected Exception:" + ResourceInitializationException.class); // Expected return; } catch (Exception e) { fail("Invalid Exception Thrown. Expected:" + ResourceInitializationException.class + " Received:" + e.getClass()); } finally { eeUimaEngine.stop(); } fail("Expected" + ResourceInitializationException.class); } /** * Tests the shutdown due to a failure in the Flow Controller while diabling a delegate * * @throws Exception */ public void testTerminateOnFlowControllerExceptionOnDisable() throws Exception { System.out .println("-------------- testTerminateOnFlowControllerExceptionOnDisable -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithException.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithFlowControllerExceptionOnDisable.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); } /** * Tests the shutdown due to a failure in the Flow Controller when initializing * * @throws Exception */ public void testTerminateOnFlowControllerExceptionOnInitialization() throws Exception { System.out .println("-------------- testTerminateOnFlowControllerExceptionOnInitialization -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); String[] containerIds = new String[2]; try { containerIds[0] = deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); containerIds[1] = deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithFlowControllerExceptionOnInitialization.xml"); fail("Expected ResourceInitializationException. Instead, the Aggregate Deployed Successfully"); } catch (ResourceInitializationException e) { Exception cause = getCause(e); System.out.println("\nExpected Initialization Exception was received:" + cause); } catch (Exception e) { fail("Expected ResourceInitializationException. Instead Got:" + e.getClass()); } finally { eeUimaEngine.undeploy(containerIds[0]); eeUimaEngine.undeploy(containerIds[1]); } } /** * Tests the shutdown due to a failure in the Flow Controller when initializing AND have delegates * to disable (Jira issue UIMA-1171) * * @throws Exception */ public void testTerminateOnFlowControllerExceptionOnInitializationWithDisabledDelegates() throws Exception { System.out .println("-------------- testTerminateOnFlowControllerExceptionOnInitializationWithDisabledDelegates -----"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); String containerId = null; try { containerId = deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithFlowControllerExceptionOnInitialization.xml"); fail("Expected ResourceInitializationException. Instead, the Aggregate Deployed Successfully"); } catch (ResourceInitializationException e) { Exception cause = getCause(e); System.out.println("\nExpected Initialization Exception was received - cause: " + cause); } catch (Exception e) { fail("Expected ResourceInitializationException. Instead Got:" + e.getClass()); } finally { eeUimaEngine.undeploy(containerId); } } /** * Deploys a Primitive Uima EE service and sends 5 CASes to it. * * @throws Exception */ public void testPrimitiveServiceProcess() throws Exception { System.out.println("-------------- testPrimitiveServiceProcess -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue", 5, PROCESS_LATCH); } /** * Deploys a Primitive Uima EE service and sends 5 CASes to it. * * @throws Exception */ public void testSyncAggregateProcess() throws Exception { System.out.println("-------------- testSyncAggregateProcess -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath + "/Deploy_MeetingDetectorAggregate.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "MeetingDetectorQueue", 5, PROCESS_LATCH); } /** * Deploys a Primitive Uima EE service and sends 5 CASes to it. * * @throws Exception */ public void testPrimitiveServiceProcessPingFailure() throws Exception { System.out.println("-------------- testPrimitiveServiceProcessPingFailure -------------"); // Instantiate Uima EE Client final BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service final String containerID = deployService(eeUimaEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue"); // Set an explicit getMeta (Ping)timeout appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 2000); // Set an explicit process timeout so to test the ping on timeout appCtx.put(UimaAsynchronousEngine.Timeout, 1000); // Spin a thread and wait for awhile before killing the remote service. // This will cause the client to timeout waiting for a CAS reply and // to send a Ping message to test service availability. The Ping times // out and causes the client API to stop. new Thread() { public void run() { Object mux = new Object(); synchronized (mux) { try { mux.wait(1000); // Undeploy service container System.out.println("** About to undeploy PersonTitle service"); eeUimaEngine.undeploy(containerID); } catch (Exception e) { } } } }.start(); super.countPingRetries=true; try { runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue", 500, EXCEPTION_LATCH); } catch (RuntimeException e) { System.out.println(">>> runtest generated exception: " + e); e.printStackTrace(System.out); } super.countPingRetries=false; } /** * Tests error handling on delegate timeout. The Delegate is started as remote, the aggregate * initializes and the client starts sending CASes. After a short while the client kills the * remote delegate. The aggregate receives a CAS timeout and disables the delegate. A timed out * CAS is sent to the next delegate in the pipeline. ALL 1000 CASes are returned to the client. * * @throws Exception */ public void testDelegateTimeoutAndDisable() throws Exception { System.out.println("-------------- testDelegateTimeoutAndDisable -------------"); // Instantiate Uima EE Client final BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service final String containerID = deployService(eeUimaEngine, relativePath + "/Deploy_RoomNumberAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_MeetingDetectorTAE_RemoteRoomNumberDisable.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "MeetingDetectorTaeQueue"); // Set an explicit getMeta (Ping)timeout appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 2000); // Set an explicit process timeout so to test the ping on timeout appCtx.put(UimaAsynchronousEngine.Timeout, 1000); // Spin a thread and wait for awhile before killing the remote service. // This will cause the client to timeout waiting for a CAS reply and // to send a Ping message to test service availability. The Ping times // out and causes the client API to stop. new Thread() { public void run() { Object mux = new Object(); synchronized (mux) { try { mux.wait(500); // Undeploy service container eeUimaEngine.undeploy(containerID); } catch (Exception e) { } } } }.start(); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "MeetingDetectorTaeQueue", 1000, PROCESS_LATCH); } /** * This test kills a remote Delegate while in the middle of processing 1000 CASes. The CAS timeout * error handling disables the delegate and forces ALL CASes from the Pending Reply List to go * through Error Handler. The Flow Controller is configured to continueOnError and CASes that * timed out are allowed to continue to the next delegate. ALL 1000 CASes are accounted for in the * NoOp Annotator that is last in the flow. * * @throws Exception */ public void testDisableDelegateOnTimeoutWithCM() throws Exception { System.out.println("-------------- testDisableDelegateOnTimeoutWithCM -------------"); // Instantiate Uima EE Client final BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service final String containerID = deployService(eeUimaEngine, relativePath + "/Deploy_RoomNumberAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_MeetingDetectorTAEWithCM_RemoteRoomNumberDisable.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "MeetingDetectorTaeQueue"); // Set an explicit getMeta (Ping)timeout appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 2000); // Set an explicit process timeout so to test the ping on timeout appCtx.put(UimaAsynchronousEngine.Timeout, 1000); // Spin a thread and wait for awhile before killing the remote service. // This will cause the client to timeout waiting for a CAS reply and // to send a Ping message to test service availability. The Ping times // out and causes the client API to stop. new Thread() { public void run() { Object mux = new Object(); synchronized (mux) { try { mux.wait(300); // Undeploy service container eeUimaEngine.undeploy(containerID); } catch (Exception e) { } } } }.start(); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "MeetingDetectorTaeQueue", 1, PROCESS_LATCH); } /** * Tests Uima EE client ability to test sendAndReceive in multiple/concurrent threads It spawns 4 * thread each sending 100 CASes to a Primitive Uima EE service * * @throws Exception */ public void testSynchCallProcessWithMultipleThreads() throws Exception { System.out.println("-------------- testSynchCallProcessWithMultipleThreads -------------"); int howManyCASesPerRunningThread = 100; int howManyRunningThreads = 4; runTestWithMultipleThreads(relativePath + "/Deploy_PersonTitleAnnotator.xml", "PersonTitleAnnotatorQueue", howManyCASesPerRunningThread, howManyRunningThreads, 0, 0); } /** * * @throws Exception */ public void testPrimitiveProcessCallWithLongDelay() throws Exception { System.out.println("-------------- testPrimitiveProcessCallWithLongDelay -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithLongDelay.xml"); // We expect 18000ms to be spent in process method super.setExpectedProcessTime(6000); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "NoOpAnnotatorQueueLongDelay"); appCtx.remove(UimaAsynchronousEngine.ReplyWindow); appCtx.put(UimaAsynchronousEngine.ReplyWindow, 1); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "NoOpAnnotatorQueueLongDelay", 4, PROCESS_LATCH, true); } /** * Tests time spent in process CAS. The CAS is sent to three remote delegates each with a delay of * 6000ms in the process method. The aggregate is expected to sum up the time spent in each * annotator process method. The final sum is returned to the client (the test) and compared * against expected 18000ms. The test actually allows for 20ms margin to account for any overhead * (garbage collecting, slow cpu, etc) * * @throws Exception */ public void testAggregateProcessCallWithLongDelay() throws Exception { System.out.println("-------------- testAggregateProcessCallWithLongDelay -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Services each with 6000ms delay in process() deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorAWithLongDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorBWithLongDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorCWithLongDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithLongDelay.xml"); // We expect 18000ms to be spent in process method super.setExpectedProcessTime(18000); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); appCtx.remove(UimaAsynchronousEngine.ReplyWindow); // make sure we only send 1 CAS at a time appCtx.put(UimaAsynchronousEngine.ReplyWindow, 1); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH, true); } /** * Tests Aggregate configuration where the Cas Multiplier delegate is the last delegate in the * Aggregate's pipeline * * @throws Exception */ public void testAggregateProcessCallWithLastCM() throws Exception { System.out.println("-------------- testAggregateProcessCallWithLastCM -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Services each with 6000ms delay in process() deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithLastCM.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH, true); } /** * Tests shutdown while running with multiple/concurrent threads The Annotator throws an exception * and the Aggregate error handling is setup to terminate on the first error. * * @throws Exception */ public void testTimeoutInSynchCallProcessWithMultipleThreads() throws Exception { System.out .println("-------------- testTimeoutInSynchCallProcessWithMultipleThreads -------------"); int howManyCASesPerRunningThread = 2; int howManyRunningThreads = 4; int processTimeout = 2000; int getMetaTimeout = 500; runTestWithMultipleThreads(relativePath + "/Deploy_NoOpAnnotatorWithLongDelay.xml", "NoOpAnnotatorQueueLongDelay", howManyCASesPerRunningThread, howManyRunningThreads, processTimeout, getMetaTimeout); } /** * Tests shutdown while running with multiple/concurrent threads The Annotator throws an exception * and the Aggregate error handling is setup to terminate on the first error. * * @throws Exception */ public void testTimeoutFailureInSynchCallProcessWithMultipleThreads() throws Exception { System.out .println("-------------- testTimeoutFailureInSynchCallProcessWithMultipleThreads -------------"); int howManyCASesPerRunningThread = 1000; int howManyRunningThreads = 4; int processTimeout = 2000; int getMetaTimeout = 500; runTestWithMultipleThreads(relativePath + "/Deploy_NoOpAnnotator.xml", "NoOpAnnotatorQueue", howManyCASesPerRunningThread, howManyRunningThreads, 2000, 1000, true); } /** * Tests a parallel flow in the Uima EE aggregate. * * @throws Exception */ public void testProcessWithParallelFlow() throws Exception { System.out.println("-------------- testProcessWithParallelFlow -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator2.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithParallelFlow.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } /** * Tests ability to disable one delegate in parallel flow and continue * * @throws Exception */ public void testDisableDelegateInParallelFlow() throws Exception { System.out.println("-------------- testDisableDelegateInParallelFlow -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator2.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithParallelFlow.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } /** * This test launches four remote delegates and an aggregate. Three of the delegates: * SlowNoOp1, SlowNoOp2, and NoOp are processing CASes in parallel. SlowNoOp1 and SlowNoOp2 * are configured with a very long delay that exceeds timeout values specified in the aggregate * deployment descriptor. The SlowNoOp1 times out 3 times and is disabled, * SlowNoOp2 times out 4 times and is disabled. The test tests ability * of an aggregate to recover from the timeouts and subsequent disable and carry * on processing with remaining delegates. * * @throws Exception */ public void testMutlipleDelegateTimeoutsInParallelFlows() throws Exception { System.out.println("-------------- testTimeoutDelegateInParallelFlows -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator2.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_SlowNoOpAnnotator1.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_SlowNoOpAnnotator2.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithSlowParallelDelegates.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); appCtx.put(UimaAsynchronousEngine.Timeout, 30000); runTest(appCtx, eeUimaEngine, null, null, 1, PROCESS_LATCH); } /** * * @throws Exception */ public void testTimeoutDelegateInParallelFlows() throws Exception { System.out.println("-------------- testTimeoutDelegateInParallelFlows -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithLongDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator2.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator3.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithParallelFlows.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); // Set an explicit process timeout so one of the 1st parallels is disabled but 2nd parallel flow // continues. appCtx.put(UimaAsynchronousEngine.Timeout, 200000); runTest(appCtx, eeUimaEngine, null, null, 1, PROCESS_LATCH); } /** * Tests Timeout logic * * @throws Exception */ public void testRemoteDelegateTimeout() throws Exception { System.out.println("-------------- testRemoteDelegateTimeout -------------"); System.out.println("The Aggregate sends 2 CASes to the NoOp Annotator which"); System.out.println("delays each CAS for 6000ms. The timeout is set to 4000ms"); System.out.println("Two CAS retries are expected"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithLongDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithLongDelayDelegate.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); // The Remote NoOp delays each CAS for 6000ms. The Aggregate sends two CASes so adjust // client timeout to be just over 12000ms. appCtx.put(UimaAsynchronousEngine.Timeout, 19000); runTest(appCtx, eeUimaEngine, null, null, 1, PROCESS_LATCH); } /** * Tests Timeout logic * * @throws Exception */ public void testDisableOnRemoteDelegatePingTimeout() throws Exception { System.out.println("-------------- testDisableOnRemoteDelegatePingTimeout -------------"); System.out.println("The Aggregate sends 2 CASes to the NoOp Annotator which"); System.out.println("delays each CAS for 6000ms. The timeout is set to 4000ms"); System.out.println("Two CAS retries are expected"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); String delegateContainerId = deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithLongDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithLongDelayDelegate.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); // The Remote NoOp delays each CAS for 6000ms. The Aggregate sends two CASes so adjust // client timeout to be just over 12000ms. appCtx.put(UimaAsynchronousEngine.Timeout, 13000); // Remove container with the remote NoOp delegate so that we can test // the CAS Process and Ping timeout. eeUimaEngine.undeploy(delegateContainerId); // Send the CAS and handle exception runTest(appCtx, eeUimaEngine, null, null, 1, EXCEPTION_LATCH); } public void testDeployAggregateWithCollocatedAggregateService() throws Exception { System.out .println("-------------- testDeployAggregateWithCollocatedAggregateService -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_ComplexAggregate.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 10, PROCESS_LATCH); } public void testProcessWithAggregateUsingCollocatedMultiplier() throws Exception { System.out .println("-------------- testProcessWithAggregateUsingCollocatedMultiplier -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotator.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testExistanceOfParentCasReferenceIdOnChildFailure() throws Exception { System.out .println("-------------- testExistanceOfParentCasReferenceIdOnChildFailure -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithException.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithDelegateFailure.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); // When a callback is received to handle the exception on the child CAS, the message should // contain an CAS id of the parent. If it does the callback handler will set // receivedExpectedParentReferenceId = true Assert.assertTrue(super.receivedExpectedParentReferenceId); } public void testProcessWithAggregateUsingRemoteMultiplier() throws Exception { System.out .println("-------------- testProcessWithAggregateUsingRemoteMultiplier -------------"); System.setProperty("BrokerURL", broker.getMasterConnectorURI()); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplier.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithRemoteMultiplier.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testParentProcessLast() throws Exception { System.out .println("-------------- testParentProcessLast -------------"); System.setProperty("BrokerURL", broker.getMasterConnectorURI()); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplierWith10Docs_1.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithProcessParentLastCMs.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } /** * Starts two remote delegates on one broker and a top level client aggregate on * another. Tests sending Free Cas requests to the appropriate broker. * * @throws Exception */ public void testProcessWithAggregateUsingRemoteMultiplierOnSeparateBroker() throws Exception { System.out .println("-------------- testProcessWithAggregateUsingRemoteMultiplierOnSeparateBroker -------------"); System.setProperty("activemq.broker.jmx.domain","org.apache.activemq.test"); BrokerService broker2 = setupSecondaryBroker(true); System.setProperty("BrokerURL", broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString()); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplier.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithRemoteMultiplier.xml"); Map appCtx = new HashMap(); appCtx.put(UimaAsynchronousEngine.ServerUri, broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString()); appCtx.put(UimaAsynchronousEngine.Endpoint, "TopLevelTaeQueue"); appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 0); runTest(appCtx, eeUimaEngine, broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString(), "TopLevelTaeQueue", 1, PROCESS_LATCH); super.cleanBroker(broker2); broker2.stop(); synchronized(this) { wait(3000); // allow broker some time to stop } } /** * First CM feeds 100 CASes to a "merger" CM that generates one output CAS for every 5 input. * Second CM creates unique document text that is checked by the last component. The default FC * should let 4 childless CASes through, replacing every 5th by its child. * * @throws Exception */ public void testProcessWithAggregateUsingCollocatedMerger() throws Exception { System.out.println("-------------- testProcessWithAggregateUsingRemoteMerger -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithCollocatedMerger.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testProcessWithAggregateUsingRemoteMerger() throws Exception { System.out.println("-------------- testProcessWithAggregateUsingRemoteMerger -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMerger.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithRemoteMerger.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testClientWithAggregateMultiplier() throws Exception { System.out.println("-------------- testClientWithAggregateMultiplier -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplier.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateMultiplier.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); // reduce the cas pool size and reply window appCtx.remove(UimaAsynchronousEngine.ShadowCasPoolSize); appCtx.put(UimaAsynchronousEngine.ShadowCasPoolSize, Integer.valueOf(2)); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testClientProcessWithRemoteMultiplier() throws Exception { System.out.println("-------------- testClientProcessWithRemoteMultiplier -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplier.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TestMultiplierQueue"); appCtx.remove(UimaAsynchronousEngine.ShadowCasPoolSize); appCtx.put(UimaAsynchronousEngine.ShadowCasPoolSize, Integer.valueOf(1)); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TestMultiplierQueue", 1, PROCESS_LATCH); } public void testClientProcessWithComplexAggregateRemoteMultiplier() throws Exception { System.out .println("-------------- testClientProcessWithComplexAggregateRemoteMultiplier -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplierWith10Docs_1.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_CasMultiplierAggregateWithRemoteCasMultiplier.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testProcessWithAggregateUsing2RemoteMultipliers() throws Exception { System.out .println("-------------- testProcessWithAggregateUsing2RemoteMultipliers -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplierWith10Docs_1.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplierWith10Docs_2.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWith2RemoteMultipliers.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testProcessWithAggregateUsing2CollocatedMultipliers() throws Exception { System.out .println("-------------- testProcessWithAggregateUsing2CollocatedMultipliers -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWith2Multipliers.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testProcessAggregateWithInnerCMAggregate() throws Exception { System.out.println("-------------- testProcessAggregateWithInnerCMAggregate -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_TopAggregateWithInnerAggregateCM.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testBlueJDeployment() throws Exception { System.out.println("-------------- testBlueJDeployment -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy replicated services for the inner remote aggregate CM deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); // Deploy an instance of a remote aggregate CM containing a collocated Cas Multiplier // CM --> Replicated Remote Primitive --> NoOp CC deployService(eeUimaEngine, relativePath + "/Deploy_CMAggregateWithCollocatedCM.xml"); // Deploy top level Aggregate Cas Multiplier with 2 collocated Cas Multipliers // CM1 --> CM2 --> Remote AggregateCM --> Candidate Answer --> CC deployService(eeUimaEngine, relativePath + "/Deploy_TopLevelBlueJAggregateCM.xml"); runTest2(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 10, PROCESS_LATCH); } public void testTypesystemMergeWithMultiplier() throws Exception { System.out.println("-------------- testTypesystemMergeWithMultiplier -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithMergedTypes.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testStopAggregateWithRemoteMultiplier() throws Exception { System.out.println("-------------- testStopAggregateWithRemoteMultiplier -------------"); System.setProperty("BrokerURL", broker.getMasterConnectorURI()); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplier.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithExceptionOn5thCAS.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithRemoteMultiplier.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); } public void testCancelProcessAggregateWithCollocatedMultiplier() throws Exception { System.out .println("-------------- testCancelProcessAggregateWithCollocatedMultiplier -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_ComplexAggregateWith1MillionDocs.xml"); // Spin a thread to cancel Process after 20 seconds spinShutdownThread(eeUimaEngine, 20000); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } public void testCancelProcessAggregateWithRemoteMultiplier() throws Exception { System.out.println("-------------- testStopAggregateWithRemoteMultiplier -------------"); System.setProperty("BrokerURL", broker.getMasterConnectorURI()); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_RemoteCasMultiplierWith1MillionDocs.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithRemoteMultiplier.xml"); // Spin a thread to cancel Process after 20 seconds spinShutdownThread(eeUimaEngine, 20000); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH);// EXCEPTION_LATCH); } /** * Test correct reply from the service when its process method fails. Deploys the Primitive * Service ( NoOp Annotator) that is configured to throw an exception on every CAS. The expected * behavior is for the Primitive Service to return a reply with an Exception. This code blocks on * a Count Down Latch, until the exception is returned from the service. When the exception is * received the latch is opened indicating success. * * @throws Exception */ public void testPrimitiveServiceResponseOnException() throws Exception { System.out.println("-------------- testPrimitiveServiceResponseOnException -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithException.xml"); // Deploy Uima EE Primitive Service // Initialize and run the Test. Wait for a completion and cleanup resources. runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "NoOpAnnotatorQueue", 1, EXCEPTION_LATCH); } public void testProcessParallelFlowWithDelegateFailure() throws Exception { System.out.println("-------------- testProcessParallelFlowWithDelegateFailure -------------"); // Create Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithException.xml"); // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator2.xml"); // Deploy top level aggregate service deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithParallelFlowTerminateOnDelegateFailure.xml"); // Initialize and run the Test. Wait for a completion and cleanup resources. runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); // PC_LATCH); } /** * Tests that the thresholdAction is taken when thresholdCount errors occur in the last * thresholdWindow CASes. Aggregate has two annotators, first fails with increasing frequency (on * CASes 10 19 27 34 40 45 49 52 54) and is disabled after 3 errors in a window of 7 (49,52,54) * Second annotator counts the CASes that reach it and verifies that it sees all but the 9 * failures. It throws an exception if the first is disabled after too many or too few errors. * * @throws Exception */ public void testErrorThresholdWindow() throws Exception { System.out.println("-------------- testErrorThresholdWindow -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithThresholdWindow.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); // Set an explicit CPC timeout as exceptions thrown in the 2nd annotator's CPC don't reach the // client. appCtx.put(UimaAsynchronousEngine.CpcTimeout, 20000); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); // PC_LATCH); } public void testProcessParallelFlowWithDelegateDisable() throws Exception { System.out.println("-------------- testProcessParallelFlowWithDelegateDisable -------------"); // Create Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithException.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_SimpleAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithParallelFlowDisableOnDelegateFailure.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); // PC_LATCH); } public void testPrimitiveShutdownOnTooManyErrors() throws Exception { System.out.println("-------------- testPrimitiveShutdownOnTooManyErrors -------------"); // Create Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); // Deploy top level aggregate service deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotator.xml"); // Initialize and run the Test. Wait for a completion and cleanup resources. runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, CPC_LATCH); } /** * Tests exception thrown in the Uima EE Client when the Collection Reader is added after the uima * ee client is initialized * * @throws Exception */ public void testCollectionReader() throws Exception { System.out.println("-------------- testCollectionReader -------------"); // Instantiate Uima EE Client BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_PersonTitleAnnotator.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "PersonTitleAnnotatorQueue"); // reduce the cas pool size and reply window appCtx.remove(UimaAsynchronousEngine.CasPoolSize); appCtx.put(UimaAsynchronousEngine.CasPoolSize, Integer.valueOf(2)); appCtx.remove(UimaAsynchronousEngine.ReplyWindow); appCtx.put(UimaAsynchronousEngine.ReplyWindow, 1); // set the collection reader String filename = super .getFilepathFromClassloader("descriptors/collection_reader/ExtendedTestFileSystemCollectionReader.xml"); if (filename == null) { fail("Unable to find file:" + "descriptors/collection_reader/ExtendedTestFileSystemCollectionReader.xml" + "in classloader"); } File collectionReaderDescriptor = new File(filename); CollectionReaderDescription collectionReaderDescription = UIMAFramework.getXMLParser() .parseCollectionReaderDescription(new XMLInputSource(collectionReaderDescriptor)); CollectionReader collectionReader = UIMAFramework .produceCollectionReader(collectionReaderDescription); eeUimaEngine.setCollectionReader(collectionReader); initialize(eeUimaEngine, appCtx); waitUntilInitialized(); runCrTest(eeUimaEngine, 7); synchronized (this) { wait(50); } eeUimaEngine.stop(); } public void testAsynchronousTerminate() throws Exception { System.out.println("-------------- testAsynchronousTerminate -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); try { deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator2.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithParallelFlow.xml"); initialize(eeUimaEngine, appCtx); // Wait until the top level service returns its metadata waitUntilInitialized(); } catch( Exception e) { throw e; } CAS cas = eeUimaEngine.getCAS(); System.out.println(" Sending CAS to kick off aggregate w/colocated CasMultiplier"); eeUimaEngine.sendCAS(cas); System.out.println(" Waiting 1 seconds"); Thread.sleep(1000); System.out.println(" Trying to stop service"); eeUimaEngine.stop(); System.out.println(" stop() returned!"); } public void testCallbackListenerOnFailure() throws Exception { System.out.println("-------------- testCallbackListenerOnFailure -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithException.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "NoOpAnnotatorQueue"); initialize(eeUimaEngine, appCtx); // Wait until the top level service returns its metadata waitUntilInitialized(); CAS cas = eeUimaEngine.getCAS(); // Register special callback listener. This listener will receive // an exception with the Cas Reference id. TestListener listener = new TestListener(this); eeUimaEngine.addStatusCallbackListener(listener); // Send request out and save Cas Reference id String casReferenceId = eeUimaEngine.sendCAS(cas); // Spin a callback listener thread Thread t = new Thread(listener); t.start(); // Wait for reply CAS. This method blocks String cRefId = listener.getCasReferenceId(); try { // Test if received Cas Reference Id matches the id of the CAS sent out if (!cRefId.equals(casReferenceId)) { fail("Received Invalid Cas Reference Id. Expected:" + casReferenceId + " Received: " + cRefId); } else { System.out.println("Received Expected Cas Identifier:" + casReferenceId); } } finally { // Stop callback listener thread listener.doStop(); eeUimaEngine.stop(); } } public void testTerminateOnInitializationFailure() throws Exception { System.out.println("-------------- testTerminateOnInitializationFailure -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); try { deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithParallelFlow.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); exceptionCountLatch = new CountDownLatch(1); initialize(eeUimaEngine, appCtx); fail("Expected ResourceInitializationException. Instead, the Aggregate Reports Successfull Initialization"); } catch (ResourceInitializationException e) { Exception cause = getCause(e); System.out.println("Expected Initialization Exception was received:" + cause); } catch (Exception e) { fail("Expected ResourceInitializationException. Instead Got:" + e.getClass()); } finally { eeUimaEngine.stop(); } } /** * Tests shutdown due to delegate broker missing. The Aggregate is configured to retry getMeta 3 * times and continue. The client times out after 20 seconds and forces the shutdown. NOTE: The * Spring listener tries to recover JMS connection on failure. In this test a Listener to remote * delegate cannot be established due to a missing broker. The Listener is setup to retry every 60 * seconds. After failure, the listener goes to sleep for 60 seconds and tries again. This results * in a 60 second delay at the end of this test. * * @throws Exception */ public void testTerminateOnInitializationFailureWithDelegateBrokerMissing() throws Exception { System.out .println("-------------- testTerminateOnInitializationFailureWithDelegateBrokerMissing -------------"); System.out .println("---------------------- The Uima Client Times Out After 20 seconds --------------------------"); System.out .println("-- The test requires 1 minute to complete due to 60 second delay in Spring Listener ----"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); try { // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); // Deploy top level aggregate that communicates with the remote via Http Tunnelling deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorTerminateOnDelegateBadBrokerURL.xml"); // Initialize and run the Test. Wait for a completion and cleanup resources. Map appCtx = new HashMap(); appCtx.put(UimaAsynchronousEngine.ServerUri, String.valueOf(broker.getMasterConnectorURI())); appCtx.put(UimaAsynchronousEngine.Endpoint, "TopLevelTaeQueue"); appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 20000); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); fail("Expected ResourceInitializationException. Instead, the Aggregate Reports Successfull Initialization"); } catch (ResourceInitializationException e) { Exception cause = getCause(e); System.out.println("Expected Initialization Exception was received:" + cause); } catch (Exception e) { fail("Expected ResourceInitializationException. Instead Got:" + e.getClass()); } finally { eeUimaEngine.stop(); } } /** * Tests shutdown due to delegate broker missing. The Aggregate is configured to terminate on * getMeta timeout. * * @throws Exception */ public void testTerminateOnInitializationFailureWithAggregateForcedShutdown() throws Exception { System.out .println("-------------- testTerminateOnInitializationFailureWithAggregateForcedShutdown -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Initialize and run the Test. Wait for a completion and cleanup resources. try { // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); // Deploy top level aggregate that communicates with the remote via Http Tunnelling deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithHttpDelegateNoRetries.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 10, EXCEPTION_LATCH); fail("Expected ResourceInitializationException. Instead, the Aggregate Reports Successfull Initialization"); } catch (ResourceInitializationException e) { Exception cause = getCause(e); System.out.println("Expected Initialization Exception was received:" + cause); } catch (Exception e) { fail("Expected ResourceInitializationException. Instead Got:" + e.getClass()); } finally { eeUimaEngine.stop(); } } /** * Tests shutdown due to delegate broker missing. The Aggregate is configured to retry getMeta 3 * times and continue. The client times out after 20 seconds and forces the shutdown. NOTE: The * Spring listener tries to recover JMS connection on failure. In this test a Listener to remote * delegate cannot be established due to a missing broker. The Listener is setup to retry every 60 * seconds. After failure, the listener goes to sleep for 60 seconds and tries again. This results * in a 60 second delay at the end of this test. * * @throws Exception */ public void testDisableOnInitializationFailureWithDelegateBrokerMissing() throws Exception { System.out .println("-------------- testDisableOnInitializationFailureWithDelegateBrokerMissing() -------------"); System.out .println("---------------------- The Uima Client Times Out After 20 seconds --------------------------"); System.out .println("-- The test requires 1 minute to complete due to 60 second delay in Spring Listener ----"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); try { // Deploy remote service deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); // Deploy top level aggregate that communicates with the remote via Http Tunnelling deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotatorWithHttpDelegate.xml"); // Initialize and run the Test. Wait for a completion and cleanup resources. Map appCtx = new HashMap(); appCtx.put(UimaAsynchronousEngine.ServerUri, String.valueOf(broker.getMasterConnectorURI())); appCtx.put(UimaAsynchronousEngine.Endpoint, "TopLevelTaeQueue"); appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 20000); runTest(appCtx, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } catch (Exception e) { fail("Expected Success. Instead Received Exception:" + e.getClass()); } finally { eeUimaEngine.stop(); } } /** * This tests some of the error handling. Each annotator writes a file and throws an exception. * After the CAS is processed the presence/absence of certain files indicates success or failure. * The first annotator fails and lets the CAS proceed, so should write only one file. The second * annotator fails and is retried 2 times, and doesn't let the CAS proceed, so should write 3 * files. The third annotator should not see the CAS, so should not write any files * * @throws Exception */ public void testContinueOnRetryFailure() throws Exception { System.out.println("-------------- testContinueOnRetryFailure -------------"); File tempDir = new File("target/temp"); deleteAllFiles(tempDir); try { tempDir.mkdir(); } catch( Exception e) { e.printStackTrace(); throw e; } BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_WriterAnnotatorA.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_WriterAnnotatorB.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithContinueOnRetryFailures.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); if (!(new File(tempDir, "WriterAnnotatorB.3")).exists() || (new File(tempDir, "WriterAnnotatorB.4")).exists()) { fail("Second annotator should have run 3 times"); } if ((new File(tempDir, "WriterAnnotatorC.1")).exists()) { fail("Third annotator should not have seen CAS"); } } /** * Test use of a JMS Service Adapter. Invoke from a synchronous aggregate to emulate usage from * RunAE or RunCPE. * * @throws Exception */ public void testJmsServiceAdapter() throws Exception { System.out.println("-------------- testJmsServiceAdapter -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_SyncAggregateWithJmsService.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 10, PROCESS_LATCH); } /* * Tests Uima AS client placeholder handling and substitution. The Uima Aggregate instantiates * UIMA AS client proxy using Jms Client Descriptor that contains a placeholder * ${defaultBrokerURL} instead of hard coded Broker URL. The client parses the * placeholder string, retrieves the name (defaultBrokerURL) and uses it to look * up tha actual broker URL in System properties. */ public void testJmsServiceAdapterWithPlaceholder() throws Exception { System.out.println("-------------- testJmsServiceAdapterWithPlaceholder -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_SyncAggregateWithJmsServiceUsingPlaceholder.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 10, PROCESS_LATCH); } /** * Tests use of a JMS Service Adapter and an override of the MultipleDeploymentAllowed. * In this test, the AE descriptor of the remote service is configured with MultipleDeploymentAllowed=false * Without the override this causes an exception when instantiating Uima aggregate with * MultipleDeploymentAllowed=true. * * @throws Exception */ public void testJmsServiceAdapterWithOverride() throws Exception { System.out.println("-------------- testJmsServiceAdapterWithOverride -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_SingleInstancePersonTitleAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_SyncAggregateWithJmsServiceAndScaleoutOverride.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 10, PROCESS_LATCH); } public void testJmsServiceAdapterWithException() throws Exception { System.out.println("-------------- testJmsServiceAdapterWithException -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithException.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_SyncAggregateWithJmsService.xml"); Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue"); appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, 0); initialize(eeUimaEngine, appCtx); waitUntilInitialized(); CAS cas = eeUimaEngine.getCAS(); try { eeUimaEngine.sendAndReceiveCAS(cas); } catch (Exception e) { e.printStackTrace(); } finally { eeUimaEngine.collectionProcessingComplete(); cas.reset(); } eeUimaEngine.stop(); } public void testJmsServiceAdapterWithProcessTimeout() throws Exception { System.out.println("-------------- testJmsServiceAdapterWithProcessTimeout -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotatorWithLongDelay.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_SyncAggregateWithJmsServiceLongDelay.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, EXCEPTION_LATCH); } public void testJmsServiceAdapterWithGetmetaTimeout() throws Exception { System.out.println("-------------- testJmsServiceAdapterWithGetmetaTimeout -------------"); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); try { deployService(eeUimaEngine, relativePath + "/Deploy_SyncAggregateWithJmsService.xml"); } catch (ResourceInitializationException e) { System.out.println("Received Expected ResourceInitializationException"); return; } Assert.fail("Expected ResourceInitializationException Not Thrown. Instead Got Clean Run"); } public void testDeployAgainAndAgain() throws Exception { System.out.println("-------------- testDeployAgainAndAgain -------------"); // in the // loop, // no // change. for (int num = 1; num <= 50; num++) { BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // here or System.out.println("\nRunning iteration " + num); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_NoOpAnnotator2.xml"); deployService(eeUimaEngine, relativePath + "/Deploy_AggregateWithParallelFlow.xml"); runTest(null, eeUimaEngine, String.valueOf(broker.getMasterConnectorURI()), "TopLevelTaeQueue", 1, PROCESS_LATCH); } } private Exception getCause(Throwable e) { Exception cause = (Exception) e; while (cause.getCause() != null) { cause = (Exception) cause.getCause(); } return cause; } /** * This tests GetMeta retries. It deploys a simple Aggregate service that contains a collocated * Primitive service and a Primitive remote. The Primitive remote is simulated in this code. The * code starts a listener where the Aggregate sends GetMeta requests. The listener responds to the * Aggregate with its metadata only when an expected number of GetMeta retries is met. If the * Aggregate fails to send expected number of GetMeta requests, the listener will not adjust its * CountDownLatch and will cause this test to hang. * * @throws Exception */ public void getMetaRetry() throws Exception { getMetaCountLatch = new CountDownLatch(MaxGetMetaRetryCount); Connection connection = getConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQDestination destination = (ActiveMQDestination) session .createQueue(primitiveServiceQueue1); ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) session .createConsumer(destination); consumer.setMessageListener(new MessageListener() { public void onMessage(Message aMessage) { try { if (isMetaRequest(aMessage)) { // Reply with metadata when retry count reaches defined threshold if (getMetaRequestCount > 0 && getMetaRequestCount % MaxGetMetaRetryCount == 0) { JmsMessageContext msgContext = new JmsMessageContext(aMessage, primitiveServiceQueue1); JmsOutputChannel outputChannel = new JmsOutputChannel(); outputChannel.setServiceInputEndpoint(primitiveServiceQueue1); outputChannel.setServerURI(getBrokerUri()); Endpoint endpoint = msgContext.getEndpoint(); outputChannel.sendReply(getPrimitiveMetadata1(PrimitiveDescriptor1), endpoint, true); } getMetaRequestCount++; getMetaCountLatch.countDown(); // Count down to unblock the thread } } catch (Exception e) { e.printStackTrace(); } } }); consumer.start(); BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); String containerId = deployService(eeUimaEngine, relativePath + "/Deploy_AggregateAnnotator.xml"); Map appCtx = new HashMap(); appCtx.put(UimaAsynchronousEngine.ServerUri, String.valueOf(broker.getMasterConnectorURI())); appCtx.put(UimaAsynchronousEngine.Endpoint, "TopLevelTaeQueue"); appCtx.put(UimaAsynchronousEngine.CasPoolSize, Integer.valueOf(4)); appCtx.put(UimaAsynchronousEngine.ReplyWindow, 15); appCtx.put(UimaAsynchronousEngine.Timeout, 0); initialize(eeUimaEngine, appCtx); System.out .println("TestBroker.testGetMetaRetry()-Blocking On GetMeta Latch. Awaiting GetMeta Requests"); /*********************************************************************************/ /**** This Code Will Block Until Expected Number Of GetMeta Requests Arrive ******/ getMetaCountLatch.await(); /*********************************************************************************/ consumer.stop(); connection.stop(); eeUimaEngine.undeploy(containerId); eeUimaEngine.stop(); } public ProcessingResourceMetaData getPrimitiveMetadata1(String aDescriptor) throws Exception { ResourceSpecifier resourceSpecifier = UimaClassFactory.produceResourceSpecifier(aDescriptor); return ((AnalysisEngineDescription) resourceSpecifier).getAnalysisEngineMetaData(); } private static boolean deleteAllFiles(File directory) { if (directory.isDirectory()) { String[] files = directory.list(); for (int i = 0; i < files.length; i++) { deleteAllFiles(new File(directory, files[i])); } } // Now have an empty directory or simple file return directory.delete(); } private static class TestListener extends UimaAsBaseCallbackListener implements Runnable { private String casReferenceId = null; private Object monitor = new Object(); public TestListener(TestUimaASExtended aTester) { } public void collectionProcessComplete(EntityProcessStatus arg0) { // TODO Auto-generated method stub } public void onBeforeMessageSend(UimaASProcessStatus status) { System.out.println("TestListener Received onBeforeMessageSend Notification with Cas:" + status.getCasReferenceId()); } public void entityProcessComplete(CAS aCAS, EntityProcessStatus aProcessStatus) { if (aProcessStatus.isException()) { if (aProcessStatus instanceof UimaASProcessStatus) { casReferenceId = ((UimaASProcessStatus) aProcessStatus).getCasReferenceId(); if (casReferenceId != null) { synchronized (monitor) { monitor.notifyAll(); } } } } } public void initializationComplete(EntityProcessStatus arg0) { // TODO Auto-generated method stub } public String getCasReferenceId() { synchronized (monitor) { while (casReferenceId == null) { try { monitor.wait(); } catch (InterruptedException e) { } } } return casReferenceId; } public void doStop() { } public void run() { System.out.println("Stopping TestListener Callback Listener Thread"); } } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/flow/000077500000000000000000000000001160020716200263325ustar00rootroot00000000000000AdvancedFixedFlowController.java000066400000000000000000000365141160020716200345100ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/flow/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ee.test.flow; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.apache.uima.aae.error.MessageTimeoutException; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData; import org.apache.uima.cas.CAS; import org.apache.uima.flow.CasFlowController_ImplBase; import org.apache.uima.flow.CasFlow_ImplBase; import org.apache.uima.flow.FinalStep; import org.apache.uima.flow.Flow; import org.apache.uima.flow.FlowControllerContext; import org.apache.uima.flow.ParallelStep; import org.apache.uima.flow.SimpleStep; import org.apache.uima.flow.Step; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.util.Level; import org.apache.uima.util.Logger; /** * Simple FlowController that invokes components in a fixed sequence. */ public class AdvancedFixedFlowController extends CasFlowController_ImplBase { public static final String PARAM_ACTION_AFTER_CAS_MULTIPLIER = "ActionAfterCasMultiplier"; public static final String PARAM_ALLOW_CONTINUE_ON_FAILURE = "AllowContinueOnFailure"; public static final String PARAM_ALLOW_DROP_ON_FAILURE = "AllowDropOnFailure"; public static final String PARAM_FLOW = "Flow"; private static final int ACTION_CONTINUE = 0; private static final int ACTION_STOP = 1; private static final int ACTION_DROP = 2; private static final int ACTION_DROP_IF_NEW_CAS_PRODUCED = 3; public static final String EXCEPTIONS_TO_IGNORE = "ExceptionsToIgnore"; private ArrayList mSequence; private int mActionAfterCasMultiplier; private Set mAEsAllowingContinueOnFailure = new HashSet(); private Set mAEsAllowingDropOnFailure = new HashSet(); private boolean flowError; private String[] exceptionsToIgnore; private Logger mLogger; private int nCreated; public void initialize(FlowControllerContext aContext) throws ResourceInitializationException { super.initialize(aContext); mLogger = aContext.getLogger(); String[] flow = (String[]) aContext.getConfigParameterValue(PARAM_FLOW); mSequence = new ArrayList(); for (int i = 0; i < flow.length; i++) { String[] aes = flow[i].split(","); if (aes.length == 1) { mSequence.add(new SimpleStep(aes[0])); } else { Collection keys = new ArrayList(); keys.addAll(Arrays.asList(aes)); mSequence.add(new ParallelStep(keys)); } } String actionAfterCasMultiplier = (String) aContext .getConfigParameterValue(PARAM_ACTION_AFTER_CAS_MULTIPLIER); if ("continue".equalsIgnoreCase(actionAfterCasMultiplier)) { mActionAfterCasMultiplier = ACTION_CONTINUE; } else if ("stop".equalsIgnoreCase(actionAfterCasMultiplier)) { mActionAfterCasMultiplier = ACTION_STOP; } else if ("drop".equalsIgnoreCase(actionAfterCasMultiplier)) { mActionAfterCasMultiplier = ACTION_DROP; } else if ("dropIfNewCasProduced".equalsIgnoreCase(actionAfterCasMultiplier)) { mActionAfterCasMultiplier = ACTION_DROP_IF_NEW_CAS_PRODUCED; } else if (actionAfterCasMultiplier == null) { mActionAfterCasMultiplier = ACTION_DROP_IF_NEW_CAS_PRODUCED; // default } else { throw new ResourceInitializationException(); // TODO } exceptionsToIgnore = (String[]) aContext.getConfigParameterValue(EXCEPTIONS_TO_IGNORE); // Some delegates allow the CAS to continue in the flow after an error String[] aeKeysAllowingContinue = (String[]) aContext .getConfigParameterValue(PARAM_ALLOW_CONTINUE_ON_FAILURE); if (aeKeysAllowingContinue != null) { mAEsAllowingContinueOnFailure.addAll(Arrays.asList(aeKeysAllowingContinue)); } // Some delegates want the CAS quietly dropped after an error String[] aeKeysAllowingDrop = (String[]) aContext .getConfigParameterValue(PARAM_ALLOW_DROP_ON_FAILURE); if (aeKeysAllowingDrop != null) { mAEsAllowingDropOnFailure.addAll(Arrays.asList(aeKeysAllowingDrop)); } flowError = false; nCreated = 0; } /* * (non-Javadoc) * * @see org.apache.uima.flow.CasFlowController_ImplBase#computeFlow(org.apache.uima.cas.CAS) */ public Flow computeFlow(CAS aCAS) throws AnalysisEngineProcessException { ++nCreated; return new FixedFlowObject(0, false, Integer.toString(nCreated)); } /* * (non-Javadoc) * * @see org.apache.uima.flow.FlowController_ImplBase#addAnalysisEngines(java.util.Collection) */ public void addAnalysisEngines(Collection aKeys) { // Append new keys as a ParallelStep at end of Sequence mSequence.add(new ParallelStep(new ArrayList(aKeys))); } /* * (non-Javadoc) * * @see org.apache.uima.flow.FlowController_ImplBase#removeAnalysisEngines(java.util.Collection) */ public void removeAnalysisEngines(Collection aKeys) throws AnalysisEngineProcessException { // Remove keys from Sequence for (int i = 0; i < mSequence.size(); ++i) { Step step = (Step) mSequence.get(i); if (step instanceof SimpleStep && aKeys.contains(((SimpleStep) step).getAnalysisEngineKey())) { mSequence.set(i, null); } else if (step instanceof ParallelStep) { Collection keys = new ArrayList(((ParallelStep) step).getAnalysisEngineKeys()); keys.removeAll(aKeys); if (keys.isEmpty()) { mSequence.set(i, null); } else { mSequence.set(i, new ParallelStep(keys)); } } } } class FixedFlowObject extends CasFlow_ImplBase { private int currentStep; private boolean wasPassedToCasMultiplier = false; private boolean casMultiplierProducedNewCas = false; private boolean internallyCreatedCas = false; private boolean dropOnFailure = false; private String flowId; private int nCreated; /** * Create a new fixed flow starting at step startStep of the fixed sequence. * * @param startStep * index of mSequence to start at * @param internallyCreatedCas * true to indicate that this Flow object is for a CAS that was produced by a * CasMultiplier within this aggregate. Such CASes area allowed to be dropped and not * output from the aggregate. * @param id * id of CAS used in logging messages * */ public FixedFlowObject(int startStep, boolean internallyCreatedCas, String id) { if (internallyCreatedCas) { mLogger.log(Level.FINE, "CAS " + id + " created by " + ((SimpleStep) mSequence.get(startStep - 1)).getAnalysisEngineKey()); } else { mLogger.log(Level.FINE, "CAS " + id + " at start of flow"); } flowId = id; nCreated = 0; currentStep = startStep; this.internallyCreatedCas = internallyCreatedCas; } /* * (non-Javadoc) * * @see org.apache.uima.flow.Flow#next() */ public Step next() throws AnalysisEngineProcessException { // Terminate flow if continueOnFailure was unhappy if (flowError) { throw new RuntimeException("Flow error found in continueOnFailure"); } if (dropOnFailure) { mLogger .log(Level.FINE, "CAS " + flowId + " skips rest of flow after failing previous step"); return new FinalStep(internallyCreatedCas); } // if CAS was passed to a CAS multiplier on the last step, special processing // is needed according to the value of the ActionAfterCasMultiplier config parameter if (wasPassedToCasMultiplier) { switch (mActionAfterCasMultiplier) { case ACTION_STOP: mLogger.log(Level.FINE, "CAS " + flowId + " stops after CasMultiplier "); return new FinalStep(); case ACTION_DROP: mLogger.log(Level.FINE, "CAS " + flowId + " discarded after CasMultiplier"); return new FinalStep(internallyCreatedCas); case ACTION_DROP_IF_NEW_CAS_PRODUCED: if (casMultiplierProducedNewCas) { mLogger.log(Level.FINE, "CAS " + flowId + " discarded after CasMultiplier (as new CAS produced)"); return new FinalStep(internallyCreatedCas); } // else, continue with flow break; // if action is ACTION_CONTINUE, just continue with flow } wasPassedToCasMultiplier = false; casMultiplierProducedNewCas = false; } // Get next in sequence, skipping any disabled ones Step nextStep; do { if (currentStep >= mSequence.size()) { mLogger.log(Level.FINE, "CAS " + flowId + " at end of flow"); return new FinalStep(); // this CAS has finished the sequence } nextStep = (Step) mSequence.get(currentStep++); if (nextStep == null) { mLogger.log(Level.FINE, "CAS " + flowId + " skipping disabled step " + currentStep); } } while (nextStep == null); // if next step is a CasMultiplier, set wasPassedToCasMultiplier to true for next time if (stepContainsCasMultiplier(nextStep)) wasPassedToCasMultiplier = true; String stepName = "?"; if (nextStep instanceof SimpleStep) { stepName = ((SimpleStep) nextStep).getAnalysisEngineKey(); mLogger.log(Level.FINE, "CAS " + flowId + " sent to " + stepName); } else if (nextStep instanceof FinalStep) { stepName = "Final-" + currentStep; mLogger.log(Level.FINE, "CAS " + flowId + " at final step - will" + (((FinalStep) nextStep).getForceCasToBeDropped() ? "" : " not") + " be dropped"); } else if (nextStep instanceof ParallelStep) { ((ParallelStep) nextStep).getAnalysisEngineKeys().toArray(new String[0]); stepName = ((ParallelStep) nextStep).getAnalysisEngineKeys().toString(); mLogger.log(Level.FINE, "CAS " + flowId + " sent in parallel to: " + stepName); } // now send the CAS to the next AE(s) in sequence. return nextStep; } /** * @param nextStep * @return */ private boolean stepContainsCasMultiplier(Step nextStep) { if (nextStep instanceof SimpleStep) { AnalysisEngineMetaData md = (AnalysisEngineMetaData) getContext() .getAnalysisEngineMetaDataMap().get(((SimpleStep) nextStep).getAnalysisEngineKey()); return md != null && md.getOperationalProperties() != null && md.getOperationalProperties().getOutputsNewCASes(); } else if (nextStep instanceof ParallelStep) { Iterator iter = ((ParallelStep) nextStep).getAnalysisEngineKeys().iterator(); while (iter.hasNext()) { String key = (String) iter.next(); AnalysisEngineMetaData md = (AnalysisEngineMetaData) getContext() .getAnalysisEngineMetaDataMap().get(key); if (md != null && md.getOperationalProperties() != null && md.getOperationalProperties().getOutputsNewCASes()) return true; } return false; } else return false; } /* * (non-Javadoc) * * @see org.apache.uima.flow.CasFlow_ImplBase#newCasProduced(CAS, String) */ public Flow newCasProduced(CAS newCas, String producedBy) throws AnalysisEngineProcessException { // record that the input CAS has been segmented (affects its subsequent flow) casMultiplierProducedNewCas = true; // start the new output CAS from the next node after the CasMultiplier that produced it int i = 0; while (!stepContains((Step) mSequence.get(i), producedBy)) i++; ++nCreated; return new FixedFlowObject(i + 1, true, flowId + "." + nCreated); } /** * @param object * @param producedBy * @return */ private boolean stepContains(Step step, String producedBy) { if (step instanceof SimpleStep) { return ((SimpleStep) step).getAnalysisEngineKey().equals(producedBy); } else if (step instanceof ParallelStep) { Iterator iter = ((ParallelStep) step).getAnalysisEngineKeys().iterator(); while (iter.hasNext()) { String key = (String) iter.next(); if (key.equals(producedBy)) return true; } return false; } else return false; } /* * (non-Javadoc) * * @see org.apache.uima.flow.CasFlow_ImplBase#continueOnFailure(java.lang.String, * java.lang.Exception) */ public boolean continueOnFailure(String failedAeKey, Exception failure) { // Check that root cause is expected Throwable cause = failure; while (cause.getCause() != null) { cause = cause.getCause(); } mLogger.log(Level.WARNING, failedAeKey + " ERROR = " + cause.toString()); // Usually expect IndexOutOfBoundsException or MessageTimeoutException // (forced when a delegate with outstanding CASes is disabled) but these // must now be explicitly specified in the descriptor. if (!expectedException(cause)) { System.out .println("FlowController.continueOnFailure - Unexpected cause for delegate failure: " + cause.getClass()); // Throwing an exception here doesn't stop flow! // Will be thrown in "next" method so should let CAS continue !? flowError = true; return false; } Boolean carryOn = mAEsAllowingContinueOnFailure.contains(failedAeKey); dropOnFailure = internallyCreatedCas && mAEsAllowingDropOnFailure.contains(failedAeKey); if (dropOnFailure) { mLogger.log(Level.FINE, "CAS " + flowId + " will be quietly dropped after failure of " + failedAeKey); } else { mLogger.log(Level.FINE, "CAS " + flowId + " CAN" + (carryOn ? "" : "NOT") + " continue in flow after failure of " + failedAeKey); } return carryOn || dropOnFailure; } private boolean expectedException(Throwable failure) { if (exceptionsToIgnore != null) { for (String exception : exceptionsToIgnore) { if (failure.getClass().getName().equals(exception)) { return true; } } } return false; } } } AdvancedFixedFlowControllerWithInitiFailure.java000066400000000000000000000237561160020716200376550ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/flow/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ee.test.flow; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData; import org.apache.uima.cas.CAS; import org.apache.uima.flow.CasFlowController_ImplBase; import org.apache.uima.flow.CasFlow_ImplBase; import org.apache.uima.flow.FinalStep; import org.apache.uima.flow.Flow; import org.apache.uima.flow.FlowControllerContext; import org.apache.uima.flow.ParallelStep; import org.apache.uima.flow.SimpleStep; import org.apache.uima.flow.Step; import org.apache.uima.resource.ResourceInitializationException; /** * This FlowController tests robustness of the uima ee error handling. !!!! It is NOT meant to be * used for processing!!!! It throws a ResourceInitializationException in the initialize() method */ public class AdvancedFixedFlowControllerWithInitiFailure extends CasFlowController_ImplBase { public static final String PARAM_ACTION_AFTER_CAS_MULTIPLIER = "ActionAfterCasMultiplier"; public static final String PARAM_ALLOW_CONTINUE_ON_FAILURE = "AllowContinueOnFailure"; public static final String PARAM_FLOW = "Flow"; private static final int ACTION_CONTINUE = 0; private static final int ACTION_STOP = 1; private static final int ACTION_DROP = 2; private static final int ACTION_DROP_IF_NEW_CAS_PRODUCED = 3; private ArrayList mSequence; private int mActionAfterCasMultiplier; private Set mAEsAllowingContinueOnFailure = new HashSet(); private boolean flowError; public void initialize(FlowControllerContext aContext) throws ResourceInitializationException { super.initialize(aContext); throw new ResourceInitializationException(); } /* * (non-Javadoc) * * @see org.apache.uima.flow.CasFlowController_ImplBase#computeFlow(org.apache.uima.cas.CAS) */ public Flow computeFlow(CAS aCAS) throws AnalysisEngineProcessException { return new FixedFlowObject(0); } /* * (non-Javadoc) * * @see org.apache.uima.flow.FlowController_ImplBase#addAnalysisEngines(java.util.Collection) */ public void addAnalysisEngines(Collection aKeys) { // Append new keys as a ParallelStep at end of Sequence mSequence.add(new ParallelStep(new ArrayList(aKeys))); } /* * (non-Javadoc) * * @see org.apache.uima.flow.FlowController_ImplBase#removeAnalysisEngines(java.util.Collection) */ public void removeAnalysisEngines(Collection aKeys) throws AnalysisEngineProcessException { // Remove keys from Sequence int i = 0; while (i < mSequence.size()) { Step step = (Step) mSequence.get(i); if (step instanceof SimpleStep && aKeys.contains(((SimpleStep) step).getAnalysisEngineKey())) { mSequence.remove(i); } else if (step instanceof ParallelStep) { Collection keys = new ArrayList(((ParallelStep) step).getAnalysisEngineKeys()); keys.removeAll(aKeys); if (keys.isEmpty()) { mSequence.remove(i); } else { mSequence.set(i++, new ParallelStep(keys)); } } else i++; } } class FixedFlowObject extends CasFlow_ImplBase { private int currentStep; private boolean wasPassedToCasMultiplier = false; private boolean casMultiplierProducedNewCas = false; private boolean internallyCreatedCas = false; /** * Create a new fixed flow starting at step startStep of the fixed sequence. * * @param startStep * index of mSequence to start at */ public FixedFlowObject(int startStep) { this(startStep, false); } /** * Create a new fixed flow starting at step startStep of the fixed sequence. * * @param startStep * index of mSequence to start at * @param internallyCreatedCas * true to indicate that this Flow object is for a CAS that was produced by a * CasMultiplier within this aggregate. Such CASes area allowed to be dropped and not * output from the aggregate. * */ public FixedFlowObject(int startStep, boolean internallyCreatedCas) { currentStep = startStep; this.internallyCreatedCas = internallyCreatedCas; } /* * (non-Javadoc) * * @see org.apache.uima.flow.Flow#next() */ public Step next() throws AnalysisEngineProcessException { // Terminate flow if continueOnFailure was unhappy if (flowError) { throw new RuntimeException("Flow error found in continueOnFailure"); } // if CAS was passed to a CAS multiplier on the last step, special processing // is needed according to the value of the ActionAfterCasMultiplier config parameter if (wasPassedToCasMultiplier) { switch (mActionAfterCasMultiplier) { case ACTION_STOP: return new FinalStep(); case ACTION_DROP: return new FinalStep(internallyCreatedCas); case ACTION_DROP_IF_NEW_CAS_PRODUCED: if (casMultiplierProducedNewCas) { return new FinalStep(internallyCreatedCas); } // else, continue with flow break; // if action is ACTION_CONTINUE, just continue with flow } wasPassedToCasMultiplier = false; casMultiplierProducedNewCas = false; } if (currentStep >= mSequence.size()) { return new FinalStep(); // this CAS has finished the sequence } // if next step is a CasMultiplier, set wasPassedToCasMultiplier to true for next time Step nextStep = (Step) mSequence.get(currentStep++); if (stepContainsCasMultiplier(nextStep)) wasPassedToCasMultiplier = true; // now send the CAS to the next AE(s) in sequence. return nextStep; } /** * @param nextStep * @return */ private boolean stepContainsCasMultiplier(Step nextStep) { if (nextStep instanceof SimpleStep) { AnalysisEngineMetaData md = (AnalysisEngineMetaData) getContext() .getAnalysisEngineMetaDataMap().get(((SimpleStep) nextStep).getAnalysisEngineKey()); return md != null && md.getOperationalProperties() != null && md.getOperationalProperties().getOutputsNewCASes(); } else if (nextStep instanceof ParallelStep) { Iterator iter = ((ParallelStep) nextStep).getAnalysisEngineKeys().iterator(); while (iter.hasNext()) { String key = (String) iter.next(); AnalysisEngineMetaData md = (AnalysisEngineMetaData) getContext() .getAnalysisEngineMetaDataMap().get(key); if (md != null && md.getOperationalProperties() != null && md.getOperationalProperties().getOutputsNewCASes()) return true; } return false; } else return false; } /* * (non-Javadoc) * * @see org.apache.uima.flow.CasFlow_ImplBase#newCasProduced(CAS, String) */ public Flow newCasProduced(CAS newCas, String producedBy) throws AnalysisEngineProcessException { // record that the input CAS has been segmented (affects its subsequent flow) casMultiplierProducedNewCas = true; // start the new output CAS from the next node after the CasMultiplier that produced it int i = 0; while (!stepContains((Step) mSequence.get(i), producedBy)) i++; return new FixedFlowObject(i + 1, true); } /** * @param object * @param producedBy * @return */ private boolean stepContains(Step step, String producedBy) { if (step instanceof SimpleStep) { return ((SimpleStep) step).getAnalysisEngineKey().equals(producedBy); } else if (step instanceof ParallelStep) { Iterator iter = ((ParallelStep) step).getAnalysisEngineKeys().iterator(); while (iter.hasNext()) { String key = (String) iter.next(); if (key.equals(producedBy)) return true; } return false; } else return false; } /* * (non-Javadoc) * * @see org.apache.uima.flow.CasFlow_ImplBase#continueOnFailure(java.lang.String, * java.lang.Exception) */ public boolean continueOnFailure(String failedAeKey, Exception failure) { // Check that root cause is an IndexOutOfBounds exception Throwable cause = failure.getCause(); while (cause.getCause() != null) { cause = cause.getCause(); } if (cause.getClass() != IndexOutOfBoundsException.class) { System.out .println("FlowController.continueOnFailure - Invalid cause for delegate failure - expected " + IndexOutOfBoundsException.class + " - received " + cause.getClass()); // Throwing an exception here doesn't stop flow! flowError = true; } return mAEsAllowingContinueOnFailure.contains(failedAeKey); } } } BuggyAdvancedFixedFlowController.java000066400000000000000000000267541160020716200355130ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/flow/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ee.test.flow; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData; import org.apache.uima.cas.CAS; import org.apache.uima.flow.CasFlowController_ImplBase; import org.apache.uima.flow.CasFlow_ImplBase; import org.apache.uima.flow.FinalStep; import org.apache.uima.flow.Flow; import org.apache.uima.flow.FlowControllerContext; import org.apache.uima.flow.ParallelStep; import org.apache.uima.flow.SimpleStep; import org.apache.uima.flow.Step; import org.apache.uima.resource.ResourceInitializationException; /** * Simple FlowController that invokes components in a fixed sequence. */ public class BuggyAdvancedFixedFlowController extends CasFlowController_ImplBase { public static final String PARAM_ACTION_AFTER_CAS_MULTIPLIER = "ActionAfterCasMultiplier"; public static final String PARAM_ALLOW_CONTINUE_ON_FAILURE = "AllowContinueOnFailure"; public static final String PARAM_FLOW = "Flow"; private static final int ACTION_CONTINUE = 0; private static final int ACTION_STOP = 1; private static final int ACTION_DROP = 2; private static final int ACTION_DROP_IF_NEW_CAS_PRODUCED = 3; private ArrayList mSequence; private int mActionAfterCasMultiplier; private Set mAEsAllowingContinueOnFailure = new HashSet(); public void initialize(FlowControllerContext aContext) throws ResourceInitializationException { super.initialize(aContext); String[] flow = (String[]) aContext.getConfigParameterValue(PARAM_FLOW); mSequence = new ArrayList(); for (int i = 0; i < flow.length; i++) { String[] aes = flow[i].split(","); if (aes.length == 1) { mSequence.add(new SimpleStep(aes[0])); } else { Collection keys = new ArrayList(); keys.addAll(Arrays.asList(aes)); mSequence.add(new ParallelStep(keys)); } } String actionAfterCasMultiplier = (String) aContext .getConfigParameterValue(PARAM_ACTION_AFTER_CAS_MULTIPLIER); if ("continue".equalsIgnoreCase(actionAfterCasMultiplier)) { mActionAfterCasMultiplier = ACTION_CONTINUE; } else if ("stop".equalsIgnoreCase(actionAfterCasMultiplier)) { mActionAfterCasMultiplier = ACTION_STOP; } else if ("drop".equalsIgnoreCase(actionAfterCasMultiplier)) { mActionAfterCasMultiplier = ACTION_DROP; } else if ("dropIfNewCasProduced".equalsIgnoreCase(actionAfterCasMultiplier)) { mActionAfterCasMultiplier = ACTION_DROP_IF_NEW_CAS_PRODUCED; } else if (actionAfterCasMultiplier == null) { mActionAfterCasMultiplier = ACTION_DROP_IF_NEW_CAS_PRODUCED; // default } else { throw new ResourceInitializationException(); // TODO } String[] aeKeysAllowingContinue = (String[]) aContext .getConfigParameterValue(PARAM_ALLOW_CONTINUE_ON_FAILURE); if (aeKeysAllowingContinue != null) { mAEsAllowingContinueOnFailure.addAll(Arrays.asList(aeKeysAllowingContinue)); } } /* * (non-Javadoc) * * @see org.apache.uima.flow.CasFlowController_ImplBase#computeFlow(org.apache.uima.cas.CAS) */ public Flow computeFlow(CAS aCAS) throws AnalysisEngineProcessException { return new FixedFlowObject(0); } /* * (non-Javadoc) * * @see org.apache.uima.flow.FlowController_ImplBase#addAnalysisEngines(java.util.Collection) */ public void addAnalysisEngines(Collection aKeys) { // Append new keys as a ParallelStep at end of Sequence mSequence.add(new ParallelStep(new ArrayList(aKeys))); } /* * (non-Javadoc) * * @see org.apache.uima.flow.FlowController_ImplBase#removeAnalysisEngines(java.util.Collection) */ public void removeAnalysisEngines(Collection aKeys) throws AnalysisEngineProcessException { if (1 == 1) // always trigger this { throw new AnalysisEngineProcessException(); } // Remove keys from Sequence int i = 0; while (i < mSequence.size()) { Step step = (Step) mSequence.get(i); if (step instanceof SimpleStep && aKeys.contains(((SimpleStep) step).getAnalysisEngineKey())) { mSequence.remove(i); } else if (step instanceof ParallelStep) { Collection keys = new ArrayList(((ParallelStep) step).getAnalysisEngineKeys()); keys.removeAll(aKeys); if (keys.isEmpty()) { mSequence.remove(i); } else { mSequence.set(i++, new ParallelStep(keys)); } } else i++; } } class FixedFlowObject extends CasFlow_ImplBase { private int currentStep; private boolean wasPassedToCasMultiplier = false; private boolean casMultiplierProducedNewCas = false; private boolean internallyCreatedCas = false; /** * Create a new fixed flow starting at step startStep of the fixed sequence. * * @param startStep * index of mSequence to start at */ public FixedFlowObject(int startStep) { this(startStep, false); } /** * Create a new fixed flow starting at step startStep of the fixed sequence. * * @param startStep * index of mSequence to start at * @param internallyCreatedCas * true to indicate that this Flow object is for a CAS that was produced by a * CasMultiplier within this aggregate. Such CASes area allowed to be dropped and not * output from the aggregate. * */ public FixedFlowObject(int startStep, boolean internallyCreatedCas) { currentStep = startStep; this.internallyCreatedCas = internallyCreatedCas; } /* * (non-Javadoc) * * @see org.apache.uima.flow.Flow#next() */ public Step next() throws AnalysisEngineProcessException { // if CAS was passed to a CAS multiplier on the last step, special processing // is needed according to the value of the ActionAfterCasMultiplier config parameter if (wasPassedToCasMultiplier) { switch (mActionAfterCasMultiplier) { case ACTION_STOP: return new FinalStep(); case ACTION_DROP: return new FinalStep(internallyCreatedCas); case ACTION_DROP_IF_NEW_CAS_PRODUCED: if (casMultiplierProducedNewCas) { return new FinalStep(internallyCreatedCas); } // else, continue with flow break; // if action is ACTION_CONTINUE, just continue with flow } wasPassedToCasMultiplier = false; casMultiplierProducedNewCas = false; } if (currentStep >= mSequence.size()) { return new FinalStep(); // this CAS has finished the sequence } // if next step is a CasMultiplier, set wasPassedToCasMultiplier to true for next time Step nextStep = (Step) mSequence.get(currentStep++); if (stepContainsCasMultiplier(nextStep)) { wasPassedToCasMultiplier = true; } // now send the CAS to the next AE(s) in sequence. return nextStep; } /** * @param nextStep * @return */ private boolean stepContainsCasMultiplier(Step nextStep) { if (nextStep instanceof SimpleStep) { AnalysisEngineMetaData md = (AnalysisEngineMetaData) getContext() .getAnalysisEngineMetaDataMap().get(((SimpleStep) nextStep).getAnalysisEngineKey()); return md != null && md.getOperationalProperties() != null && md.getOperationalProperties().getOutputsNewCASes(); } else if (nextStep instanceof ParallelStep) { Iterator iter = ((ParallelStep) nextStep).getAnalysisEngineKeys().iterator(); while (iter.hasNext()) { String key = (String) iter.next(); AnalysisEngineMetaData md = (AnalysisEngineMetaData) getContext() .getAnalysisEngineMetaDataMap().get(key); if (md != null && md.getOperationalProperties() != null && md.getOperationalProperties().getOutputsNewCASes()) return true; } return false; } else return false; } /* * (non-Javadoc) * * @see org.apache.uima.flow.CasFlow_ImplBase#newCasProduced(CAS, String) */ public Flow newCasProduced(CAS newCas, String producedBy) throws AnalysisEngineProcessException { // record that the input CAS has been segmented (affects its subsequent flow) casMultiplierProducedNewCas = true; // start the new output CAS from the next node after the CasMultiplier that produced it int i = 0; while (!stepContains((Step) mSequence.get(i), producedBy)) i++; return new FixedFlowObject(i + 1, true); } /** * @param object * @param producedBy * @return */ private boolean stepContains(Step step, String producedBy) { if (step instanceof SimpleStep) { return ((SimpleStep) step).getAnalysisEngineKey().equals(producedBy); } else if (step instanceof ParallelStep) { Iterator iter = ((ParallelStep) step).getAnalysisEngineKeys().iterator(); while (iter.hasNext()) { String key = (String) iter.next(); if (key.equals(producedBy)) return true; } return false; } else return false; } /* * (non-Javadoc) * * @see org.apache.uima.flow.CasFlow_ImplBase#continueOnFailure(java.lang.String, * java.lang.Exception) */ public boolean continueOnFailure(String failedAeKey, Exception failure) { return mAEsAllowingContinueOnFailure.contains(failedAeKey); } } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/utils/000077500000000000000000000000001160020716200265235ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/utils/ActiveMQSupport.java000066400000000000000000000251031160020716200324350ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ee.test.utils; import java.io.IOException; import java.lang.reflect.Method; import java.net.BindException; import java.net.URI; import java.util.concurrent.Semaphore; import javax.jms.Connection; import javax.jms.ConnectionFactory; import junit.framework.TestCase; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.BrokerFactory; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.broker.TransportConnector; import org.apache.activemq.broker.region.policy.PolicyEntry; import org.apache.activemq.broker.region.policy.PolicyMap; import org.apache.activemq.broker.region.policy.SharedDeadLetterStrategy; import org.apache.activemq.command.ActiveMQDestination; import org.apache.activemq.store.memory.MemoryPersistenceAdapter; import org.apache.uima.UIMAFramework; import org.apache.uima.adapter.jms.JmsConstants; import org.apache.uima.jms.error.handler.BrokerConnectionException; import org.apache.uima.util.Level; public class ActiveMQSupport extends TestCase { private static final Class CLASS_NAME = ActiveMQSupport.class; protected static final String DEFAULT_BROKER_URL_KEY="DefaultBrokerURL"; protected static final String DEFAULT_BROKER_URL_KEY_2="DefaultBrokerURL2"; protected static final String DEFAULT_HTTP_BROKER_URL_KEY="DefaultHttpBrokerURL"; protected static final String DEFAULT_HTTP_BROKER_URL_KEY_2="DefaultHttpBrokerURL2"; protected static final int DEFAULT_BROKER_PORT=61617; protected static final int DEFAULT_BROKER_PORT_2=61620; protected static final int DEFAULT_HTTP_PORT = 18888; protected static final int DEFAULT_HTTP_PORT2 = 18890; protected static BrokerService broker; protected String uri = null; protected static ThreadGroup brokerThreadGroup = null; protected static TransportConnector tcpConnector = null; protected static final String relativePath = "src" + System.getProperty("file.separator") + "test" + System.getProperty("file.separator") + "resources" + System.getProperty("file.separator") + "deployment"; protected static final String relativeDataPath = "src" + System.getProperty("file.separator") + "test" + System.getProperty("file.separator") + "resources" + System.getProperty("file.separator") + "data"; protected static TransportConnector httpConnector = null; public static Semaphore brokerSemaphore = new Semaphore(1); protected synchronized void setUp() throws Exception { super.setUp(); broker = createBroker(); broker.start(); broker.setMasterConnectorURI(uri); addHttpConnector(DEFAULT_HTTP_PORT); if ( System.getProperty(DEFAULT_BROKER_URL_KEY) != null) { System.clearProperty(DEFAULT_BROKER_URL_KEY); } System.setProperty(DEFAULT_BROKER_URL_KEY, broker.getMasterConnectorURI()); if ( System.getProperty(DEFAULT_HTTP_BROKER_URL_KEY) != null) { System.clearProperty(DEFAULT_HTTP_BROKER_URL_KEY); } System.setProperty(DEFAULT_HTTP_BROKER_URL_KEY, httpConnector.getConnectUri().toString()); } protected void cleanBroker( BrokerService targetBroker) throws Exception { // Remove messages from all queues targetBroker.deleteAllMessages(); org.apache.activemq.broker.Connection[] connections = targetBroker.getRegionBroker().getClients(); for( org.apache.activemq.broker.Connection connection : connections) { try { connection.stop(); } catch( Exception e) { e.printStackTrace(); } } ActiveMQDestination[] destinations = targetBroker.getRegionBroker().getDestinations(); if ( destinations != null ) { for( ActiveMQDestination destination: destinations ) { if ( !destination.isTopic() ) { targetBroker.removeDestination(destination); } } } } protected String addHttpConnector(int aDefaultPort) throws Exception { return addHttpConnector(broker, aDefaultPort); } protected String addHttpConnector(BrokerService aBroker, int aDefaultPort) throws Exception { boolean found = false; while( !found ) { try { httpConnector = addConnector(aBroker, "http",aDefaultPort); // Use reflection to determine if the AMQ version is at least 5.2. If it is, we must // plug in a broker to the httpConnector otherwise we get NPE when starting the connector. // AMQ version 4.1.1 doesn't exhibit this problem. try { Method m = httpConnector.getClass().getDeclaredMethod("setBrokerService", new Class[] {BrokerService.class}); m.invoke(httpConnector, aBroker); } catch ( NoSuchMethodException e) { // Ignore, this is not AMQ 5.2 } System.out.println("Adding HTTP Connector:" + httpConnector.getConnectUri()); httpConnector.start(); return httpConnector.getUri().toString(); } catch ( BindException e) { aDefaultPort++; } catch ( IOException e) { if ( e.getCause() != null && e.getCause() instanceof BindException ) { aDefaultPort++; } else { throw new BrokerConnectionException("Unexpected Exception While Connecting to Broker with URL:"+uri+"\n"+e); } } } throw new BrokerConnectionException("Unable to acquire Open Port for HTTPConnector"); } protected String getHttpURI() throws Exception { while ( httpConnector == null ) { synchronized(this) { this.wait(100); } } return httpConnector.getConnectUri().toString(); } protected void removeQueue(String aQueueName) throws Exception { httpConnector.stop(); } protected void removeHttpConnector() throws Exception { httpConnector.stop(); broker.removeConnector(httpConnector); } protected TransportConnector addConnector(BrokerService aBroker, String type, int basePort) throws BrokerConnectionException{ boolean found = false; TransportConnector transportConnector = null; while( !found ) { try { String uri = type+"://localhost:" + basePort; transportConnector = aBroker.addConnector(uri); found = true; } catch ( BindException e) { basePort++; } catch ( IOException e) { if ( e.getCause() != null && e.getCause() instanceof BindException ) { basePort++; } else { throw new BrokerConnectionException("Unexpected Exception While Connecting to Broker with URL:"+uri+"\n"+e); } } catch( Exception e) { throw new BrokerConnectionException("Unexpected Exception While Connecting to Broker with URL:"+uri+"\n"+e); } } return transportConnector; } protected String getBrokerUri() { return uri; } protected ConnectionFactory createConnectionFactory() throws Exception { return new ActiveMQConnectionFactory(uri); } protected Connection getConnection() throws Exception { return createConnectionFactory().createConnection(); } public BrokerService createBroker() throws Exception { return createBroker(DEFAULT_BROKER_PORT, true, false); } protected BrokerService createBroker(int port, boolean useJmx, boolean secondaryBroker) throws Exception { String hostName = "localhost"; BrokerService broker = BrokerFactory.createBroker(new URI("broker:()/" + hostName + "?persistent=false")); tcpConnector = addConnector(broker, "tcp",port); uri = tcpConnector.getUri().toString(); System.out.println(">>>> Starting Broker With URL:" + uri); if ( secondaryBroker ) { broker.getManagementContext().setJmxDomainName(broker.getManagementContext().getJmxDomainName()+".test"); tcpConnector.setName(DEFAULT_BROKER_URL_KEY_2); } else { tcpConnector.setName(DEFAULT_BROKER_URL_KEY); } broker.setUseJmx(useJmx); PolicyEntry policy = new PolicyEntry(); policy.setDeadLetterStrategy(new SharedDeadLetterStrategy()); PolicyMap pMap = new PolicyMap(); pMap.setDefaultEntry(policy); broker.setDestinationPolicy(pMap); broker.setPersistenceAdapter(new MemoryPersistenceAdapter()); broker.setPersistent(false); broker.setUseShutdownHook(true); broker.setUseLoggingForShutdownErrors(false); try { Method method = broker.getClass().getDeclaredMethod("setSchedulerSupport", new Class[] {Boolean.TYPE}); method.invoke(broker, new Object[] {Boolean.FALSE}); } catch( NoSuchMethodException e) { // ignore } return broker; } protected BrokerService setupSecondaryBroker(boolean addProperty) throws Exception { System.setProperty("activemq.broker.jmx.domain","org.apache.activemq.test"); BrokerService broker2 = createBroker(DEFAULT_BROKER_PORT_2, true, true); broker2.start(); if ( addProperty ) { System.setProperty("BrokerURL", broker2.getConnectorByName(DEFAULT_BROKER_URL_KEY_2).getUri().toString()); } return broker2; } protected void stopBroker() throws Exception { if (broker != null) { System.out.println(">>> Stopping Broker"); if (tcpConnector != null) { tcpConnector.stop(); broker.removeConnector(tcpConnector); System.out.println("Broker Connector:" + tcpConnector.getUri().toString() + " is stopped"); } removeHttpConnector(); broker.deleteAllMessages(); broker.stop(); broker.waitUntilStopped(); System.out.println(">>> Broker Stopped"); } } protected synchronized void tearDown() throws Exception { super.tearDown(); System.clearProperty("activemq.broker.jmx.domain"); System.clearProperty("BrokerURL"); stopBroker(); } } uima-as-2.3.1/uimaj-as-activemq/src/test/java/org/apache/uima/ee/test/utils/BaseTestSupport.java000066400000000000000000001147671160020716200325150ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.ee.test.utils; import java.net.URL; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicBoolean; import javax.jms.Message; import org.apache.uima.UIMAFramework; import org.apache.uima.aae.client.UimaASProcessStatus; import org.apache.uima.aae.client.UimaASProcessStatusImpl; import org.apache.uima.aae.client.UimaAsBaseCallbackListener; import org.apache.uima.aae.client.UimaAsynchronousEngine; import org.apache.uima.aae.error.ServiceShutdownException; import org.apache.uima.aae.error.UimaASPingTimeout; import org.apache.uima.aae.error.UimaASProcessCasTimeout; import org.apache.uima.aae.message.AsynchAEMessage; import org.apache.uima.adapter.jms.client.BaseUIMAAsynchronousEngine_impl; import org.apache.uima.cas.CAS; import org.apache.uima.collection.EntityProcessStatus; import org.apache.uima.jms.error.handler.BrokerConnectionException; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.resource.ResourceProcessException; import org.apache.uima.util.Level; import org.apache.uima.util.ProcessTrace; import org.apache.uima.util.ProcessTraceEvent; import org.apache.uima.util.impl.ProcessTrace_impl; public abstract class BaseTestSupport extends ActiveMQSupport // implements UimaASStatusCallbackListener { private static final char FS = System.getProperty("file.separator").charAt(0); protected String text = "IBM today elevated five employees to the title of IBM Fellow\n -- its most prestigious technical honor.\n The company also presented more than $2.8 million in cash awards to employees whose technical innovation have yielded exceptional value to the company and its customers.\nIBM conferred the accolades and awards at its 2003 Corporate Technical Recognition Event (CTRE) in Scottsdale, Ariz. CTRE is a 40-year tradition at IBM, established to recognize exceptional technical employees and reward them for extraordinary achievements and contributions to the company's technology leadership.\n Our technical employees are among the best and brightest innovators in the world.\n They share a passion for excellence that defines their work and permeates the products and services IBM delivers to its customers, said Nick Donofrio, senior vice president, technology and manufacturing for IBM.\n CTRE provides the means for us to honor those who have distinguished themselves as exceptional leaders among their peers.\nAmong the special honorees at the 2003 CTRE are five employees who earned the coveted distinction of IBM Fellow:- David Ferrucci aka Dave, Grady Booch, chief scientist of Rational Software, IBM Software Group.\n Recognized internationally for his innovative work on software architecture, modeling, and software engineering process. \nMr. Booch is one of the original authors of the Unified Modeling Language (UML), the industry-standard language of blueprints for software-intensive systems.- Dr. Donald Chamberlin, researcher, IBM Almaden Research Center. An expert in relational database languages, Dr. Chamberlin is co- inventor of SQL, the language that energized the relational database market. He has also"; protected String doubleByteText = null; protected volatile boolean unexpectedException = false; private static final boolean SEND_CAS_ASYNCHRONOUSLY = true; protected static final int CPC_LATCH = 1; protected static final int EXCEPTION_LATCH = 2; protected static final int PROCESS_LATCH = 3; protected CountDownLatch processCountLatch = null; protected CountDownLatch cpcLatch = null; protected CountDownLatch exceptionCountLatch = null; protected boolean initialized = false; protected Object initializeMonitor = new Object(); protected boolean isStopped = false; protected boolean isStopping = false; protected long responseCounter = 0; protected long expectedProcessTime = 0; boolean serviceShutdownException = false; List exceptionsToIgnore = new ArrayList(); private int timeoutCounter = 0; private Object errorCounterMonitor = new Object(); private BaseUIMAAsynchronousEngine_impl engine; protected UimaAsTestCallbackListener listener = new UimaAsTestCallbackListener(); protected boolean receivedExpectedParentReferenceId = false; protected int maxPingRetryCount = 4; protected volatile boolean countPingRetries = false; protected long failedCasCountDueToBrokerFailure = 0; protected String deployService(BaseUIMAAsynchronousEngine_impl eeUimaEngine, String aDeploymentDescriptorPath) throws Exception { String defaultBrokerURL = System.getProperty("BrokerURL"); if (defaultBrokerURL != null) { System.out.println(">>> runTest: Setting defaultBrokerURL to:" + defaultBrokerURL); System.setProperty("defaultBrokerURL", defaultBrokerURL); } else { System.setProperty("defaultBrokerURL", "tcp://localhost:8118"); } Map appCtx = new HashMap(); appCtx.put(UimaAsynchronousEngine.DD2SpringXsltFilePath, "../uima-as/src/main/scripts/dd2spring.xsl".replace('/', FS)); appCtx.put(UimaAsynchronousEngine.SaxonClasspath, "file:../uima-as/src/main/saxon/saxon8.jar".replace('/', FS)); // appCtx.put(UimaAsynchronousEngine.UimaEeDebug, UimaAsynchronousEngine.UimaEeDebug); String containerId = null; try { containerId = eeUimaEngine.deploy(aDeploymentDescriptorPath, appCtx); } catch (ResourceInitializationException e) { if (!ignoreException(ResourceInitializationException.class)) { System.out .println(">>>>>>>>>>> runTest: Stopping Client API Due To Initialization Exception"); isStopping = true; eeUimaEngine.stop(); throw e; } System.out.println(">>>>>>>>>>> Exception ---:" + e.getClass().getName()); } catch (Exception e) { System.out.println(">>>>>>>>>>> runTest: Exception:" + e.getClass().getName()); throw e; } return containerId; } protected void addExceptionToignore(Class anExceptionToIgnore) { exceptionsToIgnore.add(anExceptionToIgnore); } protected boolean ignoreException(Class anException) { if (anException == null) { return true; } for (int i = 0; i < exceptionsToIgnore.size(); i++) { String name = anException.getName(); if (name.equals(exceptionsToIgnore.get(i).getName())) { System.out.println("!!! runTest ignoring exception: " + name); return true; } } return false; } protected void initialize(BaseUIMAAsynchronousEngine_impl eeUimaEngine, Map appCtx) throws Exception { eeUimaEngine.addStatusCallbackListener(listener); eeUimaEngine.initialize(appCtx); } protected void setDoubleByteText(String aDoubleByteText) { doubleByteText = aDoubleByteText; } protected void setExpectedProcessTime(long expectedTimeToProcess) { expectedProcessTime = expectedTimeToProcess; } protected String getFilepathFromClassloader(String aFilename) throws Exception { URL url = this.getClass().getClassLoader().getResource(aFilename); return (url == null ? null : url.getPath()); } protected Map buildContext(String aTopLevelServiceBrokerURI, String aTopLevelServiceQueueName) throws Exception { return buildContext(aTopLevelServiceBrokerURI, aTopLevelServiceQueueName, 0); } protected Map buildContext(String aTopLevelServiceBrokerURI, String aTopLevelServiceQueueName, int timeout) throws Exception { Map appCtx = new HashMap(); appCtx.put(UimaAsynchronousEngine.ServerUri, aTopLevelServiceBrokerURI); appCtx.put(UimaAsynchronousEngine.Endpoint, aTopLevelServiceQueueName); appCtx.put(UimaAsynchronousEngine.CasPoolSize, Integer.valueOf(4)); appCtx.put(UimaAsynchronousEngine.ReplyWindow, 15); appCtx.put(UimaAsynchronousEngine.Timeout, timeout); return appCtx; } protected boolean isMetaRequest(Message aMessage) throws Exception { int messageType = aMessage.getIntProperty(AsynchAEMessage.MessageType); int command = aMessage.getIntProperty(AsynchAEMessage.Command); return (AsynchAEMessage.Request == messageType && AsynchAEMessage.GetMeta == command); } protected Thread spinMonitorThread(final Semaphore ctrlSemaphore, int howMany, final int aLatchKind) throws Exception { final String name; switch (aLatchKind) { case CPC_LATCH: // Initialize latch to open after CPC reply comes in. cpcLatch = new CountDownLatch(howMany); name = "CpcLatch"; break; case EXCEPTION_LATCH: // Initialize latch to open after expected Exceptions comes in. exceptionCountLatch = new CountDownLatch(howMany); name = "ExceptionLatch"; break; case PROCESS_LATCH: // Initialize latch to open after all CASes returned. System.out.println("runTest: Initializing Process Latch. Number of CASes Expected:" + howMany); processCountLatch = new CountDownLatch(howMany); name = "ProcessLatch"; break; default: // Avoid "may not have been initialized" warning name = null; } // Spin a thread that waits for the latch to open. The latch will open // only when // a CPC reply comes in Thread t = new Thread(name) { public void run() { try { // Signal the parent thread that it is ok to send CASes. // This is needed // so that the CASes are send out when the count down latch // is ready. ctrlSemaphore.release(); // Wait until the count down latch = 0 switch (aLatchKind) { case CPC_LATCH: // Initialize latch to open after CPC reply comes in. cpcLatch.await(); break; case EXCEPTION_LATCH: // Initialize latch to open after Exception reply comes in. exceptionCountLatch.await(); break; case PROCESS_LATCH: // Initialize latch to open after Process reply comes in. processCountLatch.await(); break; } } catch (InterruptedException e) { } } }; t.start(); return t; } protected void waitUntilInitialized() throws Exception { synchronized (initializeMonitor) { while (!initialized) { initializeMonitor.wait(); } } } protected void waitOnMonitor(final Semaphore ctrlSemaphore ) throws Exception { // Wait until the count down latch thread is ready try { ctrlSemaphore.acquire(); } catch( InterruptedException e) { } } protected void runTestWithMultipleThreads(String serviceDeplyDescriptor, String queueName, int howManyCASesPerRunningThread, int howManyRunningThreads, int timeout, int aGetMetaTimeout) throws Exception { runTestWithMultipleThreads(serviceDeplyDescriptor, queueName, howManyCASesPerRunningThread, howManyRunningThreads, timeout, aGetMetaTimeout, false); } protected void runTestWithMultipleThreads(String serviceDeplyDescriptor, String queueName, int howManyCASesPerRunningThread, int howManyRunningThreads, int timeout, int aGetMetaTimeout, boolean failOnTimeout ) throws Exception { // Instantiate Uima EE Client isStopped = false; isStopping = false; final BaseUIMAAsynchronousEngine_impl eeUimaEngine = new BaseUIMAAsynchronousEngine_impl(); // Deploy Uima EE Primitive Service final String containerId = deployService(eeUimaEngine, serviceDeplyDescriptor); engine = eeUimaEngine; Thread t1 = null; Thread t2 = null; Map appCtx = buildContext(String.valueOf(broker.getMasterConnectorURI()), queueName, timeout); // Set an explicit getMeta (Ping)timeout appCtx.put(UimaAsynchronousEngine.GetMetaTimeout, aGetMetaTimeout); initialize(eeUimaEngine, appCtx); // Wait until the top level service returns its metadata waitUntilInitialized(); final Semaphore ctrlSemaphore = new Semaphore(1); t2 = spinMonitorThread(ctrlSemaphore, howManyCASesPerRunningThread * howManyRunningThreads, PROCESS_LATCH); // Wait until the CPC Thread is ready. waitOnMonitor(ctrlSemaphore); if (failOnTimeout) { // Spin a thread and wait for awhile before killing the remote service. // This will cause the client to timeout waiting for a CAS reply and // to send a Ping message to test service availability. The Ping times // out and causes the client API to stop. new Thread("WaitThenUndeploy") { public void run() { Object mux = new Object(); synchronized (mux) { try { mux.wait(5000); // Undeploy service container eeUimaEngine.undeploy(containerId); } catch (Exception e) { } } } }.start(); } // Spin runner threads and start sending CASes for (int i = 0; i < howManyRunningThreads; i++) { SynchRunner runner = new SynchRunner(eeUimaEngine, howManyCASesPerRunningThread, listener); Thread runnerThread = new Thread(runner, "Runner" + i); runnerThread.start(); System.out.println("runTest: Started Runner Thread::Id=" + runnerThread.getId()); } // Wait until ALL CASes return from the service t2.join(); t1 = spinMonitorThread(ctrlSemaphore, 1, CPC_LATCH); if (!isStopped && !unexpectedException) { System.out.println("runTest: Sending CPC"); // Send CPC eeUimaEngine.collectionProcessingComplete(); } // If have skipped CPC trip the latch if (unexpectedException && cpcLatch != null) { cpcLatch.countDown(); } t1.join(); isStopping = true; eeUimaEngine.stop(); } protected void runCrTest(BaseUIMAAsynchronousEngine_impl aUimaEeEngine, int howMany) throws Exception { engine = aUimaEeEngine; final Semaphore ctrlSemaphore = new Semaphore(1); spinMonitorThread(ctrlSemaphore, howMany, PROCESS_LATCH); aUimaEeEngine.process(); waitOnMonitor(ctrlSemaphore); } protected void runTest(Map appCtx, BaseUIMAAsynchronousEngine_impl aUimaEeEngine, String aBrokerURI, String aTopLevelServiceQueueName, int howMany, int aLatchKind) throws Exception { runTest(appCtx, aUimaEeEngine, aBrokerURI, aTopLevelServiceQueueName, howMany, aLatchKind, SEND_CAS_ASYNCHRONOUSLY); } protected void runTest2(Map appCtx, BaseUIMAAsynchronousEngine_impl aUimaEeEngine, String aBrokerURI, String aTopLevelServiceQueueName, int howMany, int aLatchKind) throws Exception { runTest2(appCtx, aUimaEeEngine, aBrokerURI, aTopLevelServiceQueueName, howMany, aLatchKind, SEND_CAS_ASYNCHRONOUSLY); } /** * Initializes a given instance of the Uima EE client and executes a test. It uses synchronization * to enforce correct sequence of calls and setups expected result. * * @param appCtx * @param aUimaEeEngine * @param aBrokerURI * @param aTopLevelServiceQueueName * @param howMany * @param aLatchKind * @param sendCasAsynchronously * @throws Exception */ protected void runTest(Map appCtx, BaseUIMAAsynchronousEngine_impl aUimaEeEngine, String aBrokerURI, String aTopLevelServiceQueueName, int howMany, int aLatchKind, boolean sendCasAsynchronously) throws Exception { Thread t1 = null; Thread t2 = null; serviceShutdownException = false; unexpectedException = false; engine = aUimaEeEngine; isStopped = false; isStopping = false; if (appCtx == null) { appCtx = buildContext(aBrokerURI, aTopLevelServiceQueueName, 0); } try { initialize(aUimaEeEngine, appCtx); } catch (ResourceInitializationException e) { if (ignoreException(ResourceInitializationException.class)) { return; } else { throw e; } } catch (Exception e) { throw e; } // Wait until the top level service returns its metadata waitUntilInitialized(); if (howMany > 0) { Semaphore ctrlSemaphore = null; // Create a thread that will block until an exception is returned, // or 2 threads that wait for 'howMany' CASes and then a CPC reply if (aLatchKind == EXCEPTION_LATCH) { ctrlSemaphore = new Semaphore(1); t1 = spinMonitorThread(ctrlSemaphore, 1, EXCEPTION_LATCH); } else { ctrlSemaphore = new Semaphore(2); t1 = spinMonitorThread(ctrlSemaphore, 1, CPC_LATCH); t2 = spinMonitorThread(ctrlSemaphore, howMany, PROCESS_LATCH); } if (!isStopped) { // Wait until the monitor thread(s) start. waitOnMonitor(ctrlSemaphore); long startTime = System.currentTimeMillis(); if (!isStopped) { // Send an in CAS to the top level service try { sendCAS(aUimaEeEngine, howMany, sendCasAsynchronously); } catch( Exception e) {} } // Wait until ALL CASes return from the service if (t2 != null) { t2.join(); long endTime = System.currentTimeMillis(); System.out.println(">>>> Total Time in Service:" + (endTime - startTime)); if (!serviceShutdownException && !isStopped && !unexpectedException) { System.out.println("runTest: Sending CPC"); aUimaEeEngine.collectionProcessingComplete(); } else { System.out .println(">>>>>>>>>>>>>>>> runTest: Not Sending CPC Due To Exception [serviceShutdownException=" + serviceShutdownException + "] [isStopped=" + isStopped + "] [unexpectedException=" + unexpectedException + "]"); } } // If have skipped CPC trip the latch if ((serviceShutdownException || unexpectedException) && cpcLatch != null) { cpcLatch.countDown(); } t1.join(); } } isStopping = true; aUimaEeEngine.stop(); // Finally fail test if unhappy ... must be last call as acts like "throw" if (unexpectedException) { fail("Unexpected exception returned"); } } /** * Initializes a given instance of the Uima EE client and executes a test. It uses synchronization * to enforce correct sequence of calls and setups expected result. * * @param appCtx * @param aUimaEeEngine * @param aBrokerURI * @param aTopLevelServiceQueueName * @param howMany * @param aLatchKind * @param sendCasAsynchronously * @throws Exception */ protected void runTest2(Map appCtx, BaseUIMAAsynchronousEngine_impl aUimaEeEngine, String aBrokerURI, String aTopLevelServiceQueueName, int howMany, int aLatchKind, boolean sendCasAsynchronously) throws Exception { Thread t1 = null; Thread t2 = null; engine = aUimaEeEngine; isStopped = false; isStopping = false; if (appCtx == null) { appCtx = buildContext(aBrokerURI, aTopLevelServiceQueueName, 0); } initialize(aUimaEeEngine, appCtx); // Wait until the top level service returns its metadata waitUntilInitialized(); for (int i = 0; i < howMany; i++) { Semaphore ctrlSemaphore = null; // Create a thread that will block until the CPC reply come back // from the top level service if (aLatchKind == EXCEPTION_LATCH) { ctrlSemaphore = new Semaphore(1); t1 = spinMonitorThread(ctrlSemaphore, 1, EXCEPTION_LATCH); } else { ctrlSemaphore = new Semaphore(2); t1 = spinMonitorThread(ctrlSemaphore, 1, CPC_LATCH); t2 = spinMonitorThread(ctrlSemaphore, 1, PROCESS_LATCH); } if (!isStopped) { // Wait until the CPC Thread is ready. waitOnMonitor(ctrlSemaphore); if (!isStopped) { // Send an in CAS to the top level service sendCAS(aUimaEeEngine, 1, sendCasAsynchronously); } // Wait until ALL CASes return from the service if (t2 != null) { t2.join(); if (!serviceShutdownException && !isStopped && !unexpectedException) { System.out.println("runTest: Sending CPC"); // Send CPC aUimaEeEngine.collectionProcessingComplete(); } } // If have skipped CPC trip the latch if (serviceShutdownException || (unexpectedException && cpcLatch != null)) { cpcLatch.countDown(); } t1.join(); } } isStopping = true; aUimaEeEngine.stop(); // Finally fail test if unhappy ... must be last call as acts like "throw" if (unexpectedException) { fail("Unexpected exception returned"); } } /** * Sends a given number of CASs to Uima EE service. This method sends each CAS using either * synchronous or asynchronous API. * * @param eeUimaEngine * - fully initialized instance of the Uima EE client * @param howMany * - how many CASes to send to the service * @param sendCasAsynchronously * - use either synchronous or asynchronous API * @throws Exception */ protected void sendCAS(BaseUIMAAsynchronousEngine_impl eeUimaEngine, int howMany, boolean sendCasAsynchronously) throws Exception { engine = eeUimaEngine; for (int i = 0; i < howMany; i++) { CAS cas = eeUimaEngine.getCAS(); if (cas == null) { if (isStopping) { System.out.println(">> runTest: stopping after sending " + i + " of " + howMany + " CASes"); } else { System.out.println(">>>> ERROR! sendCas: " + (i + 1) + "-th CAS is null?"); } return; } if (doubleByteText != null) { cas.setDocumentText(doubleByteText); } else { cas.setDocumentText(text); } if (sendCasAsynchronously) { eeUimaEngine.sendCAS(cas); } else { eeUimaEngine.sendAndReceiveCAS(cas); } } } /** * Increments total number of CASes processed */ protected void incrementCASesProcessed() { responseCounter++; System.out.println("runTest: Client:::::::::::::: Received:" + responseCounter + " Reply"); } public long getNumberOfCASesProcessed() { return responseCounter; } protected class UimaAsTestCallbackListener extends UimaAsBaseCallbackListener { private String casSent = null; private int pingTimeoutCount=0; public synchronized void onBeforeMessageSend(UimaASProcessStatus status) { casSent = status.getCasReferenceId(); System.out.println("runTest: Received onBeforeMessageSend() Notification With CAS:" + status.getCasReferenceId()); } /** * Callback method which is called by Uima EE client when a reply to process CAS is received. * The reply contains either the CAS or an exception that occurred while processing the CAS. */ public synchronized void entityProcessComplete(CAS aCAS, EntityProcessStatus aProcessStatus) { String casReferenceId = null; String parentCasReferenceId = null; boolean expectedException = false; if (isStopping) { System.out .println(">>>>> runTest: Ignoring entityProcessComplete callback as engine is shutting down"); return; } if (aProcessStatus instanceof UimaASProcessStatus) { casReferenceId = ((UimaASProcessStatus) aProcessStatus).getCasReferenceId(); parentCasReferenceId = ((UimaASProcessStatus) aProcessStatus).getParentCasReferenceId(); } if (aProcessStatus.isException()) { List list = aProcessStatus.getExceptions(); if (casReferenceId == null) { System.out.println("runTest: Received Reply Containing " + list.size() + " Exception(s)"); } else if (parentCasReferenceId == null) { if (casSent.equals(casReferenceId)) { receivedExpectedParentReferenceId = true; } System.out.println("runTest: Received Reply from CAS " + casReferenceId + " Containing " + list.size() + " Exception(s)"); } else { System.out.println("runTest: ERROR - Received " + list.size() + " Exception(s) from child CAS " + casReferenceId + " --- should have been on Parent " + parentCasReferenceId); unexpectedException = true; } for (int i = 0; i < list.size(); i++) { Exception e = (Exception) list.get(i); if ( e instanceof BrokerConnectionException ) { System.out.println("Client Reported Broker Connection Failure"); failedCasCountDueToBrokerFailure++; } else if (e instanceof ServiceShutdownException || (e.getCause() != null && e.getCause() instanceof ServiceShutdownException)) { serviceShutdownException = true; isStopping = true; engine.stop(); } else if (ignoreException(e.getClass())) { expectedException = true; } else if (e instanceof ResourceProcessException && isProcessTimeout(e)) { synchronized (errorCounterMonitor) { System.out.println("runTest: Incrementing ProcessTimeout Counter"); timeoutCounter++; } } else if (engine != null && e instanceof UimaASPingTimeout) { System.out.println("runTest: Ping Timeout - service Not Responding To Ping"); if (cpcLatch != null) { cpcLatch.countDown(); } isStopping = true; engine.stop(); } else if ( engine != null && e instanceof UimaASProcessCasTimeout) { if ( e.getCause() != null && e.getCause() instanceof UimaASPingTimeout) { if ( countPingRetries ) { if ( pingTimeoutCount > maxPingRetryCount ) { if (cpcLatch != null) { cpcLatch.countDown(); } isStopping = true; engine.stop(); } else { pingTimeoutCount++; } } } } if (!expectedException) { e.printStackTrace(); } } if (exceptionCountLatch != null) { exceptionCountLatch.countDown(); if (processCountLatch != null) { processCountLatch.countDown(); } } else if (processCountLatch != null) { if (!expectedException) { unexpectedException = true; System.out.println("runTest: ... when expecting normal completion!"); } while (processCountLatch.getCount() > 0) { processCountLatch.countDown(); } } } // Not an exception else if (processCountLatch != null && aCAS != null) { if (parentCasReferenceId != null) { System.out.println("runTest: Received Reply Containing CAS:" + casReferenceId + " The Cas Was Generated From Parent Cas Id:" + parentCasReferenceId); } else { System.out.println("runTest: Received Reply Containing CAS:" + casReferenceId); } if (doubleByteText != null) { String returnedText = aCAS.getDocumentText(); if (!doubleByteText.equals(returnedText)) { System.out.println("!!! DocumentText in CAS reply different from that in CAS sent !!!"); System.out .println("This is expected using http connector with vanilla AMQ 5.0 release,"); System.out.println("and the test file DoubleByteText.txt contains double byte chars."); System.out .println("To fix, use uima-as/src/main/lib/optional/activemq-optional-5.0.0.jar"); unexpectedException = true; processCountLatch.countDown(); return; } } // test worked, reset use of this text doubleByteText = null; if (parentCasReferenceId == null) { processCountLatch.countDown(); } List eList = aProcessStatus.getProcessTrace().getEventsByComponentName("UimaEE", false); for (int i = 0; i < eList.size(); i++) { ProcessTraceEvent eEvent = (ProcessTraceEvent) eList.get(i); System.out.println("runTest: Received Process Event - " + eEvent.getDescription() + " Duration::" + eEvent.getDuration() + " ms"); // / (float) 1000000); // Check if the running test wants to check how long the processing of CAS took if (expectedProcessTime > 0 && "Total Time In Process CAS".equals(eEvent.getDescription())) { // Check if the expected duration exceeded actual duration for processing // a CAS. Allow 50ms difference. if (eEvent.getDuration() > expectedProcessTime && (eEvent.getDuration() % expectedProcessTime) > 50) { System.out.println("!!!!!!!!!!!!! runTest: Expected Process CAS Duration of:" + expectedProcessTime + " ms. Instead Process CAS Took:" + eEvent.getDuration()); unexpectedException = true; } } } incrementCASesProcessed(); } else if (aCAS != null) { if (parentCasReferenceId != null) { System.out.println("runTest: Received Reply Containing CAS:" + casReferenceId + " The Cas Was Generated From Parent Cas Id:" + parentCasReferenceId); } else { System.out.println("runTest: Received Reply Containing CAS:" + casReferenceId); } incrementCASesProcessed(); } } private boolean isProcessTimeout(Exception e) { return (e.getCause() != null && (e.getCause() instanceof UimaASProcessCasTimeout)); } /** * Callback method which is called by Uima EE client when the initialization of the client is * completed successfully. */ public void initializationComplete(EntityProcessStatus aStatus) { boolean isPingException; if (aStatus != null && aStatus.isException()) { System.out.println("runTest: Initialization Received Reply Containing Exception:"); List exceptions = aStatus.getExceptions(); for (int i = 0; i < exceptions.size(); i++) { if (exceptions.get(i) instanceof UimaASPingTimeout) { System.out.println("runTest: Client Received PING Timeout. Service Not Available"); if (cpcLatch != null) { cpcLatch.countDown(); } } ((Throwable) exceptions.get(i)).printStackTrace(); } if (exceptionCountLatch != null) exceptionCountLatch.countDown(); } synchronized (initializeMonitor) { initialized = true; initializeMonitor.notifyAll(); } } /** * Callback method which is called by Uima EE client when a CPC reply is received OR exception * occured while processing CPC request. */ public void collectionProcessComplete(EntityProcessStatus aStatus) { if (isStopping) { System.out .println(">>>>> runTest: Ignoring collectionProcessComplete callback as engine is shutting down"); return; } if (aStatus != null && aStatus.isException()) { List list = aStatus.getExceptions(); boolean expectedException = false; for (int i = 0; i < list.size(); i++) { Exception e = (Exception) list.get(i); if (e instanceof ServiceShutdownException || (e.getCause() != null && e.getCause() instanceof ServiceShutdownException)) { serviceShutdownException = true; } else if (ignoreException(e.getClass())) { expectedException = true; } if (!expectedException) { e.printStackTrace(); } } if (!expectedException) { System.out.println("runTest: Received CPC Reply Containing Exception\n" + " ... when expecting normal CPC reply!"); unexpectedException = true; } if (exceptionCountLatch != null) { exceptionCountLatch.countDown(); } if (cpcLatch != null) { cpcLatch.countDown(); } } else { System.out.println("runTest: Received CPC Reply"); if (cpcLatch != null) { cpcLatch.countDown(); } } } } public class SimpleCallbackListener extends UimaAsTestCallbackListener { /** * Callback method which is called by Uima EE client when a reply to process CAS is received. * The reply contains either the CAS or an exception that occurred while processing the CAS. */ public synchronized void entityProcessComplete(CAS aCAS, EntityProcessStatus aProcessStatus) { String casReferenceId = null; if (isStopping) { System.out .println(">>>>> runTest: Ignoring entityProcessComplete callback as engine is shutting down"); return; } if (aProcessStatus instanceof UimaASProcessStatus) { if ( aProcessStatus.isException() ) { System.out.println("--------- Got Exception While Processing CAS:"+casReferenceId); } else { casReferenceId = ((UimaASProcessStatus) aProcessStatus).getCasReferenceId(); System.out.println("Client Received Reply - CAS:"+casReferenceId); } } processCountLatch.countDown(); } } /** * A Runnable class used to test concurrency support in Uima EE client. Each instance of this * class will start and send specified number of CASes to a service using synchronous * sendAndReceive API. Each thread sends a CAS and waits for a reply. * */ public class SynchRunner implements Runnable { private BaseUIMAAsynchronousEngine_impl uimaClient = null; private long howManyCASes = 1; private UimaAsTestCallbackListener callbackListener; public SynchRunner(BaseUIMAAsynchronousEngine_impl aUimaClient, int howMany) { this(aUimaClient, howMany, null); } public SynchRunner(BaseUIMAAsynchronousEngine_impl aUimaClient, int howMany, UimaAsTestCallbackListener aListener) { uimaClient = aUimaClient; howManyCASes = howMany; callbackListener = aListener; } // Run until All CASes are sent public void run() { UimaASProcessStatusImpl status = null; try { while (howManyCASes-- > 0) { CAS cas = uimaClient.getCAS(); cas.setDocumentText(text); ProcessTrace pt = new ProcessTrace_impl(); try { // Send CAS and wait for a response String casReferenceId = uimaClient.sendAndReceiveCAS(cas, pt); status = new UimaASProcessStatusImpl(pt, casReferenceId); } catch (ResourceProcessException rpe) { //rpe.printStackTrace(); status = new UimaASProcessStatusImpl(pt); status.addEventStatus("Process", "Failed", rpe); } finally { if ( callbackListener != null ) { callbackListener.entityProcessComplete(cas, status); } cas.release(); } } System.out.println(">>>>>>>> runTest: Thread::" + Thread.currentThread().getId() + " Is Exiting - Completed Full Run"); } catch (Exception e) { // e.printStackTrace(); } } } protected void spinShutdownThread(final BaseUIMAAsynchronousEngine_impl uimaEEEngine, long when) throws Exception { spinShutdownThread(uimaEEEngine, when, null, 0); } protected void spinShutdownThread(final BaseUIMAAsynchronousEngine_impl uimaEEEngine, long when, final String[] aSpringContainerIds, final int stop_level) throws Exception { Date timeToRun = new Date(System.currentTimeMillis() + when); final Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { timer.cancel(); timer.purge(); if (aSpringContainerIds == null) { isStopping = true; System.out.println(">>>> runTest: Stopping UIMA EE Engine"); uimaEEEngine.stop(); isStopping = false; isStopped = true; System.out.println(">>>> runTest: UIMA EE Engine Stopped"); if (cpcLatch != null) cpcLatch.countDown(); if (processCountLatch != null) { while (processCountLatch.getCount() > 0) { processCountLatch.countDown(); } } } else { try { System.out.println(">>>> runTest: Quiescing Service And Stopping it"); for( int i = aSpringContainerIds.length; i > 0; i--) { uimaEEEngine.undeploy(aSpringContainerIds[i-1], stop_level); } } catch (Exception e) { e.printStackTrace(); } } } }, timeToRun); } } uima-as-2.3.1/uimaj-as-activemq/src/test/resources/000077500000000000000000000000001160020716200221415ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/data/000077500000000000000000000000001160020716200230525ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/data/DoubleByteText.txt000066400000000000000000002211671160020716200265270ustar00rootroot00000000000000ï»¿æ¬¢è¿Žåˆ°åŒ—äº¬æ¥æˆ‘能如何帮助你Preliminary Matter. This text of Melville's Moby-Dick is based on the Hendricks House edition.It was prepared by Professor Eugene F. Irey at the University of Colorado.Any subsequent copies of this data must include this notice and any publications resulting from analysis of this data mustinclude reference to Professor Irey's work.Etymology (Supplied by a late consumptive usher to a grammar school.)The pale Ushei{rthreadbare} in coat, heart, body, and brain; I see him now.He was ever dusting his old lexicons and grammars, with a queer handkerchief,mockingly embellished with all the gay flags of all the known nations of the world.He loved to dust his old grammars; it somehow mildly reminded him of his mortality.Extracts (supplied by a sub-sub-librarian.)It will be seen that this mere painstaking burrower and grubworm of a poor devil of a Sub-Sub appears to have gone through the long Vaticans and street-stalls of the earth, picking up whatever random allusions to whales he could anyways find in any book whatsoever, sacred or profane.Therefore you must not, in every case at least, take the higgledy-piggledywhale statements, however authentic, in these extracts, for veritable gospelcetology. Far from it. As touching the ancient authors generally, as well as the poets here appearing, these extracts are solely valuable or entertaining,as affording a glancing bird's eye view of what has been promiscuously said,thought, fancied, and sung of Leviathan, by many nations and generations,including our own.So fare thee well, poor devil of a Sub-Sub, whose commentator I am.Thou belongest to that hopeless, sallow tribe which no wine of this world will ever warm; and for whom even Pale Sherry would be too rosy-strong;but with whom one sometimes loves to sit, and feel poor-devilish, too;and grow convivial upon tears; and say to them bluntly, with full eyes and empty glasses, and in not altogether unpleasant sadness i{give} it up, sub-subs!For by how much the more pains ye take to please the world,by so much the more shall ye for ever go thankless!Would that I could clear out Hampton Court and the Tuileries for ye! Butgulp down your tears and hie aloft to the royal-mast with your hearts; foryour friends who have gone before are clearing out the seven-storied heavens,and making refugees of long-pampered Gabriel, Michael, and Raphael, againstyour coming. Here ye strike but splintered hearts together i{there}, ye shallstrike unsplinterable.. < chapter I 2 LOOMINGS > Call me Ishmael. Some years ago--never mind howlong precisely --having little or no money in my purse, and nothing particularto interest me on shore, I thought I would sail about a little and see thewatery part of the world. It is a way I have of driving off the spleen, andregulating the circulation. Whenever I find myself growing grim about themouth; whenever it is a damp, drizzly November in my soul; whenever I findmyself involuntarily pausing before coffin warehouses, and bringing up therear of every funeral I meet; and especially whenever my hypos get such anupper hand of me, that it requires a strong moral principle to prevent mefrom deliberately stepping into the street, and methodically knockingpeople's hats off--then, I account it high time to get to sea as soon as I can. This is my substitute for pistol and ball. With a philosophical flourishCato throws himself upon his sword; I quietly take to the ship. There isnothing surprising in this. If they but knew it, almost all men in theirdegree, some time or other, cherish very nearly the same feelings towards theocean with me. There now is your insular city of the Manhattoes, belted roundby wharves as Indian isles by coral reefs--commerce surrounds it with her surf. Right and left, the streets take you waterward. Its extreme down-town isthe battery, where that noble mole is washed by waves, and cooled bybreezes, which a few hours previous were out of sight of land. Look at thecrowds of water-gazers there. Circumambulate the city of a dreamy Sabbathafternoon. Go from Corlears Hook to Coenties Slip, and from thence, byWhitehall northward. What do you see?--Posted like silent sentinels allaround the town, stand thousands upon thousands of mortal men fixed in oceanreveries. Some leaning against the spiles; some seated upon the pier-heads;some looking over the bulwarks glasses!..

of ships from China; some high aloft in the rigging, as if striving to get astill better seaward peep. But these are all landsmen; of week days pent upin lath and plaster--tied to counters, nailed to benches, clinched to desks.How then is this? Are the green fields gone? What do they here? But look!here come more crowds, pacing straight for the water, and seemingly bound fora dive. Strange! Nothing will content them but the extremest limit of theland; loitering under the shady lee of yonder warehouses will not suffice.No. They must get just as nigh the water as they possibly can without fallingin. And there they stand--miles of them--leagues. Inlanders all, they comefrom lanes and alleys, streets and avenues, --north, east, south, and west.Yet here they all unite. Tell me, does the magnetic virtue of the needles ofthe compasses of all those ships attract them thither? Once more. Say, youare in the country; in some high land of lakes. Take almost any path youplease, and ten to one it carries you down in a dale, and leaves you thereby a pool in the stream. There is magic in it. Let the most absent-mindedof men be plunged in his deepest reveries--stand that man on his legs, set hisfeet a-going, and he will infallibly lead you to water, if water there be inall that region. Should you ever be athirst in the great American desert,try this experiment, if your caravan happen to be supplied with a metaphysicalprofessor. Yes, as every one knows, meditation and water are wedded for ever. But here is an artist. He desires to paint you the dreamiest, shadiest,quietest, most enchanting bit of romantic landscape in all the valley of theSaco. What is the chief element he employs? There stand his trees, each witha hollow trunk, as if a hermit and a crucifix were within; and here sleepshis meadow, and there sleep his cattle; and up from yonder cottage goes asleepy smoke. Deep into distant woodlands winds a mazy way, reaching tooverlapping spurs of mountains bathed in their hill-side blue. But thoughthe picture lies thus tranced, and though this pine-tree shakes down its sighslike leaves upon this shepherd's head, yet all were vain, unless theshepherd's eye were fixed upon the magic stream before him. Go visit thePrairies in June,..

when for scores on scores of miles you wade knee-deep among Tiger-lilies--whatis the one charm wanting? --Water --there is not a drop of water there! WereNiagara but a cataract of sand, would you travel your thousand miles to seeit? Why did the poor poet of Tennessee, upon suddenly receiving two handfulsof silver, deliberate whether to buy him a coat, which he sadly needed, orinvest his money in a pedestrian trip to Rockaway Beach? Why is almost everyrobust healthy boy with a robust healthy soul in him, at some time or othercrazy to go to sea? Why upon your first voyage as a passenger, did youyourself feel such a mystical vibration, when first told that you and yourship were now out of sight of land? Why did the old Persians hold the seaholy? Why did the Greeks give it a separate deity, and own brother of Jove?Surely all this is not without meaning. And still deeper the meaning of thatstory of Narcissus, who because he could not grasp the tormenting, mild imagehe saw in the fountain, plunged into it and was drowned. But that sameimage, we ourselves see in all rivers and oceans. It is the image of theungraspable phantom of life; and this is the key to it all. Now, when I saythat I am in the habit of going to sea whenever I begin to grow hazy about theeyes, and begin to be over conscious of my lungs, I do not mean to have itinferred that I ever go to sea as a passenger. For to go as a passenger youmust needs have a purse, and a purse is but a rag unless you have somethingin it. Besides, passengers get sea-sick --grow quarrelsome --don't sleep ofnights --do not enjoy themselves much, as a general thing; --no, I never go as apassenger; nor, though I am something of a salt, do I ever go to sea as aCommodore, or a Captain, or a Cook. I abandon the glory and distinction ofsuch offices to those who like them. For my part, I abominate all honorablerespectable toils, trials, and tribulations of every kind whatsoever. It isquite as much as I can do to take care of myself, without taking care ofships, barques, brigs, schooners, and what not. And as for going as cook, --though I confess there is considerable glory in that, a cook being a sort ofofficer on ship-board --yet, somehow, I never fancied broiling fowls; --thoughonce broiled, judiciously buttered, and judgmatically salted and peppered,there is no one who will..

speak more respectfully, not to say reverentially, of a broiled fowl than Iwill. It is out of the idolatrous dotings of the old Egyptians upon broiledibis and roasted river horse, that you see the mummies of those creatures intheir huge bake-houses the pyramids. No, when I go to sea, I go as a simplesailor, right before the mast, plumb down into the forecastle, aloft thereto the royal mast-head. True, they rather order me about some, and make mejump from spar to spar, like a grasshopper in a May meadow. And at first,this sort of thing is unpleasant enough. It touches one's sense of honor,particularly if you come of an old established family in the land, the vanRensselaers, or Randolphs, or Hardicanutes. And more than all, if justprevious to putting your hand into the tar-pot, you have been lording it as acountry schoolmaster, making the tallest boys stand in awe of you. Thetransition is a keen one, I assure you, from the schoolmaster to a sailor,and requires a strong decoction of Seneca and the Stoics to enable you to grinand bear it. But even this wears off in time. What of it, if some old hunksof a sea-captain orders me to get a broom and sweep down the decks? What doesthat indignity amount to, weighed, I mean, in the scales of the NewTestament? Do you think the archangel Gabriel thinks anything the less of me,because I promptly and respectfully obey that old hunks in that particularinstance? Who aint a slave? Tell me that. Well, then, however the oldsea-captains may order me about--however they may thump and punch me about, Ihave the satisfaction of knowing that it is all right; that everybody elseis one way or other served in much the same way -- either in a physical ormetaphysical point of view, that is; and so the universal thump is passedround, and all hands should rub each other's shoulder-blades, and becontent. Again, I always go to sea as a sailor, because they make a point ofpaying me for my trouble, whereas they never pay passengers a single pennythat I ever heard of. On the contrary, passengers themselves must pay. Andthere is all the difference in the world between paying and being paid. Theact of paying is perhaps the most uncomfortable infliction that the twoorchard..

thieves entailed upon us. But being paid, --what will compare with it? Theurbane activity with which a man receives money is really marvellous,considering that we so earnestly believe money to be the root of all earthlyills, and that on no account can a monied man enter heaven. Ah! howcheerfully we consign ourselves to perdition! Finally, I always go to sea asa sailor, because of the wholesome exercise and pure air of the forecastledeck. For as in this world, head winds are far more prevalent than windsfrom astern (that is, if you never violate the Pythagorean maxim), so forthe most part the Commodore on the quarter-deck gets his atmosphere at secondhand from the sailors on the forecastle. He thinks he breathes it first; butnot so. In much the same way do the commonalty lead their leaders in manyother things, at the same time that the leaders little suspect it. Butwherefore it was that after having repeatedly smelt the sea as a merchantsailor, I should now take it into my head to go on a whaling voyage; thisthe invisible police officer of the Fates, who has the constant surveillanceof me, and secretly dogs me, and influences me in some unaccountable way --hecan better answer than any one else. And, doubtless, my going on this whalingvoyage, formed part of the grand programme of Providence that was drawn up along time ago. It came in as a sort of brief interlude and solo between moreextensive performances. I take it that this part of the bill must have runsomething like this: Grand Contested Election for the Presidency of theUnited States. Whaling Voyage by one Ishmael. Bloody Battle inAffghanistan. Though I cannot tell why it was exactly that those stagemanagers, the Fates, put me down for this shabby part of a whaling voyage,when others were set down for magnificent parts in high tragedies, and shortand easy parts in genteel comedies, and jolly parts in farces --though Icannot tell why this was exactly; yet, now that I recall all thecircumstances, I think I can see a little into the springs and motives whichbeing cunningly presented to me under various disguises, induced me to setabout..

performing the part I did, besides cajoling me into the delusion that it wasa choice resulting from my own unbiased freewill and discriminating judgment.chief among these motives was the overwhelming idea of the great whalehimself. Such a portentous and mysterious monster roused all my curiosity.Then the wild and distant seas where he rolled his island bulk; theundeliverable, nameless perils of the whale; these, with all the attendingmarvels of a thousand Patagonian sights and sounds, helped to sway me to mywish. With other men, perhaps, such things would not have been inducements;but as for me, I am tormented with an everlasting itch for things remote. Ilove to sail forbidden seas, and land on barbarous coasts. Not ignoring whatis good, I am quick to perceive a horror, and could still be social withit--would they let me --since it is but well to be on friendly terms with allthe inmates of the place one lodges in. By reason of these things, then, thewhaling voyage was welcome; the great flood-gates of the wonder-world swungopen, and in the wild conceits that swayed me to my purpose, two and twothere floated into my inmost soul, endless processions of the whale, and, midmost of them all, one grand hooded phantom, like a snow hill in the air...

.. < chapter ii 24 THE CARPET-BAG > I stuffed a shirt or two into my oldcarpet-bag, tucked it under my arm, and started for Cape Horn and thePacific. Quitting the good city of old Manhatto, I duly arrived in NewBedford. It was on a Saturday night in December. Much was I disappointedupon learning that the little packet for Nantucket had already sailed, andthat no way of reaching that place would offer, till the following Monday. Asmost young candidates for the pains and penalties of whaling..

stop at this same New Bedford, thence to embark on their voyage, it may aswell be related that I, for one, had no idea of so doing. For my mind wasmade up to sail in no other than a Nantucket craft, because there was a fine,boisterous something about everything connected with that famous old island,which amazingly pleased me. Besides though New Bedford has of late beengradually monopolizing the business of whaling, and though in this matter poorold Nantucket is now much behind her, yet Nantucket was her great original--the Tyre of this Carthage; --the place where the first dead American whalewas stranded. Where else but from Nantucket did those aboriginal whalemen,the Red-Men, first sally out in canoes to give chase to the Leviathan? Andwhere but from Nantucket, too, did that first adventurous little sloop putforth, partly laden with imported cobble-stones --so goes the story --to throwat the whales, in order to discover when they were nigh enough to risk aharpoon from the bowsprit? Now having a night, a day, and still another nightfollowing before me in New Bedford, ere I could embark for my destined port,it became a matter of concernment where I was to eat and sleep meanwhile. Itwas a very dubious-looking, nay, a very dark and dismal night, bitingly coldand cheerless. I knew no one in the place. With anxious grapnels I hadsounded my pocket, and only brought up a few pieces of silver, --So,wherever you go, Ishmael, said I to myself, as I stood in the middle of adreary street shouldering my bag, and comparing the gloom towards the northwith the darkness towards the south --wherever in your wisdom you may concludeto lodge for the night, my dear Ishmael, be sure to inquire the price, anddon't be too particular. With halting steps I paced the streets, and passedthe sign of The Crossed Harpoons --but it looked too expensive and jollythere. Further on, from the bright red windows of the Sword-Fish Inn, therecame such fervent rays, that it seemed to have melted the packed snow and icefrom before the house, for everywhere else the congealed frost lay ten inchesthick in a hard, asphaltic pavement, --rather weary for me, when I struck myfoot against the flinty projections, because from hard, remorseless..

service the soles of my boots were in a most miserable plight. Too expensiveand jolly, again thought I, pausing one moment to watch the broad glare inthe street, and hear the sounds of the tinkling glasses within. But go on,Ishmael, said I at last; don't you hear? get away from before the door;your patched boots are stopping the way. So on I went. I now by instinctfollowed the streets that took me waterward, for there, doubtless, were thecheapest, if not the cheeriest inns. Such dreary streets! Blocks ofblackness, not houses, on either hand, and here and there a candle, like acandle moving about in a tomb. At this hour of the night, of the last day ofthe week, that quarter of the town proved all but deserted. But presently Icame to a smoky light proceeding from a low, wide building, the door of whichstood invitingly open. It had a careless look, as if it were meant for theuses of the public; so, entering, the first thing I did was to stumble overan ash-box in the porch. Ha! thought I, ha, as the flying particles almostchoked me, are these ashes from that destroyed city, Gomorrah? But TheCrossed Harpoons, and The Sword-Fish? --this, then, must needs be the signof The Trap. However, I picked myself up and hearing a loud voice within,pushed on and opened a second, interior door. It seemed the great BlackParliament sitting in Tophet. A hundred black faces turned round in theirrows to peer; and beyond, a black Angel of Doom was beating a book in apulpit. It was a negro church; and the preacher's text was about theblackness of darkness, and the weeping and wailing and teeth-gnashingthere. Ha, Ishmael, muttered I, backing out, Wretched entertainment at thesign of The Trap! Moving on, I at last came to a dim sort of light not farfrom the docks, and heard a forlorn creaking in the air; and looking up,saw a swinging sign over the door with a white painting upon it, faintlyrepresenting a tall straight jet of misty spray, and these words underneath-- The Spouter-Inn: --Peter Coffin. Coffin? --Spouter? --Rather ominous in thatparticular connexion, thought I. But it is a common name in Nantucket,they say, and I suppose this Peter here is an emigrant from there. As thelight looked so dim, and the place, for the time, looked..

quiet enough, and the dilapidated little wooden house itself looked as if itmight have been carted here from the ruins of some burnt district, and as theswinging sign had a poverty-stricken sort of creak to it, I thought that herewas the very spot for cheap lodgings, and the best of pea coffee. It was aqueer sort of place --a gable-ended old house, one side palsied as it were, andleaning over sadly. It stood on a sharp bleak corner, where that tempestuouswind Euroclydon kept up a worse howling than ever it did about poor Paul'stossed craft. Euroclydon, nevertheless, is a mighty pleasant zephyr to anyone in-doors, with his feet on the hob quietly toasting for bed. In judgingof that tempestuous wind called Euroclydon, says an old writer --of whoseworks I possess the only copy extant -- it maketh a marvellous difference,whether thou lookest out at it from a glass window where the frost is all onthe outside, or whether thou observest it from that sashless window, wherethe frost is on both sides, and of which the wight Death is the onlyglazier. True enough, thought I, as this passage occurred to my mind --oldblack-letter, thou reasonest well. Yes, these eyes are windows, and thisbody of mine is the house. What a pity they didn't stop up the chinks and thecrannies though, and thrust in a little lint here and there. But it's toolate to make any improvements now. The universe is finished; the copestoneis on, and the chips were carted off a million years ago. Poor Lazarusthere, chattering his teeth against the curbstone for his pillow, and shakingoff his tatters with his shiverings, he might plug up both ears with rags,and put a corn-cob into his mouth, and yet that would not keep out thetempestuous Euroclydon. Euroclydon! says old Dives, in his red silkenwrapper --(he had a redder one afterwards) pooh, pooh! What a fine frostynight; how Orion glitters; what northern lights! Let them talk of theiroriental summer climes of everlasting conservatories; give me the privilegeof making my own summer with my own coals. But what thinks Lazarus? Can hewarm his blue hands by holding them up to the grand northern lights? Wouldnot Lazarus rather be in Sumatra than here? Would he not far rather lay himdown lengthwise along the line of the equator; yea, ye..

gods! go down to the fiery pit itself, in order to keep out this frost? Now,that Lazarus should lie stranded there on the curbstone before the door ofDives, this is more wonderful than that an iceberg should be moored to one ofthe Moluccas. Yet Dives himself, he too lives like a Czar in an ice palacemade of frozen sighs, and being a president of a temperance society, he onlydrinks the tepid tears of orphans. But no more of this blubbering now, we aregoing a-whaling, and there is plenty of that yet to come. Let us scrape theice from our frosted feet, and see what sort of a place this Spouter maybe...

.. < chapter iii 14 THE SPOUTER-INN > Entering that gable-ended Spouter-Inn,you found yourself in a wide, low, straggling entry with old-fashionedwainscots, reminding one of the bulwarks of some condemned old craft. On oneside hung a very large oil-painting so thoroughly besmoked, and every waydefaced, that in the unequal cross-lights by which you viewed it, it wasonly by diligent study and a series of systematic visits to it, and carefulinquiry of the neighbors, that you could any way arrive at an understandingof its purpose. such unaccountable masses of shades and shadows, that atfirst you almost thought some ambitious young artist, in the time of the NewEngland hags, had endeavored to delineate chaos bewitched. But by dint ofmuch and earnest contemplation, and oft repeated ponderings, and especially bythrowing open the little window towards the back of the entry, you at lastcome to the conclusion that such an idea, however wild, might not bealtogether unwarranted. But what most puzzled and confounded you was a long,limber, portentous, black mass of something hovering in the..

centre of the picture over three blue, dim, perpendicular lines floating in anameless yeast. A boggy, soggy, squitchy picture truly, enough to drive anervous man distracted. Yet was there a sort of indefinite, half-attained,unimaginable sublimity about it that fairly froze you to it, till youinvoluntarily took an oath with yourself to find out what that marvellouspainting meant. Ever and anon a bright, but, alas, deceptive idea would dartyou through. --It's the Black Sea in a midnight gale. --It's the unnaturalcombat of the four primal elements. --It's a blasted heath. --It's a Hyperboreanwinter scene. --It's the breaking-up of the ice-bound stream of Time. But atlast all these fancies yielded to that one portentous something in thepicture's midst. That once found out, and all the rest were plain. But stop;does it not bear a faint resemblance to a gigantic fish? even the greatleviathan himself? In fact, the artist's design seemed this: a final theoryof my own, partly based upon the aggregated opinions of many aged personswith whom I conversed upon the subject. The picture represents a Cape-Hornerin a great hurricane; the half-foundered ship weltering there with its threedismantled masts alone visible; and an exasperated whale, purposing to springclean over the craft, is in the enormous act of impaling himself upon thethree mast-heads. The opposite wall of this entry was hung all over with aheathenish array of monstrous clubs and spears. Some were thickly set withglittering teeth resembling ivory saws; others were tufted with knots ofhuman hair; and one was sickle-shaped, with a vast handle sweeping round likethe segment made in the new-mown grass by a long-armed mower. You shudderedas you gazed, and wondered what monstrous cannibal and savage could ever havegone a death-harvesting with such a hacking, horrifying implement. Mixed withthese were rusty old whaling lances and harpoons all broken and deformed.Some were storied weapons. With this once long lance, now wildly elbowed,fifty years ago did Nathan Swain kill fifteen whales between a sunrise and asunset. And that harpoon--so like a corkscrew now--was flung in Javan seas,and run away with by a whale, years afterward slain off the Cape of Blanco.The original iron entered..

nigh the tail, and, like a restless needle sojourning in the body of a man,travelled full forty feet, and at last was found imbedded in the hump.Crossing this dusky entry, and on through yon low-arched way --cut throughwhat in old times must have been a great central chimney with fire-places allround --you enter the public room. A still duskier place is this, with suchlow ponderous beams above, and such old wrinkled planks beneath, that youwould almost fancy you trod some old craft's cockpits, especially of such ahowling night, when this corner-anchored old ark rocked so furiously. On oneside stood a long, low, shelf-like table covered with cracked glass cases,filled with dusty rarities gathered from this wide world's remotest nooks.Projecting from the further angle of the room stands a dark-looking den --thebar-- a rude attempt at a right whale's head. Be that how it may, therestands the vast arched bone of the whale's jaw, so wide, a coach mightalmost drive beneath it. within are shabby shelves, ranged round with olddecanters, bottles, flasks; and in those jaws of swift destruction, likeanother cursed Jonah (by which name indeed they called him), bustles alittle withered old man, who, for their money, dearly sells the sailorsdeliriums and death. Abominable are the tumblers into which he pours hispoison. Though true cylinders without --within, the villanous green gogglingglasses deceitfully tapered downwards to a cheating bottom. Parallelmeridians rudely pecked into the glass, surround these footpads' goblets.Fill to this mark, and your charge is but a penny; to this a penny more;and so on to the full glass --the Cape Horn measure, which you may gulp downfor a shilling. Upon entering the place I found a number of young seamengathered about a table, examining by a dim light divers specimens ofskrimshander. I sought the landlord, and telling him I desired to beaccommodated with a room, received for answer that his house was full --not abed unoccupied. But avast, he added, tapping his forehead, you haint noobjections to sharing a harpooneer's blanket, have ye? I s'pose you are goin'a whalin', so you'd better get used to that sort of thing...

I told him that I never liked to sleep two in a bed; that if I should ever doso, it would depend upon who the harpooneer might be, and that if he (thelandlord) really had no other place for me, and the harpooneer was notdecidedly objectionable, why rather than wander further about a strange townon so bitter a night, I would put up with the half of any decent man'sblanket. I thought so. All right; take a seat. Supper? --you want supper?Supper 'll be ready directly. I sat down on an old wooden settle, carved allover like a bench on the Battery. At one end a ruminating tar was stillfurther adorning it with his jack-knife, stooping over and diligently workingaway at the space between his legs. he was trying his hand at a ship underfull sail, but he didn't make much headway, I thought. At last some four orfive of us were summoned to our meal in an adjoining room. It was cold asIceland --no fire at all --the landlord said he couldn't afford it. Nothingbut two dismal tallow candles, each in a winding sheet. We were fain tobutton up our monkey jackets, and hold to our lips cups of scalding tea withour half frozen fingers. But the fare was of the most substantial kind --notonly meat and potatoes, but dumplings; good heavens! dumplings for supper!One young fellow in a green box coat, addressed himself to these dumplings ina most direful manner. My boy, said the landlord, you'll have thenightmare to a dead sartainty. Landlord, I whispered, that aint theharpooneer, is it? Oh, no, said he, looking a sort of diabolically funny,the harpooneer is a dark complexioned chap. He never eats dumplings, hedon't--he eats nothing but steaks, and likes 'em rare. The devil he does,says I. Where is that harpooneer? Is he here? He'll be here afore long,was the answer. I could not help it, but I began to feel suspicious of thisdark complexioned harpooneer. At any rate, I made up my mind that if itso turned out that we should sleep together, he must undress and get into bedbefore I did...

Supper over, the company went back to the bar-room, when, knowing not whatelse to do with myself, I resolved to spend the rest of the evening as alooker on. Presently a rioting noise was heard without. Starting up, thelandlord cried, That's the Grampus's crew. I seed her reported in theoffing this morning; a three years' voyage, and a full ship. Hurrah, boys;now we'll have the latest news from the Feegees. A tramping of sea boots washeard in the entry; the door was flung open, and in rolled a wild set ofmariners enough. Enveloped in their shaggy watch coats, and with theirheads muffled in woollen comforters, all bedarned and ragged, and theirbeards stiff with icicles, they seemed an eruption of bears from Labrador.They had just landed from their boat, and this was the first house theyentered. No wonder, then, that they made a straight wake for the whale'smouth --the bar --when the wrinkled little old Jonah, there officiating, soonpoured them out brimmers all round. One complained of a bad cold in his head,upon which Jonah mixed him a pitch-like potion of gin and molasses, whichhe swore was a sovereign cure for all colds and catarrhs whatsoever, nevermind of how long standing, or whether caught off the coast of Labrador, oron the weather side of an ice-island. The liquor soon mounted into theirheads, as it generally does even with the arrantest topers newly landed fromsea, and they began capering about most obstreperously. I observed, however,that one of them held somewhat aloof, and though he seemed desirous not tospoil the hilarity of his shipmates by his own sober face, yet upon the wholehe refrained from making as much noise as the rest. This man interested meat once; and since the sea-gods had ordained that he should soon become myshipmate (though but a sleeping-partner one, so far as this narrative isconcerned), I will here venture upon a little description of him. He stoodfull six feet in height, with noble shoulders, and a chest like acoffer-dam. I have seldom seen such brawn in a man. His face was deeplybrown and burnt, making his white teeth dazzling by the contrast; while inthe deep shadows of his eyes floated some reminiscences that did not seem togive him much joy. His voice at once announced..

that he was a Southerner, and from his fine stature, I thought he must beone of those tall mountaineers from the Alleganian Ridge in Virginia. Whenthe revelry of his companions had mounted to its height, this man slippedaway unobserved, and I saw no more of him till he became my comrade on thesea. In a few minutes, however, he was missed by his shipmates, and being,it seems, for some reason a huge favorite with them, they raised a cry ofBulkington! Bulkington! where's Bulkington? and darted out of the house inpursuit of him. It was now about nine o'clock, and the room seeming almostsupernaturally quiet after these orgies, I began to congratulate myself upona little plan that had occurred to me just previous to the entrance of theseamen. No man prefers to sleep two in a bed. In fact, you would a good dealrather not sleep with your own brother. I don't know how it is, but peoplelike to be private when they are sleeping. And when it comes to sleeping withan unknown stranger, in a strange inn, in a strange town, and that strangera harpooneer, then your objections indefinitely multiply. Nor was there anyearthly reason why I as a sailor should sleep two in a bed, more than anybodyelse; for sailors no more sleep two in a bed at sea, than bachelor Kings doashore. To be sure they all sleep together in one apartment, but you haveyour own hammock, and cover yourself with your own blanket, and sleep in yourown skin. The more I pondered over this harpooneer, the more I abominatedthe thought of sleeping with him. It was fair to presume that being aharpooneer, his linen or woollen, as the case might be, would not be of thetidiest, certainly none of the finest. I began to twitch all over. Besides,it was getting late, and my decent harpooneer ought to be home and goingbedwards. Suppose now, he should tumble in upon me at midnight --how could Itell from what vile hole he had been coming? Landlord! I've changed my mindabout that harpooneer. -- I shan't sleep with him. I'll try the bench here.just as you please; i'm sorry i cant spare ye a tablecloth for a mattress,and it's a plaguy rough board here --feeling of the knots and notches. Butwait a bit, Skrimshander; I've..

got a carpenter's plane there in the bar --wait, I say, and I'll make ye snugenough. So saying he procured the plane; and with his old silk handkerchieffirst dusting the bench, vigorously set to planing away at my bed, the whilegrinning like an ape. The shavings flew right and left; till at last theplane-iron came bump against an indestructible knot. The landlord was nearspraining his wrist, and I told him for heaven's sake to quit -- the bed wassoft enough to suit me, and I did not know how all the planing in the worldcould make eider down of a pine plank. So gathering up the shavings withanother grin, and throwing them into the great stove in the middle of theroom, he went about his business, and left me in a brown study. I now tookthe measure of the bench, and found that it was a foot too short; but thatcould be mended with a chair. But it was a foot too narrow, and the otherbench in the room was about four inches higher than the planed one --so therewas no yoking them. I then placed the first bench lengthwise along the onlyclear space against the wall, leaving a little interval between, for my backto settle down in. But I soon found that there came such a draught of coldair over me from under the sill of the window, that this plan would never doat all, especially as another current from the rickety door met the one fromthe window, and both together formed a series of small whirlwinds in theimmediate vicinity of the spot where I had thought to spend the night. Thedevil fetch that harpooneer, thought I, but stop, couldn't I steal a march onhim --bolt his door inside, and jump into his bed, not to be wakened by themost violent knockings? it seemed no bad idea; but upon second thoughts Idismissed it. For who could tell but what the next morning, so soon as Ipopped out of the room, the harpooneer might be standing in the entry, allready to knock me down! Still, looking around me again, and seeing no possiblechance of spending a sufferable night unless in some other person's bed, Ibegan to think that after all I might be cherishing unwarrantable prejudicesagainst this unknown harpooneer. Thinks I, I'll wait awhile; he must bedropping in before long. I'll have a good look at him then, and perhaps wemay become jolly good bedfellows after all --there's no telling...

But though the other boarders kept coming in by ones, twos, and threes, andgoing to bed, yet no sign of my harpooneer. Landlord! said I, what sort ofa chap is he --does he always keep such late hours? It was now hard upontwelve o'clock. The landlord chuckled again with his lean chuckle, andseemed to be mightily tickled at something beyond my comprehension. No, heanswered, generally he's an early bird -- airley to bed and airley to rise--yes, he's the bird what catches the worm. --But to-night he went out apeddling, you see, and I don't see what on airth keeps him so late, unless,may be, he can't sell his head. Can't sell his head? --What sort of abamboozingly story is this you are telling me? getting into a towering rage. Do you pretend to say, landlord, that this harpooneer is actually engagedthis blessed Saturday night, or rather Sunday morning, in peddling his headaround this town? That's precisely it, said the landlord, and I told himhe couldn't sell it here, the market's overstocked. With what? shouted I. With heads to be sure; ain't there too many heads in the world? I tellyou what it is, landlord, said I, quite calmly, you'd better stop spinningthat yarn to me --I'm not green. May be not, taking out a stick andwhittling a toothpick, but I rayther guess you'll be done brown if that ereharpooneer hears you a slanderin' his head. I'll break it for him, said I,now flying into a passion again at this unaccountable farrago of thelandlord's. It's broke a'ready, said he. Broke, said I -- broke, do youmean? Sartain, and that's the very reason he can't sell it, I guess. Landlord, said I, going up to him as cool as Mt. Hecla in a snow storm,-- landlord, stop whittling. You and I must understand one another, andthat too without delay. I come to your house and want a bed; you tell me youcan only give me half a one; that the other half belongs to a certainharpooneer. And about this harpooneer, whom I have not yet seen, youpersist in telling me the most mystifying and exasperating stories, tendingto beget in me an uncomfortable feeling towards the man whom..

you design for my bedfellow --a sort of connexion, landlord, which is anintimate and confidential one in the highest degree. I now demand of you tospeak out and tell me who and what this harpooneer is, and whether I shall bein all respects safe to spend the night with him. And in the first place,you will be so good as to unsay that story about selling his head, which iftrue I take to be good evidence that this harpooneer is stark mad, and I'veno idea of sleeping with a madman; and you, sir, you I mean, landlord, you,sir, by trying to induce me to do so knowingly, would thereby render yourselfliable to a criminal prosecution. Wall, said the landlord, fetching a longbreath, that's a purty long sarmon for a chap that rips a little now andthen. But be easy, be easy, this here harpooneer I have been tellin' you ofhas just arrived from the south seas, where he bought up a lot of 'balmed NewZealand heads (great curios, you know), and he's sold all on 'em but one,and that one he's trying to sell to-night, cause to-morrow's Sunday, and itwould not do to be sellin' human heads about the streets when folks is goin'to churches. He wanted to, last Sunday, but I stopped him just as he wasgoin' out of the door with four heads strung on a string, for all the airthlike a string of inions. This account cleared up the otherwise unaccountablemystery, and showed that the landlord, after all, had had no idea of foolingme --but at the same time what could I think of a harpooneer who stayed out aSaturday night clean into the holy Sabbath, engaged in such a cannibalbusiness as selling the heads of dead idolators? Depend upon it, landlord,that harpooneer is a dangerous man. He pays reg'lar, was the rejoinder. But come, it's getting dreadful late, you had better be turning flukes --it'sa nice bed: Sal and me slept in that ere bed the night we were spliced.There's plenty room for two to kick about in that bed; it's an almighty bigbed that. Why, afore we give it up, Sal used to put our Sam and littleJohnny in the foot of it. But I got a dreaming and sprawling about one night,and somehow, Sam got pitched on the floor, and came near breaking his arm.After..

that, Sal said it wouldn't do. Come along here, I'll give ye a glim in ajiffy; and so saying he lighted a candle and held it towards me, offering tolead the way. But I stood irresolute; when looking at a clock in the corner,he exclaimed I vum it's Sunday --you won't see that harpooneer to-night; he'scome to anchor somewhere --come along then; do come; won't ye come? Iconsidered the matter a moment, and then up stairs we went, and I wasushered into a small room, cold as a clam, and furnished, sure enough, with aprodigious bed, almost big enough indeed for any four harpooneers to sleepabreast. There, said the landlord, placing the candle on a crazy old seachest that did double duty as a wash-stand and centre table; there, makeyourself comfortable now, and good night to ye. I turned round from eyeingthe bed, but he had disappeared. Folding back the counterpane, I stoopedover the bed. Though none of the most elegant, it yet stood the scrutinytolerably well. I then glanced round the room; and besides the bedstead andcentre table, could see no other furniture belonging to the place, but arude shelf, the four walls, and a papered fireboard representing a manstriking a whale. Of things not properly belonging to the room, there was ahammock lashed up, and thrown upon the floor in one corner; also a largeseaman's bag, containing the harpooneer's wardrobe, no doubt in lieu of aland trunk. Likewise, there was a parcel of outlandish bone fish hooks on theshelf over the fire-place, and a tall harpoon standing at the head of thebed. But what is this on the chest? I took it up, and held it close to thelight, and felt it, and smelt it, and tried every way possible to arrive atsome satisfactory conclusion concerning it. I can compare it to nothing but alarge door mat, ornamented at the edges with little tinkling tags somethinglike the stained porcupine quills round an Indian moccasin. There was a holeor slit in the middle of this mat, as you see the same in South Americanponchos. But could it be possible that any sober harpooneer would get intoa door mat, and parade the streets of any Christian town in that sort ofguise? I put it on, to try it, and it weighed me down like a hamper, beinguncommonly shaggy and thick, and I thought a little damp, as though this..

mysterious harpooneer had been wearing it of a rainy day. I went up in it toa bit of glass stuck against the wall, and I never saw such a sight in mylife. I tore myself out of it in such a hurry that I gave myself a kink inthe neck. I sat down on the side of the bed, and commenced thinking aboutthis head-peddling harpooneer, and his door mat. After thinking some time onthe bed-side, I got up and took off my monkey jacket, and then stood in themiddle of the room thinking. I then took off my coat, and thought a littlemore in my shirt sleeves. But beginning to feel very cold now, half undressedas I was, and remembering what the landlord said about the harpooneer's notcoming home at all that night, it being so very late, I made no more ado,but jumped out of my pantaloons and boots, and then blowing out the lighttumbled into bed, and commended myself to the care of heaven. Whether thatmattress was stuffed with corn-cobs or broken crockery, there is no telling,but I rolled about a good deal, and could not sleep for a long time. Atlast I slid off into a light doze, and had pretty nearly made a good offingtowards the land of Nod, when I heard a heavy footfall in the passage, andsaw a glimmer of light come into the room from under the door. Lord save me,thinks I, that must be the harpooneer, the infernal head-peddler. But I layperfectly still, and resolved not to say a word till spoken to. Holding alight in one hand, and that identical New Zealand head in the other, thestranger entered the room, and without looking towards the bed, placed hiscandle a good way off from me on the floor in one corner, and then beganworking away at the knotted cords of the large bag I before spoke of as beingin the room. I was all eagerness to see his face, but he kept it averted forsome time while employed in unlacing the bag's mouth. This accomplished,however, he turned round --when, good heavens! what a sight! Such a face! Itwas of a dark purplish, yellow color, here and there stuck over with large,blackish looking squares. Yes, it's just as I thought, he's a terriblebedfellow; he's been in a fight, got dreadfully cut, and here he is, justfrom the surgeon. But at that moment he chanced to turn his face so towardsthe light, that I plainly saw they could not be sticking-plasters at all,..

those black squares on his cheeks. they were stains of some sort or other. Atfirst I knew not what to make of this; but soon an inkling of the truthoccurred to me. I remembered a story of a white man --a whaleman too--who,falling among the cannibals, had been tattooed by them. I concluded that thisharpooneer, in the course of his distant voyages, must have met with asimilar adventure. And what is it, thought I, after all! It's only hisoutside; a man can be honest in any sort of skin. But then, what to make ofhis unearthly complexion, that part of it, I mean, lying round about, andcompletely independent of the squares of tattooing. To be sure, it might benothing but a good coat of tropical tanning; but I never heard of a hot sun'stanning a white man into a purplish yellow one. However, I had never beenin the South Seas; and perhaps the sun there produced these extraordinaryeffects upon the skin. Now, while all these ideas were passing through melike lightning, this harpooneer never noticed me at all. But, after somedifficulty having opened his bag, he commenced fumbling in it, and presentlypulled out a sort of tomahawk, and a seal-skin wallet with the hair on.Placing these on the old chest in the middle of the room, he then took theNew Zealand head --a ghastly thing enough --and crammed it down into the bag.He now took off his hat --a new beaver hat --when I came nigh singing out withfresh surprise. There was no hair on his head --none to speak of at least --nothing but a small scalp-knot twisted up on his forehead. His bald purplishhead now looked for all the world like a mildewed skull. Had not the strangerstood between me and the door, I would have bolted out of it quicker than everI bolted a dinner. Even as it was, I thought something of slipping out of thewindow, but it was the second floor back. I am no coward, but what to makeof this head-peddling purple rascal altogether passed my comprehension.Ignorance is the parent of fear, and being completely nonplussed andconfounded about the stranger, i confess i was now as much afraid of him as ifit was the devil himself who had thus broken into my room at the dead ofnight. In fact, I was so afraid of him that I was not game enough just thento address him, and demand a satisfactory answer concerning what seemedinexplicable in him...

Meanwhile, he continued the business of undressing, and at last showed hischest and arms. As I live, these covered parts of him were checkered withthe same squares as his face; his back, too, was all over the same darksquares; he seemed to have been in a Thirty Years' War, and just escaped fromit with a sticking-plaster shirt. Still more, his very legs were marked, asif a parcel of dark green frogs were running up the trunks of young palms. Itwas now quite plain that he must be some abominable savage or other shippedaboard of a whaleman in the South Seas, and so landed in this Christiancountry. I quaked to think of it. A peddler of heads too --perhaps the headsof his own brothers. He might take a fancy to mine --heavens! look at thattomahawk! But there was no time for shuddering, for now the savage went aboutsomething that completely fascinated my attention, and convinced me that hemust indeed be a heathen. Going to his heavy grego, or wrapall, ordreadnaught, which he had previously hung on a chair, he fumbled in thepockets, and produced at length a curious little deformed image with a hunchon its back, and exactly the color of a three days' old Congo baby.Remembering the embalmed head, at first I almost thought that this blackmanikin was a real baby preserved in some similar manner. But seeing that itwas not at all limber, and that it glistened a good deal like polished ebony,I concluded that it must be nothing but a wooden idol, which indeed itproved to be. For now the savage goes up to the empty fireplace, and removingthe papered fire-board, sets up this little hunchbacked image, like a tenpin,between the andirons. the chimney jambs and all the bricks inside were verysooty, so that I thought this fire-place made a very appropriate little shrineor chapel for his Congo idol. I now screwed my eyes hard towards the halfhidden image, feeling but ill at ease meantime --to see what was next tofollow. First he takes about a double handful of shavings out of his gregopocket, and places them carefully before the idol; then laying a bit of shipbiscuit on top and applying the flame from the lamp, he kindled the shavingsinto a sacrificial blaze. Presently, after many hasty snatches into thefire, and still hastier..

withdrawals of his fingers (whereby he seemed to be scorching them badly),he at last succeeded in drawing out the biscuit; then blowing off the heatand ashes a little, he made a polite offer of it to the little negro. But thelittle devil did not seem to fancy such dry sort of fare at all; he nevermoved his lips. All these strange antics were accompanied by still strangerguttural noises from the devotee, who seemed to be praying in a sing-song orelse singing some pagan psalmody or other, during which his face twitchedabout in the most unnatural manner. At last extinguishing the fire, he tookthe idol up very unceremoniously, and bagged it again in his grego pocketas carelessly as if he were a sportsman bagging a dead woodcock. All thesequeer proceedings increased my uncomfortableness, and seeing him nowexhibiting strong symptoms of concluding his business operations, and jumpinginto bed with me, I thought it was high time, now or never, before the lightwas put out, to break the spell into which I had so long been bound. But theinterval I spent in deliberating what to say, was a fatal one. Taking up histomahawk from the table, he examined the head of it for an instant, and thenholding it to the light, with his mouth at the handle, he puffed out greatclouds of tobacco smoke. The next moment the light was extinguished, andthis wild cannibal, tomahawk between his teeth, sprang into bed with me. Isang out, I could not help it now; and giving a sudden grunt of astonishmenthe began feeling me. Stammering out something, I knew not what, I rolled awayfrom him against the wall, and then conjured him, whoever or whatever he mightbe, to keep quiet, and let me get up and light the lamp again. But hisguttural responses satisfied me at once that he but ill comprehended mymeaning. Who-e debel you? --he at last said -- you no speak-e, dam-me, Ikill-e. And so saying the lighted tomahawk began flourishing about me in thedark. Landlord, for God's sake, Peter Coffin! shouted I. Landlord!Watch! Coffin! Angels! save me! Speak-e! tell-ee me who-ee be, or dam-me,I kill-e! again growled the cannibal, while his horrid flourishings of thetomahawk scattered the hot tobacco ashes about me till I thought..

my linen would get on fire. But thank heaven, at that moment the landlordcame into the room light in hand, and leaping from the bed I ran up to him. Don't be afraid now, said he, grinning again. Queequeg here wouldn't harma hair of your head. Stop your grinning, shouted I, and why didn't youtell me that that infernal harpooneer was a cannibal? I thought ye know'dit; --didn't I tell ye, he was peddlin' heads around town? --but turn flukesagain and go to sleep. Queequeg, look here --you sabbee me, I sabbee you --thisman sleepe you --you sabbee? Me sabbee plenty --grunted Queequeg, puffingaway at his pipe and sitting up in bed. You gettee in, he added, motioningto me with his tomahawk, and throwing the clothes to one side. He really didthis in not only a civil but a really kind and charitable way. I stoodlooking at him a moment. For all his tattooings he was on the whole a clean,comely looking cannibal. What's all this fuss I have been making about,thought i to myself --the man's a human being just as I am: he has just asmuch reason to fear me, as I have to be afraid of him. Better sleep with asober cannibal than a drunken Christian. Landlord, said I, tell him tostash his tomahawk there, or pipe, or whatever you call it; tell him tostop smoking, in short, and I will turn in with him. But I don't fancy havinga man smoking in bed with me. It's dangerous. Besides, I aint insured.This being told to Queequeg, he at once complied, and again politely motionedme to get into bed --rolling over to one side as much as to say --I wont touch aleg of ye. Good night, landlord, said I, you may go. I turned in, andnever slept better in my life...

.. < chapter iv 2 THE COUNTERPANE > Upon waking next morning about daylight,I found Queequeg's arm thrown over me in the most loving and affectionatemanner. You had almost thought I had been his wife. The counterpane was ofpatchwork, full of odd little parti-colored squares and triangles; and thisarm of his tattooed all over with an interminable Cretan labyrinth of afigure, no two parts of which were of one precise shade --owing I suppose tohis keeping his arm at sea unmethodically in sun and shade, his shirtsleeves irregularly rolled up at various times --this same arm of his, I say,looked for all the world like a strip of that same patchwork quilt. Indeed,partly lying on it as the arm did when I first awoke, I could hardly tell itfrom the quilt, they so blended their hues together; and it was only by thesense of weight and pressure that I could tell that Queequeg was hugging me.My sensations were strange. Let me try to explain them. When I was a child,I well remember a somewhat similar circumstance that befell me; whether itwas a reality or a dream, I never could entirely settle. The circumstance wasthis. I had been cutting up some caper or other --I think it was trying tocrawl up the chimney, as i had seen a little sweep do a few days previous;and my stepmother who, somehow or other, was all the time whipping me, orsending me to bed supperless, --my mother dragged me by the legs out of thechimney and packed me off to bed, though it was only two o'clock in theafternoon of the 21st June, the longest day in the year in our hemisphere. Ifelt dreadfully. But there was no help for it, so up stairs I went to mylittle room in the third floor, undressed myself as slowly as possible so asto kill time, and with a bitter sigh got between the sheets. I lay theredismally calculating that sixteen entire hours must elapse before I could hopefor a resurrection. Sixteen hours in..

bed! the small of my back ached to think of it. And it was so light too;the sun shining in at the window, and a great rattling of coaches in thestreets, and the sound of gay voices all over the house. I felt worse andworse --at last I got up, dressed, and softly going down in my stockingedfeet, sought out my stepmother, and suddenly threw myself at her feet,beseeching her as a particular favor to give me a good slippering for mymisbehavior; anything indeed but condemning me to lie abed such anunendurable length of time. But she was the best and most conscientious ofstepmothers, and back I had to go to my room. For several hours I lay therebroad awake, feeling a great deal worse than I have ever done since, evenfrom the greatest subsequent misfortunes. At last I must have fallen into atroubled nightmare of a doze; and slowly waking from it --half steeped indreams --I opened my eyes, and the before sun-lit room was now wrapped in outerdarkness. Instantly I felt a shock running through all my frame; nothing wasto be seen, and nothing was to be heard; but a supernatural hand seemedplaced in mine. My arm hung over the counterpane, and the nameless,unimaginable, silent form or phantom, to which the hand belonged, seemedclosely seated by my bedside. For what seemed ages piled on ages, I laythere, frozen with the most awful fears, not daring to drag away my hand;yet ever thinking that if I could but stir it one single inch, the horridspell would be broken. I knew not how this consciousness at last glided awayfrom me; but waking in the morning, I shudderingly remembered it all, andfor days and weeks and months afterwards I lost myself in confounding attemptsto explain the mystery. Nay, to this very hour, I often puzzle myself withit. Now, take away the awful fear, and my sensations at feeling thesupernatural hand in mine were very similar, in their strangeness, to thosewhich I experienced on waking up and seeing Queequeg's pagan arm thrown roundme. But at length all the past night's events soberly recurred, one by one,in fixed reality, and then I lay only alive to the comical predicament. Forthough I tried to move his arm --unlock his bridegroom clasp --yet, sleepingas he was, he still hugged me tightly, as though naught but death should partus twain. I now strove to rouse him --..

Queequeg! --but his only answer was a snore. I then rolled over, my neckfeeling as if it were in a horse-collar; and suddenly felt a slight scratch.Throwing aside the counterpane, there lay the tomahawk sleeping by thesavage's side, as if it were a hatchet-faced baby. A pretty pickle, truly,thought I; abed here in a strange house in the broad day, with a cannibal anda tomahawk! Queequeg! --in the name of goodness, Queequeg, wake! At length,by dint of much wriggling, and loud and incessant expostulations upon theunbecomingness of his hugging a fellow male in that matrimonial sort of style, I succeeded in extracting a grunt; and presently, he drew back his arm,shook himself all over like a Newfoundland dog just from the water, and satup in bed, stiff as a pike-staff, looking at me, and rubbing his eyes as ifhe did not altogether remember how I came to be there, though a dimconsciousness of knowing something about me seemed slowly dawning over him.Meanwhile, I lay quietly eyeing him, having no serious misgivings now, andbent upon narrowly observing so curious a creature. When, at last, his mindseemed made up touching the character of his bedfellow, and he became, as itwere, reconciled to the fact; he jumped out upon the floor, and by certainsigns and sounds gave me to understand that, if it pleased me, he woulddress first and then leave me to dress afterwards, leaving the wholeapartment to myself. Thinks I, Queequeg, under the circumstances, this is avery civilized overture; but, the truth is, these savages have an innatesense of delicacy, say what you will; it is marvellous how essentiallypolite they are. I pay this particular compliment to Queequeg, because hetreated me with so much civility and consideration, while I was guilty ofgreat rudeness; staring at him from the bed, and watching all his toilettemotions; for the time my curiosity getting the better of my breeding.Nevertheless, a man like Queequeg you don't see every day, he and his wayswere well worth unusual regarding. He commenced dressing at top by donning hisbeaver hat, a very tall one, by the by, and then --still minus his trowsers-- he hunted up his boots. What under the heavens he did it for, I cannottell, but his next movement was to crush himself --boots in hand, and hat on--under the bed; when, from sundry violent..

gaspings and strainings, I inferred he was hard at work booting himself;though by no law of propriety that I ever heard of, is any man required to beprivate when putting on his boots. But Queequeg, do you see, was a creaturein the transition state -- neither caterpillar nor butterfly. He was justenough civilized to show off his outlandishness in the strangest possiblemanner. his education was not yet completed. He was an undergraduate. If hehad not been a small degree civilized, he very probably would not havetroubled himself with boots at all; but then, if he had not been still asavage, he never would have dreamt of getting under the bed to put them on.At last, he emerged with his hat very much dented and crushed down over hiseyes, and began creaking and limping about the room, as if, not being muchaccustomed to boots, his pair of damp, wrinkled cowhide ones -- probably notmade to order either --rather pinched and tormented him at the first go off ofa bitter cold morning. Seeing, now, that there were no curtains to the window,and that the street being very narrow, the house opposite commanded a plainview into the room, and observing more and more the indecorous figure thatQueequeg made, staving about with little else but his hat and boots on; Ibegged him as well as I could, to accelerate his toilet somewhat, andparticularly to get into his pantaloons as soon as possible. He complied,and then proceeded to wash himself. At that time in the morning anyChristian would have washed his face; but Queequeg, to my amazement,contented himself with restricting his ablutions to his chest, arms, andhands. He then donned his waistcoat, and taking up a piece of hard soap onthe wash-stand centre-table, dipped it into water and commenced lathering hisface. I was watching to see where he kept his razor, when lo and behold, hetakes the harpoon from the bed corner, slips out the long wooden stock,unsheathes the head, whets it a little on his boot, and striding up to thebit of mirror against the wall, begins a vigorous scraping, or ratherharpooning of his cheeks. Thinks I, Queequeg, this is using Rogers's bestcutlery with a vengeance. Afterwards I wondered the less at this operationwhen I came to know of what fine steel the head of a harpoon is made, and howexceedingly sharp the long straight edges are always kept...

the rest of his toilet was soon achieved, and he proudly marched out of theroom, wrapped up in his great pilot monkey jacket, and sporting his harpoonlike a marshal's baton...

.. < chapter v 5 BREAKFAST > I quickly followed suit, and descending intothe bar-room accosted the grinning landlord very pleasantly. I cherished nomalice towards him, though he had been skylarking with me not a little in thematter of my bedfellow. However, a good laugh is a mighty good thing, andrather too scarce a good thing; the more's the pity. So, if any one man, inhis own proper person, afford stuff for a good joke to anybody, let him notbe backward, but let him cheerfully allow himself to spend and be spent inthat way. And the man that has anything bountifully laughable about him, besure there is more in that man than you perhaps think for. The bar-room wasnow full of the boarders who had been dropping in the night previous, andwhom I had not as yet had a good look at. They were nearly all whalemen;chief mates, and second mates, and third mates, and sea carpenters, and seacoopers, and sea blacksmiths, and harpooneers, and ship keepers; a brown andbrawny company, with bosky beards; an unshorn, shaggy set, all wearingmonkey jackets for morning gowns. You could pretty plainly tell how long eachone had been ashore. This young fellow's healthy cheek is like a sun-toastedpear in hue, and would seem to smell almost as musky; he cannot have beenthree days landed from his Indian voyage. That man next him looks a fewshades lighter; you might say a touch of satin wood is in him. In thecomplexion of a third still lingers a tropic tawn, but slightly bleachedwithal; he doubtless has tarried whole weeks ashore. But who could show acheek like..

Queequeg? which, barred with various tints, seemed like the Andes' westernslope, to show forth in one array, contrasting climates, zone by zone. Grub, ho! now cried the landlord, flinging open a door, and in we went tobreakfast. They say that men who have seen the world, thereby become quite atease in manner, quite self-possessed in company. Not always, though:Ledyard, the great New England traveller, and Mungo Park, the Scotch one; ofall men, they possessed the least assurance in the parlor. But perhaps themere crossing of Siberia in a sledge drawn by dogs as Ledyard did, or thetaking a long solitary walk on an empty stomach, in the negro heart ofAfrica, which was the sum of poor Mungo's performances -- this kind of travel,I say, may not be the very best mode of attaining a high social polish.Still, for the most part, that sort of thing is to be had anywhere. Thesereflections just here are occasioned by the circumstance that after we wereall seated at the table, and I was preparing to hear some good stories aboutwhaling; to my no small surprise, nearly every man maintained a profoundsilence. And not only that, but they looked embarrassed. Yes, here were aset of sea-dogs, many of whom without the slightest bashfulness had boardedgreat whales on the high seas --entire strangers to them --and duelled them deadwithout winking; and yet, here they sat at a social breakfast table --all ofthe same calling, all of kindred tastes --looking round as sheepishly ateach other as though they had never been out of sight of some sheepfold amongthe Green Mountains. A curious sight; these bashful bears, these timidwarrior whalemen! But as for Queequeg --why, Queequeg sat there among them --atthe head of the table, too, it so chanced; as cool as an icicle. To be sureI cannot say much for his breeding. His greatest admirer could not havecordially justified his bringing his harpoon into breakfast with him, andusing it there without ceremony; reaching over the table with it, to theimminent jeopardy of many heads, and grappling the beefsteaks towards him.But that was certainly very coolly done by him, and every..

one knows that in most people's estimation, to do anything coolly is to do itgenteelly. We will not speak of all Queequeg's peculiarities here; how heeschewed coffee and hot rolls, and applied his undivided attention tobeefsteaks, done rare. Enough, that when breakfast was over he withdrew likethe rest into the public room, lighted his tomahawk-pipe, and was sittingthere quietly digesting and smoking with his inseparable hat on, when Isallied out for a stroll...

.. < chapter vi 11 THE STREET > If I had been astonished at first catching aglimpse of so outlandish an individual as Queequeg circulating among thepolite society of a civilized town, that astonishment soon departed upontaking my first daylight stroll through the streets of New Bedford. Inthoroughfares nigh the docks, any considerable seaport will frequently offerto view the queerest looking nondescripts from foreign parts. Even inBroadway and Chestnut streets, Mediterranean mariners will sometimes jostlethe affrighted ladies. Regent street is not unknown to Lascars and Malays;and at Bombay, in the Apollo Green, live Yankees have often scared thenatives. But New Bedford beats all Water street and Wapping. In theselast-mentioned haunts you see only sailors; but in New Bedford, actualcannibals stand chatting at street corners; savages outright; many of whomyet carry on their bones unholy flesh. It makes a stranger stare. But,besides the Feegeeans, Tongatabooarrs, Erromanggoans, Pannangians, andBrighggians, and, besides the wild specimens of the whaling-craft whichunheeded reel about the streets, you will see other sights still morecurious, certainly more comical...

There weekly arrive in this town scores of green Vermonters and New Hampshiremen, all athirst for gain and glory in the fishery. They are mostly young,of stalwart frames; fellows who have felled forests, and now seek to dropthe axe and snatch the whale-lance. Many are as green as the Green Mountainswhence they came. In some things you would think them but a few hours old.Look there! that chap strutting round the corner. He wears a beaver hat andswallow-tailed coat, girdled with a sailor-belt and sheath-knife. Here comesanother with a sou'-wester and a bombazine cloak. No town-bred dandy willcompare with a country-bred one -- I mean a downright bumpkin dandy --a fellowthat, in the dog-days, will mow his two acres in buckskin gloves for fear oftanning his hands. Now when a country dandy like this takes it into his headto make a distinguished reputation, and joins the great whale-fishery, youshould see the comical things he does upon reaching the seaport. Inbespeaking his sea-outfit, he orders bell-buttons to his waistcoats; strapsto his canvas trowsers. Ah, poor Hay-Seed! how bitterly will burst thosestraps in the first howling gale, when thou art driven, straps, buttons, andall, down the throat of the tempest. But think not that this famous town hasonly harpooneers, cannibals, and bumpkins to show her visitors. Not at all.Still New Bedford is a queer place. Had it not been for us whalemen, thattract of land would this day perhaps have been in as howling condition as thecoast of Labrador. As it is, parts of her back country are enough to frightenone, they look so bony. The town itself is perhaps the dearest place to livein, in all New England. It is a land of oil, true enough; but not likeCanaan; a land, also, of corn and wine. The streets do not run with milk;nor in the spring-time do they pave them with fresh eggs. Yet, in spite ofthis, nowhere in all America will you find more patrician-like houses; parksand gardens more opulent, than in New Bedford. Whence came they? how plantedupon this once scraggy scoria of a country? Go and gaze upon the ironemblematical harpoons round yonder lofty mansion, and your question will beanswered. Yes; all these brave houses and flowery gardens came from the..

Atlantic, Pacific, and Indian oceans. One and all, they were harpooned anddragged up hither from the bottom of the sea. Can Herr Alexander perform afeat like that? In New Bedford, fathers, they say, give whales for dowers totheir daughters, and portion off their nieces with a few porpoises a-piece.You must go to New Bedford to see a brilliant wedding; for, they say, theyhave reservoirs of oil in every house, and every night recklessly burn theirlengths in spermaceti candles. In summer time, the town is sweet to see;full of fine maples --long avenues of green and gold. And in August, high inair, the beautiful and bountiful horse-chestnuts, candelabra-wise, profferthe passer-by their tapering upright cones of congregated blossoms. Soomnipotent is art; which in many a district of New Bedford has superinducedbright terraces of flowers upon the barren refuse rocks thrown aside atcreation's final day. And the women of New Bedford, they bloom like their ownred roses. But roses only bloom in summer; whereas the fine carnation oftheir cheeks is perennial as sunlight in the seventh heavens. Elsewhere matchthat bloom of theirs, ye cannot, save in Salem, where they tell me the younggirls breathe such musk, their sailor sweethearts smell them miles off shore,as though they were drawing nigh the odorous Moluccas instead of thePuritanic sands... < chapter vii 26 THE CHAPEL > In this same New Bedford there stands aWhaleman's Chapel, and few are the moody fishermen, shortly bound for theIndian Ocean or Pacific, who fail to make a Sunday visit to the spot. I amsure that I did not. Returning from my first morning stroll, I again salliedout upon this special errand. The sky had changed from clear,..

sunny cold, to driving sleet and mist. Wrapping myself in my shaggy jacketof the cloth called bearskin, I fought my way against the stubborn storm.Entering, I found a small scattered congregation of sailors, and sailors'wives and widows. A muffled silence reigned, only broken at times by theshrieks of the storm. Each silent worshipper seemed purposely sitting apartfrom the other, as if each silent grief were insular and incommunicable. Thechaplain had not yet arrived; and there these silent islands of men and womensat steadfastly eyeing several marble tablets, with black borders, masonedinto the wall on either side the pulpit. Three of them ran something like thefollowing, but I do not pretend to quote: -- Sacred To the Memory of JohnTalbot, Who, at the age of eighteen, was lost overboard, Near the Isle ofDesolation, off Patagonia, November 1st,. This Tablet Is erected to hisMemory By his Sister. Sacred To the Memory of Robert Long, Willis Ellery,Nathan Coleman, Walter Canny, Seth Macy, and Samuel Gleig, Forming one of theboats' crews of the Ship Eliza, Who were towed out of sight by a Whale, Onthe Off-shore Ground in the Pacific, December 31st, uima-as-2.3.1/uimaj-as-activemq/src/test/resources/data/IBM_LifeSciences.xml000066400000000000000000000077651160020716200266360ustar00rootroot00000000000000 IBM announces $100 Million investment in Life Sciences 16 August 2000 "Life sciences is one of the emerging markets at the heart of IBM's growth strategy," said John M. Thompson, IBM senior vice president & group executive, Software. "This investment is the first of a number of steps we will be taking to advance IBM's life sciences initiatives." In his role as newly appointed IBM Corporation vice chairman, effective September 1, Mr. Thompson will be responsible for integrating and accelerating IBM's efforts to exploit life sciences and other emerging growth areas. IBM estimates the market for IT solutions for life sciences will skyrocket from $3.5 billion today to more than $9 billion by 2003. Driving demand is the explosive growth in genomic, proteomic and pharmaceutical research. For example, the Human Genome Database is approximately three terabytes of data, or the equivalent of 150 million pages of information. The volume of life sciences data is doubling every six months. "All of this genetic data is worthless without the information technology that can help scientists manage and analyze it to unlock the pathways that will lead to new cures for many of today's diseases," said Dr. Caroline Kovac, vice president of IBM's new Life Sciences unit. "IBM can help speed this process by enabling more efficient interpretation of data and sharing of knowledge. The potential for change based on innovation in life sciences is bigger than the change caused by the digital circuit." Among the life sciences initiatives already underway at IBM are: - DiscoveryLink* -- For the first time, researchers using this combination of innovative middleware and integration services can join together information from many sources to solve complex medical research problems. DiscoveryLink creates a "virtual database" that permits data to be accessed and extracted from multiple data sources used in research and development projects. This IT solution can dramatically improve product cycle time and lower development costs for pharmaceutical, biotechnology and agri-science companies. - Blue Gene* - IBM is building a supercomputer 100 times faster than any available today designed to advance understanding of the mechanisms behind protein folding through large-scale biomolecular simulation. In December, IBM committed $100 million to this five-year research project to advance the state-of-the-art in supercomputing for biological applications. - Bio-Dictionary* -- IBM has compiled a protein dictionary containing some 30 million protein "words" designed to accelerate the understanding of protein shapes and functions.Bio-Dictionaries for selected genomes, as well as bioinformatics algorithms for pattern discovery and other relevant applications, are available to scientists and researchers for noncommercial use through a website dedicated to life sciences content at http://www.research.ibm.com/compsci/compbio/.

* Indicates trademark or registered trademark of IBM Corporation.
uima-as-2.3.1/uimaj-as-activemq/src/test/resources/data/New_IBM_Fellows.xml000066400000000000000000000112771160020716200265170ustar00rootroot00000000000000 IBM Names Five Fellows, Company's Highest Techinical Honor 05 June 2002 IBM today elevated five employees to the title of IBM Fellow -- its most prestigious technical honor. The company also presented more than $2.8 million in cash awards to employees whose technical innovation have yielded exceptional value to the company and its customers. IBM conferred the accolades and awards at its 2003 Corporate Technical Recognition Event (CTRE) in Scottsdale, Ariz. CTRE is a 40-year tradition at IBM, established to recognize exceptional technical employees and reward them for extraordinary achievements and contributions to the company's technology leadership. "Our technical employees are among the best and brightest innovators in the world. They share a passion for excellence that defines their work and permeates the products and services IBM delivers to its customers," said Nick Donofrio, senior vice president, technology and manufacturing for IBM. "CTRE provides the means for us to honor those who have distinguished themselves as exceptional leaders among their peers." Among the special honorees at the 2003 CTRE are five employees who earned the coveted distinction of IBM Fellow: - Grady Booch, chief scientist of Rational Software, IBM Software Group. Recognized internationally for his innovative work on software architecture, modeling, and software engineering process. Mr. Booch is one of the original authors of the Unified Modeling Language (UML), the industry-standard language of blueprints for software-intensive systems. - Dr. Donald Chamberlin, researcher, IBM Almaden Research Center. An expert in relational database languages, Dr. Chamberlin is co- inventor of SQL, the language that energized the relational database market. He has also influenced the creation of XQuery, one of a new generation of database query languages covering structured, semi-structured and unstructured data. - Dr. George Galambos, chief technology officer, IBM Global Services (IGS) in Canada; the first Fellow from Canada. Dr. Galambos specializes in high-performance, high availability designs, operational effectiveness, and risk assessment/mitigation, focusing on systems engineering and architecture reuse that enhances efficiency and stability. He is a principal driver of and contributor to the widely acclaimed "Patterns for e-business" and the Enterprise Solution Structure Reference Architectures, widely used by IGS in customer engagements. - Rod Smith, vice president of Internet emerging technologies, IBM Software Group. A leader in the areas of object-oriented programming, visual development tools, Java, XML, and Web Services. Rod also was the chief technical strategist for focusing the Java platform for use in middleware solutions, in particular initiating contributions to the development of the J2EE. - Charles Webb, eServer processor design, IBM Systems Group. Charles Webb has led the reinvention of IBM's eServer zSeries microprocessor designs and roadmap, including the z900 server, where he provided the bridge among architecture, hardware, compilers and system software, defining major portions of the 64- bit architecture and beyond. The title of IBM Fellow is the company's most preeminent technical distinction and is granted in recognition of outstanding and sustained technical achievements in engineering, programming, science and technology. Only 175 individuals have earned this designation in the company's history and, including the newly named Fellows, 56 are active employees. IBM Fellows are encouraged to further enhance their potential for creative achievements and typically work on special projects or research initiatives that lead the company in exciting new directions. uima-as-2.3.1/uimaj-as-activemq/src/test/resources/data/SeminarChallengesInSpeechRecognition.xml000066400000000000000000000050701160020716200330020ustar00rootroot00000000000000 UIT Seminar: Challenges in Speech Recognition 8 August 2003 UIT Seminar: Challenges in Speech Recognition August 8, 2003 10:30 AM - 11:30 AM Lawrence Rabiner , Associate Director CAIP, Rutgers University, Professor Univ. of Santa Barbara Yorktown 20-043 Availability: Open Speech recognition has matured to the point where it is now being widely applied in a range of applications including desktop dictation, cell phone name dialing, agent technology, automated operator services, telematics, call center automation and help desks. Although the technology is often good enough for many of these applications, there remain key challenges in virtually every aspect of speech recognition that prevent the technology from being used ubiquitously in any environment, for any speaker, and for an even broader range of applications. This talk will analyze the ‘Speech Circle’ that enables a person to maintain a dialog with a machine using speech recognition, spoken language understanding, dialog management and spoken language generation, and finally text-to-speech synthesis, and show where significant progress has been made, and where there remain critical problems that need to be addressed and solved. The talk will include several audio and video examples of speech recognition and speech understanding systems that have been studied in the laboratory to illustrate the challenges that remain to be solved before speech recognition is considered a solved problem. uima-as-2.3.1/uimaj-as-activemq/src/test/resources/data/TrainableInformationExtractionSystems.xml000066400000000000000000000053031160020716200333350ustar00rootroot00000000000000 Adventurous Research Summer Seminar Series - Trainable Information Extraction Systems 19 August 2003 Adventurous Research Summer Seminar Series - Trainable Information Extraction Systems August 19, 2003 02:00 PM - 03:30 PM David Johnson, Frank Oles, Tong Zhang(IBM Research) Hawthorne GN-F15 Availability: Open The technical objective of the TIES project is to build customizable systems that can identify named entities in text, such as persons, organizations, and locations, as well as identifying relations between those entities. The technical approach is to develop new statistical and symbolic machine learning algorithms in service of the technical objective. Also, we are working on combining statistical with symbolic techniques. The first part of this talk, given by David E. Johnson, will provide a general overview of the goals of the TIES project. The second part, given by Tong Zhang, will provide background on applying statistical machine learning to this problem domain. Tong will also describe the particular statistical approach taken, which is termed Robust Risk Minimization (RMM). The final part will be given by Frank J. Oles. Frank will introduce his theory of precedence-inclusion patterns. Precedence-inclusion patterns are mathematical structures possessing multiple interacting strict partial orders that satisfy axioms generalizing the familiar properties of irreflexivity and transitivity. This very general theory provides a radically new approach to symbolic, as opposed to statistical, pattern generalization that can be applied to relational learning in a number of settings, including learning based on text, on images, or on videos. uima-as-2.3.1/uimaj-as-activemq/src/test/resources/data/UIMASummerSchool2003.xml000066400000000000000000000073371160020716200272070ustar00rootroot00000000000000 UIMA Summer School 1 August 2003 August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH uima-as-2.3.1/uimaj-as-activemq/src/test/resources/data/UIMA_Seminars.xml000066400000000000000000000036131160020716200261730ustar00rootroot00000000000000 Upcoming UIMA Seminars 15 March 2004 April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. uima-as-2.3.1/uimaj-as-activemq/src/test/resources/data/WatsonConferenceRooms.xml000066400000000000000000000050401160020716200300560ustar00rootroot00000000000000 Conference Rooms at Watson 01 January 2000 Conference Rooms at Watson: Location Capacity Wall Phone Ext. Classroom Style HAW J2-B34 Seats 12 tieline 863-3130 HAW J2-N07 Seats 24 tieline 863-3210 YKT 20-001 Seats 36 tieline 862-4304 YKT 20-051 Seats 18 tieline 862-4307 Conference Style HAW 2N-F28 Seats 20 tieline 863-7583 HAW 4N-B15 Seats 14 tieline 863-7126 HAW 4N-B17 Seats 10 tieline 863-7089 HAW 4S-K21 Seats 16 tieline 863-6386 HAW GN-F14 Seats 12 tieline 863-6770 HAW GN-K30 Seats 12 tieline 863-7335 HAW GN-K36 Seats 10 tieline 863-6098 HAW J1-N14 Seats 24 tieline 863-3629 HAW J2-A16 Seats 12 tieline 863-3240 HAW J2-G27 Seats 15 tieline 863-3150 HAW J2-M24 Seats 8 tieline 863-3160 YKT 03-135 Seats 8 tieline 862-1696 YKT 03-235 Seats 8 tieline 862-4278 YKT 05-135 Seats 8 tieline 862-3477 YKT 05-235 Seats 8 tieline 862-4279 YKT 20-006 Seats 8 tieline 862-4301 YKT 20-059 Seats 20 tieline 862-4308 YKT 35-132 Seats 8 tieline 862-2873 YKT 35-232 Seats 8 tieline 862-2860 YKT 38-023 Seats 8 tieline 862-3299 YKT 39-132 Seats 8 tieline 862-3486 YKT 40-100 Seats 20 tieline 862-4199 YKT 40-200 Seats 20 tieline 862-1379 Other HAW GN-K35 Seats 24 tieline 863-6104 Theater Style HAW 1S-F40 Seats 30 tieline 863-6396 YKT 20-043 Seats 50 tieline 862-4306 Video Conference Room YKT 32-026 Seats 25 tieline 862-3917 uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/000077500000000000000000000000001160020716200243215ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_AggregateAnnotator.xml000066400000000000000000000046031160020716200321360ustar00rootroot00000000000000 Top Level TAE Deploy_AggregateAnnotatorOnSecondaryBroker.xml000066400000000000000000000045501160020716200353720ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorTerminateOnDelegateBadBrokerURL.xml000066400000000000000000000046041160020716200400200ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorUsingPlaceholder.xml000066400000000000000000000045371160020716200352360ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWith1MillionDocs.xml000066400000000000000000000047121160020716200351320ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithDelegateFailure.xml000066400000000000000000000045451160020716200356630ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithDelegateTimeoutAndContinueOnError.xml000066400000000000000000000056601160020716200413600ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithFlowControllerExceptionOnInit.xml000066400000000000000000000046111160020716200406060ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithHttpDelegate.xml000066400000000000000000000046151160020716200352110ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithHttpDelegateNoRetries.xml000066400000000000000000000046021160020716200370400ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithInternalCM1000Docs.xml000066400000000000000000000046271160020716200357500ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithLongDelay.xml000066400000000000000000000055221160020716200345130ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithLongDelayDelegate.xml000066400000000000000000000047511160020716200361510ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithProcessParentLastCMs.xml000066400000000000000000000044771160020716200366640ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithSlowParallelDelegates.xml000066400000000000000000000102711160020716200370510ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateAnnotatorWithThresholdWindow.xml000066400000000000000000000105701160020716200357600ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateCMWithFailedCollocatedDelegate.xml000066400000000000000000000035031160020716200357750ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateCMWithFailedRemoteDelegate.xml000066400000000000000000000045771160020716200351730ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateCMWithRemoteCMAndFailedRemoteDelegate.xml000066400000000000000000000052611160020716200372010ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateErrorHandlingWithMultiplierAndFaultyDelegate.xml000066400000000000000000000045071160020716200410210ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateErrorHandlingWithMultiplierAndNestedAggregateDelegateWithMultiplier.xml000066400000000000000000000051441160020716200455070ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_AggregateMultiplier.xml000066400000000000000000000050331160020716200323150ustar00rootroot00000000000000 Top Level TAE Deploy_AggregateMultiplierWithDelay.xml000066400000000000000000000054001160020716200340470ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_AggregateToTestTSMerge.xml000066400000000000000000000072011160020716200326370ustar00rootroot00000000000000 Top Level TAE Deploy_AggregateUsingRemoteTempQueue.xml000066400000000000000000000045761160020716200342170ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_AggregateWith2Multipliers.xml000066400000000000000000000110121160020716200334100ustar00rootroot00000000000000 Top Level TAE Deploy_AggregateWith2RemoteMultipliers.xml000066400000000000000000000111541160020716200345140ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithCollocatedMerger.xml000066400000000000000000000057231160020716200341650ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithContinueOnRetryFailures.xml000066400000000000000000000107761160020716200355600ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Deploy_AggregateWithContinueOnRetryFailures 1.0 Deploy_AggregateWithFailedRemoteDelegate.xml000066400000000000000000000045671160020716200347520ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithFailingCollocatedDelegate.xml000066400000000000000000000035071160020716200357460ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithFlowControllerExceptionOnDisable.xml000066400000000000000000000046621160020716200373660ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithFlowControllerExceptionOnInitialization.xml000066400000000000000000000046531160020716200410120ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithFlowControllerExceptionOnNextStep.xml000066400000000000000000000040211160020716200375620ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithHttpAnnotatorNoRetries.xml000066400000000000000000000046151160020716200354110ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithHttpDelegateNoRetries.xml000066400000000000000000000046151160020716200351560ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithInnerAggregateCM.xml000066400000000000000000000046361160020716200340560ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithInternalCM10Docs.xml000066400000000000000000000036421160020716200337160ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Aggregate TAE Delegate With 10 Doc Cas Multiplier uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_AggregateWithLastCM.xml000066400000000000000000000051241160020716200321470ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_AggregateWithMergedTypes.xml000066400000000000000000000064661160020716200332660ustar00rootroot00000000000000 Top Level TAE Deploy_AggregateWithMultiplierAndNestedAggregateDelegateWithMultiplier.xml000066400000000000000000000040671160020716200430330ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_AggregateWithParallelFlow.xml000066400000000000000000000057241160020716200334160ustar00rootroot00000000000000 Top Level TAE Deploy_AggregateWithParallelFlowDisableOnDelegateFailure.xml000066400000000000000000000070271160020716200400610ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithParallelFlowTerminateOnDelegateFailure.xml000066400000000000000000000056371160020716200404530ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_AggregateWithParallelFlows.xml000066400000000000000000000101351160020716200335710ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_AggregateWithRemoteMerger.xml000066400000000000000000000051411160020716200334200ustar00rootroot00000000000000 Top Level TAE Deploy_AggregateWithRemoteMultiplier.xml000066400000000000000000000050351160020716200342500ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_AggregateWithRemoteNoOpOnBroker8200.xml000066400000000000000000000045761160020716200347620ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_CMAggregateWithCollocated1MillionDocsCM.xml000066400000000000000000000063311160020716200356750ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_CMAggregateWithCollocatedCM.xml000066400000000000000000000064301160020716200335360ustar00rootroot00000000000000 Top Level TAE Deploy_CMAggregateWithRemote1MillionDocsCM.xml000066400000000000000000000064671160020716200350710ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_CasMultiplierAggregateWith2InnerMultipliers.xml000066400000000000000000000064741160020716200370430ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_CasMultiplierAggregateWith2Multipliers.xml000066400000000000000000000110151160020716200360320ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_CasMultiplierAggregateWithRemoteCasMultiplier.xml000066400000000000000000000076661160020716200374110ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_ComplexAggregate.xml000066400000000000000000000050251160020716200315770ustar00rootroot00000000000000 Top Level TAE Deploy_ComplexAggregateWith1MillionDocs.xml000066400000000000000000000050641160020716200345750ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_ComplexAggregateWithFailingInnerAggregateCM.xml000066400000000000000000000050671160020716200366770ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_ComplexAggregateWithInnerAggregateCM.xml000066400000000000000000000046501160020716200354020ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_ComplexAggregateWithRemoteAggregateDelegate.xml000066400000000000000000000040211160020716200367650ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_EmailRecognizer.xml000066400000000000000000000037661160020716200314520ustar00rootroot00000000000000 Email Recognizer Annotator Deploys the Email Recognizer Annotator Primitive AE Deploy_GovernmentOfficialRecognizer.xml000066400000000000000000000040371160020716200341150ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Government Official Recognizer Annotator Deploys the Government official Recognizer Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_MeetingDetectorAggregate.xml000066400000000000000000000037471160020716200332630ustar00rootroot00000000000000 Room Number Annotator Deploys Meeting Detector Aggregate Annotator Primitive AE Deploy_MeetingDetectorTAEWithCM_RemoteRoomNumberDisable.xml000066400000000000000000000050751160020716200376040ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Meeting Detector TAE Deploys Meeting Detector Aggregate AE that uses remotely deployed RoomNumberAnnotator. Deploy_MeetingDetectorTAE_RemoteRoomNumber.xml000066400000000000000000000046351160020716200352450ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Meeting Detector TAE Deploys Meeting Detector Aggregate AE that uses remotely deployed RoomNumberAnnotator. Deploy_MeetingDetectorTAE_RemoteRoomNumberDisable.xml000066400000000000000000000046541160020716200365320ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Meeting Detector TAE Deploys Meeting Detector Aggregate AE that uses remotely deployed RoomNumberAnnotator. Deploy_NamesAndPersonTitlesRecognizer.xml000066400000000000000000000040261160020716200343740ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Names and Person Title Recognizer Annotator Deploys the Names and Person Title Recognizer Annotator Primitive AE Deploy_NewRemoteTestMultiplierWithEH.xml000066400000000000000000000033461160020716200341730ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Simple Cas Multiplier Deploys the Simple Cas Multiplier uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotator.xml000066400000000000000000000037121160020716200311230ustar00rootroot00000000000000 NoOp Annotator Deploys the NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotator2.xml000066400000000000000000000037171160020716200312120ustar00rootroot00000000000000 NoOp Annotator2 Deploys the NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotator3.xml000066400000000000000000000037161160020716200312120ustar00rootroot00000000000000 NoOp Annotator3 Deploys the NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotator4.xml000066400000000000000000000037161160020716200312130ustar00rootroot00000000000000 NoOp Annotator3 Deploys the NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotatorAWithLongDelay.xml000066400000000000000000000037221160020716200336600ustar00rootroot00000000000000 NoOp Annotator A Deploys NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotatorBWithLongDelay.xml000066400000000000000000000037221160020716200336610ustar00rootroot00000000000000 NoOp Annotator B Deploys NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotatorCWithLongDelay.xml000066400000000000000000000037221160020716200336620ustar00rootroot00000000000000 NoOp Annotator C Deploys NoOp Annotator Primitive AE Deploy_NoOpAnnotatorTerminatingOn2Errors.xml000066400000000000000000000037161160020716200350260ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment NoOp Annotator Deploys NoOp Annotator Primitive AE Deploy_NoOpAnnotatorUsingPlaceholder.xml000066400000000000000000000037041160020716200342160ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment NoOp Annotator Deploys the NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotatorWithCpCDelay.xml000066400000000000000000000037261160020716200333310ustar00rootroot00000000000000 NoOp Annotator Deploys the NoOp Annotator Primitive AE Deploy_NoOpAnnotatorWithCpCException.xml000066400000000000000000000037311160020716200341460ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment NoOp Annotator Deploys the NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotatorWithDelay.xml000066400000000000000000000037211160020716200327360ustar00rootroot00000000000000 NoOp Annotator Deploys NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotatorWithException.xml000066400000000000000000000037251160020716200336420ustar00rootroot00000000000000 NoOp Annotator Deploys NoOp Annotator Primitive AE Deploy_NoOpAnnotatorWithExceptionOn5thCAS.xml000066400000000000000000000037371160020716200350330ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment NoOp Annotator Deploys NoOp Annotator Primitive AE Deploy_NoOpAnnotatorWithInitException.xml000066400000000000000000000037271160020716200344110ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment NoOp Annotator Deploys NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_NoOpAnnotatorWithLongDelay.xml000066400000000000000000000037361160020716200335640ustar00rootroot00000000000000 NoOp Annotator Deploys NoOp Annotator Primitive AE Deploy_NoOpAnnotatorWithPlaceholder.xml000066400000000000000000000037031160020716200340430ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment NoOp Annotator Deploys the NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_PersonTitleAnnotator.xml000066400000000000000000000037431160020716200325240ustar00rootroot00000000000000 Room Number Annotator Deploys Person Title Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_RemoteCasMerger.xml000066400000000000000000000033351160020716200314070ustar00rootroot00000000000000 Simple Cas Multiplier Deploys the Simple Cas Merger uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_RemoteCasMultiplier.xml000066400000000000000000000033721160020716200323150ustar00rootroot00000000000000 Simple Cas Multiplier Deploys the Simple Cas Multiplier Deploy_RemoteCasMultiplierWith10Docs_1.xml000066400000000000000000000033731160020716200342650ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Simple Cas Multiplier #1 Deploys the First Simple Cas Multiplier Deploy_RemoteCasMultiplierWith10Docs_2.xml000066400000000000000000000033761160020716200342710ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Simple Cas Multiplier #2 Deploys the Second Simple Cas Multiplier Deploy_RemoteCasMultiplierWith1MillionDocs.xml000066400000000000000000000033661160020716200353130ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Simple Cas Multiplier Deploys the Simple Cas Multiplier uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_RoomNumberAnnotator.xml000066400000000000000000000032001160020716200323250ustar00rootroot00000000000000 Room Number Annotator Deploys the Room Number Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_ScaledPersonTitleAnnotator.xml000066400000000000000000000040321160020716200336300ustar00rootroot00000000000000 Room Number Annotator Deploys Person Title Annotator Primitive AE Deploy_ScaledPrimitiveAggregateAnnotator.xml000066400000000000000000000032761160020716200350710ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_SimpleAnnotator.xml000066400000000000000000000037211160020716200315010ustar00rootroot00000000000000 Simple Annotator Deploys the Simple Annotator Primitive AE Deploy_SingleInstancePersonTitleAnnotator.xml000066400000000000000000000037611160020716200352740ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Room Number Annotator Deploys Person Title Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_SlowNoOpAnnotator1.xml000066400000000000000000000037341160020716200320550ustar00rootroot00000000000000 NoOp Annotator Deploys the NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_SlowNoOpAnnotator2.xml000066400000000000000000000037341160020716200320560ustar00rootroot00000000000000 NoOp Annotator Deploys the NoOp Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_SyncAggregateWithJmsService.xml000066400000000000000000000033621160020716200337350ustar00rootroot00000000000000 Top Level TAE Deploy_SyncAggregateWithJmsServiceAndScaleoutOverride.xml000066400000000000000000000033751160020716200375050ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_SyncAggregateWithJmsServiceLongDelay.xml000066400000000000000000000033731160020716200354570ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE Deploy_SyncAggregateWithJmsServiceUsingPlaceholder.xml000066400000000000000000000034021160020716200370220ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_TokenSentenceRecognizer.xml000066400000000000000000000036421160020716200331610ustar00rootroot00000000000000 Simple Token and Sentence Annotator Deploys the Simple Token and Sentence Annotator Primitive AE Deploy_TopAggregateWithInnerAggregateCM.xml000066400000000000000000000061021160020716200345270ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_TopLevelBlueJAggregateCM.xml000066400000000000000000000124101160020716200330600ustar00rootroot00000000000000 Top Level TAE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_WriterAnnotatorA.xml000066400000000000000000000037361160020716200316330ustar00rootroot00000000000000 Deploy_WriterAnnotatorA 1.0 uima-as-2.3.1/uimaj-as-activemq/src/test/resources/deployment/Deploy_WriterAnnotatorB.xml000066400000000000000000000040011160020716200316160ustar00rootroot00000000000000 Writer Annotator Deploys the Writer Annotator Primitive AE uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/000077500000000000000000000000001160020716200245025ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/000077500000000000000000000000001160020716200276525ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/BlueJNoOpCC.xml000066400000000000000000000037461160020716200324110ustar00rootroot00000000000000 org.apache.uima.java org.apache.uima.ae.noop.NoOpCC BlueJ NoOp CC Cas Consumer That Does Nothing 1.0 The Apache Software Foundation false true false BlueJNoOpCandidateAnswer.xml000066400000000000000000000056071160020716200350770ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator BlueJ NoOp Candidate Answer Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 0 ProcessDelay 0 true true false CasMultiplierAggregateWith2Multipliers.xml000066400000000000000000000074331160020716200400600ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing NumberToGenerate Approximate number of CASes to create. Integer false true BlueJTestMultiplier1/NumberToGenerate BlueJTestMultiplier2/NumberToGenerate NumberToGenerate 3 BlueJTestMultiplier1 BlueJTestMultiplier2 BlueJInnerRemoteCMAggregate BlueJNoOpCandidateAnswerCM BlueJNoOpCC en true true true CheckTextAnnotator.xml000066400000000000000000000066261160020716200340770ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.CheckTextAnnotator CheckTextAnnotator Checks for correct sofa data or a SourceDocumentInformation annotation 1.0 The Apache Software Foundation CheckInterval Interval at which to check CAS contents Integer false true FinalCount Total number of CASes expected Integer false true TextPrefix Text that must start document text in every N-th CAS String false true CheckInterval 0 FinalCount 0 TextPrefix true true false ComplexAggregateTAEWith2InternalCM.xml000066400000000000000000000051471160020716200367270ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Top Level Aggregate TAE Detects Meetings and Room Numbers TestMultiplier NestedAggregateWithInternalCM NoOp en true true false ComplexAggregateTAEWith2InternalCMWithBadDelegate.xml000066400000000000000000000051651160020716200416250ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Top Level Aggregate TAE Detects Meetings and Room Numbers TestMultiplier NestedAggregateWithInternalCM NoOp en true true false ComplexAggregateWith1MillionDocsCasMultiplier_TAE.xml000066400000000000000000000054571160020716200420070ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Meetings and Room Numbers TestMultiplier MeetingDetector org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false ComplexAggregateWithFailingInnerAggregateCM.xml000066400000000000000000000055121160020716200407070ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Complex Top Level Aggregate TAE Detects Meetings and Room Numbers TopLevelTestMultiplier FailingAggregateCM org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false ComplexAggregateWithInnerAggregateCM.xml000066400000000000000000000054551160020716200374230ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Complex Top Level Aggregate TAE Detects Meetings and Room Numbers TestMultiplier MeetingDetectorAggregate org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false ComplexAggregate_TAE.xml000066400000000000000000000054721160020716200342340ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Meetings and Room Numbers TestMultiplier MeetingDetector org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false ComplexNestedAggregate_TAE.xml000066400000000000000000000054271160020716200353770ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Top Level Aggregate TAE Detects Meetings and Room Numbers TestMultiplier MeetingDetector org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false GovernmentOfficialRecognizer_RegEx_TAE.xml000066400000000000000000000142411160020716200377130ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.examples.cas.RegExAnnotator Government Title Recognizer using Regular Expressions Detects Government Titles using regular expressions. Patterns Regular expression patterns to match. The language is that supported by Java 1.4. String true false TypeNames Names of CAS Types to create for the patterns found. The indexes of this array correspond to the indexes of the Patterns or PatternFiles arrays. If a match is found for Patterns[i], it will result in an annotation of type TypeNames[i]. String true false ContainingAnnotationTypes Names of CAS Input Types within which annotations should be created. String true false AnnotateEntireContainingAnnotation When the ContainingAnnoationTypes parameter is specified, a value of true for this parameter will cause the entire containing annotation to be used as the span of the new annotation, rather than just the span of the regular expression match. This can be used to "classify" previously created annotations according to whether or not they contain text matching a regular expression. Boolean false false ContainingAnnotationTypes example.Name AnnotateEntireContainingAnnotation true example.Name A proper name. uima.tcas.Annotation example.GovernmentOfficial A government official. uima.tcas.Annotation example.Name example.GovernmentOfficial en true true false PatternFile An optional external file containing regular expressions to match. File format is as follows: - Lines starting with # or whitepsace are ignored - Lines starting with % indicate an annotation type. - All other lines are regular expressions. The languages is that supported by Java 1.4. If a regular expression is matched, it will be annotated with the last annotation type declared (the nearest preceding line starting with %). true GovernmentTitlePatterns File containing Regular Expressions for the CAS type example.GovernmentOfficial. file:GovernmentTitlePatterns.dat PatternFile GovernmentTitlePatterns NamesAndPersonTitles_TAE.xml000066400000000000000000000053741160020716200350610ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Aggregate TAE - Name Recognizer and Person Title Annotator Detects Names and Person Titles NameRecognizer PersonTitleAnnotator example.PersonTitle en example.Name x-unspecified true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/NoOpAnnotator.xml000066400000000000000000000055371160020716200331470ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOpAnnotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 0 ProcessDelay 0 true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/NoOpAnnotator2.xml000066400000000000000000000055751160020716200332330ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator2 Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 0 ProcessDelay 0 true true false NoOpAnnotatorExpecting1000Cases.xml000066400000000000000000000065041160020716200362120ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true FinalCount Total number of CASes that should be processed before CPC Integer false false ErrorFrequency 0 ProcessDelay 0 FinalCount 1000 true true false NoOpAnnotatorWith2SecDelay.xml000066400000000000000000000056241160020716200354150ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator With 2Sec Delay Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 0 ProcessDelay 200000000 true true false NoOpAnnotatorWith5SecDelay.xml000066400000000000000000000056241160020716200354200ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator With 5Sec Delay Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 0 ProcessDelay 500000000 true true false NoOpAnnotatorWithCpCException.xml000066400000000000000000000064051160020716200361640ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOpAnnotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true FinalCount FinalCount Integer false true ErrorFrequency 0 ProcessDelay 0 FinalCount 10 true true false NoOpAnnotatorWithCpcCheck.xml000066400000000000000000000063171160020716200353050ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true FinalCount Total number of CASes that should be processed before CPC Integer false false ErrorFrequency 0 ProcessDelay 0 FinalCount 0 true true false NoOpAnnotatorWithCpcDelay.xml000066400000000000000000000063061160020716200353240ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true CpCDelay CpC Delay Integer false true FinalCount Total number of CASes that should be processed before CPC Integer false false ErrorFrequency 0 CpCDelay 5000 FinalCount 0 true true false NoOpAnnotatorWithDelay.xml000066400000000000000000000055761160020716200347060ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 0 ProcessDelay 400 true true false NoOpAnnotatorWithException.xml000066400000000000000000000055561160020716200356040ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOpAnnotatorWithException Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 1 ProcessDelay 0 true true false NoOpAnnotatorWithExceptionOn2ndCas.xml000066400000000000000000000055721160020716200371320ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 2 ProcessDelay 0 true true false NoOpAnnotatorWithExceptionOn5thCAS.xml000066400000000000000000000055761160020716200370530ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 5 ProcessDelay 0 true true false NoOpAnnotatorWithInitFailure.xml000066400000000000000000000064521160020716200360550ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOpAnnotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true FailDuringInitialization Causes Failure During Initialization Integer false true ErrorFrequency 0 ProcessDelay 0 FailDuringInitialization 0 true true false NoOpAnnotatorWithLongDelay.xml000066400000000000000000000055771160020716200355270ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.ae.noop.NoOpAnnotator NoOp Annotator Annotator That Does Nothin 1.0 The Apache Software Foundation ErrorFrequency Frequency of Generated Errors Integer false true ProcessDelay Process Delay Integer false true ErrorFrequency 0 ProcessDelay 6000 true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/NoOpJmsService.xml000066400000000000000000000024301160020716200332410ustar00rootroot00000000000000 org.apache.uima.aae.jms_adapter.JmsAnalysisEngineServiceAdapter NoOpJmsServiceLongDelay.xml000066400000000000000000000024411160020716200347630ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.aae.jms_adapter.JmsAnalysisEngineServiceAdapter NoOpJmsServiceWithPlaceholder.xml000066400000000000000000000024301160020716200361610ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.aae.jms_adapter.JmsAnalysisEngineServiceAdapter PersonTitleAnnotator.xml000066400000000000000000000146301160020716200344570ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.examples.cas.PersonTitleAnnotator Person Title Annotator An example annotator that discovers Person Titles in text and classifies them into three categories - Civilian (e.g. Mr.,Ms.), Military (e.g. Lt. Col.) , and Government (e.g. Gov., Sen.). This annotator can be configured to only look for titles within existing annotations of a particular type (for example, Person Name annotations). 1.0 The Apache Software Foundation CivilianTitles List of Civilian Titles to be annotated. String true true MilitaryTitles List of Military Titles to be annotated. String true true GovernmentTitles List of Government Titles to be annotated. String true true ContainingAnnotationType Annotation type within which to search for Person Titles. If no value is specified, the entire document will be searched. String false false CivilianTitles Mr. Ms. Mrs. Dr. MilitaryTitles Gen. Col. Maj. Capt. Lt. Gen. Lt Col. Lt. GovernmentTitles Vice President President Vice Pres. Pres. Governor Lt. Governor Gov. Lt. Gov. Senator Sen. example.PersonTitle A Personal Title. uima.tcas.Annotation Kind The kind of title - Civilian, Military, or Government. example.PersonTitleKind example.PersonTitleKind A kind of person title - Civilian, Military, or Government. uima.cas.String Civilian Title of a person not in military or government service. Military Title of a person in the military. Government Title of a government official. example.PersonTitle example.PersonTitle:Kind en true true false PersonTitleAnnotator_WithinNamesOnly.xml000066400000000000000000000152151160020716200376270ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.examples.cas.PersonTitleAnnotator Person Title Annotator - Within Names only A configuration of the PersonTitleAnnotator that looks for Person Titles only within existing Name annotations. See also PersonTitleAnnotator.xml. 1.0 The Apache Software Foundation CivilianTitles List of Civilian Titles to be annotated. String true true MilitaryTitles List of Military Titles to be annotated. String true true GovernmentTitles List of Government Titles to be annotated. String true true ContainingAnnotationType Annotation type within which to search for Person Titles. If no value is specified, the entire document will be searched. String false false CivilianTitles Mr. Ms. Mrs. Dr. MilitaryTitles Gen. Col. Maj. Capt. Lt. Gen. Lt Col. Lt. GovernmentTitles Vice President President Vice Pres. Pres. Governor Lt. Governor Gov. Lt. Gov. Senator Sen. ContainingAnnotationType example.Name example.PersonTitle A Personal Title. uima.tcas.Annotation Kind The kind of title - Civilian, Military, or Government. example.PersonTitleKind example.PersonTitleKind A kind of person title - Civilian, Military, or Government. uima.cas.String Civilian Title of a person not in military or government service. Military Title of a person in the military. Government Title of a government official. example.Name A proper name. uima.tcas.Annotation example.Name example.PersonTitle example.PersonTitle:Kind en true true false SecondLevelAggregate.xml000066400000000000000000000046351160020716200343370ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Second Level Aggregate TAE Detects Nothing TestMultiplier ThirdLevelAggregateCM en true true true uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/SimpleAnnotator.xml000066400000000000000000000050021160020716200335100ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.noop.SimpleAnnotator SimpleAnnotator Annotator That Creates One Annotation 1.0 The Apache Software Foundation ProcessDelay Process Delay Integer false true ProcessDelay 1000 true true false SimpleNameRecognizer_RegEx_TAE.xml000066400000000000000000000107731160020716200361720ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.examples.cas.RegExAnnotator Simple Name Recognizer using Regular Expressions Detects Names using a simple regular expression. Patterns Regular expression patterns to match. The language is that supported by Java 1.4. String true false TypeNames Names of CAS Types to create for the patterns found. The indexes of this array correspond to the indexes of the Patterns or PatternFiles arrays. If a match is found for Patterns[i], it will result in an annotation of type TypeNames[i]. String true false ContainingAnnotationTypes Names of CAS Input Types within which annotations should be created. String true false AnnotateEntireContainingAnnotation When the ContainingAnnoationTypes parameter is specified, a value of true for this parameter will cause the entire containing annotation to be used as the span of the new annotation, rather than just the span of the regular expression match. This can be used to "classify" previously created annotations according to whether or not they contain text matching a regular expression. Boolean false false Patterns \p{Upper}\w*(\.?\s\p{Upper}\w*)+ TypeNames example.Name example.Name A proper name. uima.tcas.Annotation example.Name true true false SimpleTestAggregate.xml000066400000000000000000000045551160020716200342260ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true false SimpleTestAggregateCMWithFailedDelegate.xml000066400000000000000000000050541160020716200400350ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp NoOp2 en true true true SimpleTestAggregateCMWithRemoteCMAndFailedDelegate.xml000066400000000000000000000053531160020716200420560ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier RemoteTestMultiplier NoOp NoOp2 en true true true SimpleTestAggregateCasMultiplier.xml000066400000000000000000000045541160020716200367230ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true true SimpleTestAggregateCasMultiplierWithDelay.xml000066400000000000000000000045711160020716200405350ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true true SimpleTestAggregateWith1000DocCM.xml000066400000000000000000000046011160020716200362210ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true false SimpleTestAggregateWith100DocCM.xml000066400000000000000000000157551160020716200361550ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing ErrorFrequency Frequency of Generated Errors Integer false true NoOp/ErrorFrequency NoOp2/ErrorFrequency NumberToGenerate Approximate number of CASes to create. Integer false true SimpleCasGenerator/NumberToGenerate FinalCount Total number of CASes that should be processed before CPC Integer false false NoOpAnnotatorWithCpcCheck/FinalCount Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure String true FlowController/AllowContinueOnFailure AllowDropOnFailure String true FlowController/AllowDropOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false FlowController/ExceptionsToIgnore ErrorFrequency 10 NumberToGenerate 100 FinalCount 91 Flow SimpleCasGenerator NoOp,NoOp2 NoOpAnnotatorWithCpcCheck AllowDropOnFailure NoOp NoOp2 ExceptionsToIgnore java.lang.IndexOutOfBoundsException SimpleCasGenerator NoOp NoOpAnnotatorWithCpcCheck en true true false SimpleTestAggregateWith1MillionDocs.xml000066400000000000000000000045771160020716200373040ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true false SimpleTestAggregateWith2Multipliers.xml000066400000000000000000000066301160020716200373720ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing NumberToGenerate Approximate number of CASes to create. Integer false true TestMultiplier/NumberToGenerate SimpleCasGenerator/NumberToGenerate NumberToGenerate 3 TestMultiplier NoOp SimpleCasGenerator NoOpAnnotator2 en true true false SimpleTestAggregateWith2RemoteMultipliers.xml000066400000000000000000000066311160020716200405470ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing NumberToGenerate Approximate number of CASes to create. Integer false true TestMultiplier/NumberToGenerate SimpleCasGenerator/NumberToGenerate NumberToGenerate 10 TestMultiplier SimpleCasGenerator NoOp NoOpAnnotator2 en true true false SimpleTestAggregateWith3DocCM.xml000066400000000000000000000070371160020716200360110ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE with 3 Doc Cas Multiplier Detects Nothing ErrorFrequency Frequency of Generated Errors Integer false true NoOp/ErrorFrequency NumberToGenerate Approximate number of CASes to create. Integer false true SimpleCasGenerator/NumberToGenerate ErrorFrequency 0 NumberToGenerate 3 SimpleCasGenerator NoOp2 en true true false SimpleTestAggregateWith3DocCMAndBadDelegate.xml000066400000000000000000000070641160020716200404760ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE with 3 Doc Cas Multiplier Detects Nothing ErrorFrequency Frequency of Generated Errors Integer false true NoOp/ErrorFrequency NumberToGenerate Approximate number of CASes to create. Integer false true SimpleCasGenerator/NumberToGenerate ErrorFrequency 0 NumberToGenerate 3 SimpleCasGenerator NoOp2 en true true false SimpleTestAggregateWithCasMerger.xml000066400000000000000000000107051160020716200366450ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing NumberToGenerate Approximate number of CASes to create. Integer false true TestMultiplier/NumberToGenerate CheckTextAnnotator/FinalCount NumberToMerge Number of input CASes required for each output CAS. Integer false true TestMerger/NumberToMerge CheckTextAnnotator/CheckInterval TextPrefix Text that must start document text in every N-th CAS String false true CheckTextAnnotator/TextPrefix TestMerger/AnnotatorName NumberToGenerate 100 NumberToMerge 5 TextPrefix CasMerger TestMultiplier TestMerger CheckTextAnnotator en true true false SimpleTestAggregateWithCollocatedCMAndFaultyDelegate.xml000066400000000000000000000046711160020716200425360ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Top Level Aggregate TAE Detects Meetings and Room Numbers TestMultiplier NoOp en true true false SimpleTestAggregateWithDelegateTimeoutAndContinueOnError.xml000066400000000000000000000127571160020716200435260ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which continuing on failure should be allowed. String true false FlowController/AllowContinueOnFailure AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which continuing on failure should be allowed. String true false FlowController/AllowContinueOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false FlowController/ExceptionsToIgnore Flow NoOpWithLongDelay NoOp AllowContinueOnFailure NoOpWithLongDelay ExceptionsToIgnore org.apache.uima.aae.error.MessageTimeoutException org.apache.uima.aae.error.ForcedMessageTimeoutException NoOpWithLongDelay NoOp en true true false SimpleTestAggregateWithFailedDelegate.xml000066400000000000000000000050301160020716200376070ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp NoOp2 en true true false SimpleTestAggregateWithFailingCollocatedComponent.xml000066400000000000000000000046001160020716200422200ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true false SimpleTestAggregateWithFailingDelegateOn5thCAS.xml000066400000000000000000000100421160020716200412400ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow String true true AdvancedFixedFlowController/Flow AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. String true false AdvancedFixedFlowController/AllowContinueOnFailure Flow TestMultiplier NoOp NoOp2 AllowContinueOnFailure NoOp TestMultiplier NoOp NoOp2 en true true false SimpleTestAggregateWithFlowControllerExceptionOnDisableDelegate.xml000066400000000000000000000100531160020716200450370ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure String true FlowController/AllowContinueOnFailure Flow TestMultiplier NoOp AllowContinueOnFailure TestMultiplier NoOp TestMultiplier NoOp en true true false SimpleTestAggregateWithFlowControllerExceptionOnInitialization.xml000066400000000000000000000122111160020716200450260ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true BuggyAdvancedFixedFlowController/Flow AllowContinueOnFailure String true false BuggyAdvancedFixedFlowController/AllowContinueOnFailure ActionAfterCasMultiplier The action to be taken after a CAS has been input to a CAS Multiplier and the CAS Multiplier has finished processing it. Valid values are: continue - the CAS continues on to the next element in the flow stop - the CAS will no longer continue in the flow, and will be returned from the aggregate if possible. drop - the CAS will no longer continue in the flow, and will be dropped (not returned from the aggregate) if possible. dropIfNewCasProduced (the default) - if the CAS multiplier produced a new CAS as a result of processing this CAS, then this CAS will be dropped. If not, then this CAS will continue. String false false BuggyAdvancedFixedFlowController/ActionAfterCasMultiplier Flow TestMultiplier NoOp AllowContinueOnFailure TestMultiplier ActionAfterCasMultiplier invalid TestMultiplier NoOp en true true false SimpleTestAggregateWithFlowControllerExceptionOnInitialize.xml000066400000000000000000000050141160020716200441430ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true false SimpleTestAggregateWithFlowControllerExceptionOnNextStep.xml000066400000000000000000000077661160020716200436340ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure String true FlowController/AllowContinueOnFailure Flow TestMultiplier NoOp AllowContinueOnFailure TestMultiplier TestMultiplier NoOp en true true false SimpleTestAggregateWithJmsService.xml000066400000000000000000000045621160020716200370530ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true false SimpleTestAggregateWithJmsServiceAndOverride.xml000066400000000000000000000046251160020716200411760ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier PersonTitle en true true false SimpleTestAggregateWithJmsServiceLongDelay.xml000066400000000000000000000045731160020716200406540ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true false SimpleTestAggregateWithJmsServiceUsingPlaceholder.xml000066400000000000000000000046011160020716200422160ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp en true true false SimpleTestAggregateWithLastCasMultiplier.xml000066400000000000000000000045721160020716200404030ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing NoOp TestMultiplier en true true false SimpleTestAggregateWithLongDelay.xml000066400000000000000000000053271160020716200366570ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing NoOpA NoOpB NoOpC en true true false SimpleTestAggregateWithLongDelayDelegate.xml000066400000000000000000000057511160020716200403130ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing NumberToGenerate Approximate number of CASes to create. Integer false true TestMultiplier/NumberToGenerate NumberToGenerate 2 TestMultiplier NoOp en true true false SimpleTestAggregateWithMergedTypes.xml000066400000000000000000000046221160020716200372260ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier SimpleAnnotator en true true true SimpleTestAggregateWithParallelFlow.xml000066400000000000000000000116561160020716200373670ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure String true FlowController/AllowContinueOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false FlowController/ExceptionsToIgnore Flow TestMultiplier NoOp1,NoOp2 AllowContinueOnFailure TestMultiplier NoOp1 ExceptionsToIgnore java.lang.IndexOutOfBoundsException org.apache.uima.aae.error.MessageTimeoutException TestMultiplier NoOp1 en true true false SimpleTestAggregateWithParallelFlowCheck.xml000066400000000000000000000124561160020716200403240ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false AggregateWithParallelFlowCheck Tests that when part of a parallel fails other runs OK. Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which continuing on failure should be allowed. String true false FlowController/AllowContinueOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false FlowController/ExceptionsToIgnore Flow TestMultiplier NoOp1,NoOp2 CheckTextAnnotator AllowContinueOnFailure TestMultiplier NoOp1 ExceptionsToIgnore java.lang.IndexOutOfBoundsException org.apache.uima.aae.error.MessageTimeoutException TestMultiplier NoOp1 CheckTextAnnotator en true true false SimpleTestAggregateWithParallelFlows.xml000066400000000000000000000122441160020716200375440ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure String true FlowController/AllowContinueOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false FlowController/ExceptionsToIgnore Flow TestMultiplier NoOp1,NoOp2 NoOp3,NoOp4 AllowContinueOnFailure TestMultiplier NoOp1 NoOp2 ExceptionsToIgnore org.apache.uima.aae.error.MessageTimeoutException TestMultiplier NoOp1 en true true false SimpleTestAggregateWithParentProcessLast.xml000066400000000000000000000132141160020716200404070ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure String true FlowController/AllowContinueOnFailure AllowDropOnFailure String true FlowController/AllowDropOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false FlowController/ExceptionsToIgnore Flow NoOp TestMultiplier RemoteTestMultiplier --> PassThruTestMultiplier NoOp2 AllowDropOnFailure NoOp NoOp2 ExceptionsToIgnore java.lang.IndexOutOfBoundsException NoOp TestMultiplier RemoteTestMultiplier --> PassThruTestMultiplier NoOp2 en true true false SimpleTestAggregateWithRetries.xml000066400000000000000000000137111160020716200364120ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false testContinueOnRetryFailure Tests maxRetries and continueOnRetryFailure settings Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true AdvancedFixedFlowController/Flow AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which continuing on failure should be allowed. String true false AdvancedFixedFlowController/AllowContinueOnFailure AllowDropOnFailure String true AdvancedFixedFlowController/AllowDropOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false AdvancedFixedFlowController/ExceptionsToIgnore Flow TestMultiplier WriterAnnotatorA WriterAnnotatorB WriterAnnotatorC AllowContinueOnFailure WriterAnnotatorA AllowDropOnFailure WriterAnnotatorB ExceptionsToIgnore java.lang.IndexOutOfBoundsException TestMultiplier WriterAnnotatorA WriterAnnotatorB WriterAnnotatorC en true true false SimpleTestAggregateWithSlowDelegatesInParallelFlow.xml000066400000000000000000000125101160020716200423270ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure String true FlowController/AllowContinueOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false FlowController/ExceptionsToIgnore Flow TestMultiplier SlowNoOp1,SlowNoOp2,NoOp1 NoOp2 AllowContinueOnFailure SlowNoOp1 SlowNoOp2 ExceptionsToIgnore java.lang.IndexOutOfBoundsException org.apache.uima.aae.error.MessageTimeoutException org.apache.uima.aae.error.ForcedMessageTimeoutException TestMultiplier NoOp1 en true true false SimpleTestCMAggregateWithCollocated1MillionCM.xml000066400000000000000000000050311160020716200411070ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Top Level Aggregate TAE Detects Nothing TestMultiplier RemoteNoOp NoOpCC en true true true SimpleTestCMAggregateWithCollocatedCM.xml000066400000000000000000000051511160020716200375050ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Nested Aggregate TAE Detects Nothing InnerTestMultiplier RemoteNoOp NoOpCC en true true true SimpleTestCasMultiplierAggregateWithRemoteMultiplier.xml000066400000000000000000000062361160020716200430010ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing NumberToGenerate Approximate number of CASes to create. Integer false true SimpleCasGenerator/NumberToGenerate NumberToGenerate 10 SimpleCasGenerator NoOp NoOpAnnotator2 en true true true SimpleTestCasMultiplierAggregateWithRemoteMultiplier2.xml000066400000000000000000000046741160020716200430670ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing TestMultiplier NoOp NoOpAnnotator2 en true true true SimpleTokenAndSentenceAnnotator.xml000066400000000000000000000054601160020716200365520ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.examples.tokenizer.SimpleTokenAndSentenceAnnotator Simple Token and Sentence Annotator Annotates tokens and sentences. 1.0 The Apache Software Foundation org.apache.uima.examples.tokenizer.Token uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence org.apache.uima.examples.tokenizer.Token en true true false SingleInstancePersonTitleAnnotator.xml000066400000000000000000000146311160020716200373070ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java true org.apache.uima.examples.cas.PersonTitleAnnotator Person Title Annotator An example annotator that discovers Person Titles in text and classifies them into three categories - Civilian (e.g. Mr.,Ms.), Military (e.g. Lt. Col.) , and Government (e.g. Gov., Sen.). This annotator can be configured to only look for titles within existing annotations of a particular type (for example, Person Name annotations). 1.0 The Apache Software Foundation CivilianTitles List of Civilian Titles to be annotated. String true true MilitaryTitles List of Military Titles to be annotated. String true true GovernmentTitles List of Government Titles to be annotated. String true true ContainingAnnotationType Annotation type within which to search for Person Titles. If no value is specified, the entire document will be searched. String false false CivilianTitles Mr. Ms. Mrs. Dr. MilitaryTitles Gen. Col. Maj. Capt. Lt. Gen. Lt Col. Lt. GovernmentTitles Vice President President Vice Pres. Pres. Governor Lt. Governor Gov. Lt. Gov. Senator Sen. example.PersonTitle A Personal Title. uima.tcas.Annotation Kind The kind of title - Civilian, Military, or Government. example.PersonTitleKind example.PersonTitleKind A kind of person title - Civilian, Military, or Government. uima.cas.String Civilian Title of a person not in military or government service. Military Title of a person in the military. Government Title of a government official. example.PersonTitle example.PersonTitle:Kind en true false false SingleInstancePersonTitleJmsService.xml000066400000000000000000000024371160020716200374150ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.aae.jms_adapter.JmsAnalysisEngineServiceAdapter ThirdLevelAggregate.xml000066400000000000000000000060231160020716200341670ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Third Level Aggregate TAE Detects Nothing NumberToGenerate Approximate number of CASes to create. Integer false true Multiplier2/NumberToGenerate NumberToGenerate 10 Multiplier1 Multiplier2 en true true true uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/TopLevelAggregate.xml000066400000000000000000000046611160020716200337440ustar00rootroot00000000000000 org.apache.uima.java false Top Level Aggregate TAE Detects Nothing FirstLevelTestMultiplier SecondLevelAggregateCM en true true true TypeSystemMergeTestAggregate.xml000066400000000000000000000070621160020716200360770ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine org.apache.uima.java false Test Aggregate TAE Detects Nothing Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key String true true FlowController/Flow Flow TestMultiplier GovOffReco PersonTitleReco TokenSentenceReco en true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/WriterAnnotatorA.xml000066400000000000000000000045701160020716200336450ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.noop.WriterAnnotator WriteFile Creates a file 1.0 The Apache Software Foundation AnnotatorName Name of annotator reported in log String false false AnnotatorName WriterAnnotatorA true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/WriterAnnotatorB.xml000066400000000000000000000045701160020716200336460ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.noop.WriterAnnotator WriteFile Creates a file 1.0 The Apache Software Foundation AnnotatorName Name of annotator reported in log String false false AnnotatorName WriterAnnotatorB true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/analysis_engine/WriterAnnotatorC.xml000066400000000000000000000045701160020716200336470ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.noop.WriterAnnotator WriteFile Creates a file 1.0 The Apache Software Foundation AnnotatorName Name of annotator reported in log String false false AnnotatorName WriterAnnotatorC true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/collection_reader/000077500000000000000000000000001160020716200301575ustar00rootroot00000000000000ExtendedTestFileSystemCollectionReader.xml000066400000000000000000000112031160020716200403630ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/collection_reader org.apache.uima.java org.apache.uima.examples.cpe.FileSystemCollectionReader File System Collection Reader Reads files from the filesystem. This CollectionReader may be used with or without a CAS Initializer. If a CAS Initializer is supplied, it will be passed an InputStream to the file and must populate the CAS from that InputStream. If no CAS Initializer is supplied, this CollectionReader will read the file itself and set treat the entire contents of the file as the document to be inserted into the CAS. 1.0 The Apache Software Foundation InputDirectory Directory containing input files String false true Encoding Character encoding for the documents. If not specified, the default system encoding will be used. Note that this parameter only applies if there is no CAS Initializer provided; otherwise, it is the CAS Initializer's responsibility to deal with character encoding issues. String false false Language ISO language code for the documents String false false InputDirectory src/test/resources/data Language en org.apache.uima.examples.SourceDocumentInformation true false true FileSystemCollectionReader.xml000066400000000000000000000112261160020716200360470ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/collection_reader org.apache.uima.java org.apache.uima.examples.cpe.FileSystemCollectionReader File System Collection Reader Reads files from the filesystem. This CollectionReader may be used with or without a CAS Initializer. If a CAS Initializer is supplied, it will be passed an InputStream to the file and must populate the CAS from that InputStream. If no CAS Initializer is supplied, this CollectionReader will read the file itself and set treat the entire contents of the file as the document to be inserted into the CAS. 1.0 The Apache Software Foundation InputDirectory Directory containing input files String false true Encoding Character encoding for the documents. If not specified, the default system encoding will be used. Note that this parameter only applies if there is no CAS Initializer provided; otherwise, it is the CAS Initializer's responsibility to deal with character encoding issues. String false false Language ISO language code for the documents String false false InputDirectory C:/Program Files/apache-uima/examples/data Language en org.apache.uima.examples.SourceDocumentInformation true false true uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/flow/000077500000000000000000000000001160020716200254515ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/flow/AdvancedFixedFlowController.xml000066400000000000000000000116241160020716200335600ustar00rootroot00000000000000 org.apache.uima.java org.apache.uima.ee.test.flow.AdvancedFixedFlowController Advanced Fixed Flow Controller An extension of the FixedFlowController that can also do ParallelSteps and can continue after errors. It is configured via the "Flow" configuration parameter rather than using the flowConstraints element of the aggregate descriptor. 1.0 The Apache Software Foundation ActionAfterCasMultiplier The action to be taken after a CAS has been input to a CAS Multiplier and the CAS Multiplier has finished processing it. Valid values are: continue - the CAS continues on to the next element in the flow stop - the CAS will no longer continue in the flow, and will be returned from the aggregate if possible. drop - the CAS will no longer continue in the flow, and will be dropped (not returned from the aggregate) if possible. dropIfNewCasProduced (the default) - if the CAS multiplier produced a new CAS as a result of processing this CAS, then this CAS will be dropped. If not, then this CAS will continue. String false false Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which continuing on failure should be allowed. String true false AllowDropOnFailure Specifies for which AnalysisEngines a failed CAS can be dropped when an exception occurs. This only applies to internally created CASes and prevents the exception from being transferred to their parent. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which dropping on failure should be allowed. String true false ExceptionsToIgnore Specifies which exceptions to ignore. String true false ActionAfterCasMultiplier dropIfNewCasProduced AdvancedFixedFlowControllerWithTS.xml000066400000000000000000000123211160020716200345770ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/flow org.apache.uima.java org.apache.uima.ee.test.flow.AdvancedFixedFlowController Advanced Fixed Flow Controller An extension of the FixedFlowController that can also do ParallelSteps and can continue after errors. It is configured via the "Flow" configuration parameter rather than using the flowConstraints element of the aggregate descriptor. 1.0 The Apache Software Foundation ActionAfterCasMultiplier The action to be taken after a CAS has been input to a CAS Multiplier and the CAS Multiplier has finished processing it. Valid values are: continue - the CAS continues on to the next element in the flow stop - the CAS will no longer continue in the flow, and will be returned from the aggregate if possible. drop - the CAS will no longer continue in the flow, and will be dropped (not returned from the aggregate) if possible. dropIfNewCasProduced (the default) - if the CAS multiplier produced a new CAS as a result of processing this CAS, then this CAS will be dropped. If not, then this CAS will continue. String false false Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which continuing on failure should be allowed. String true false AllowDropOnFailure Specifies for which AnalysisEngines a failed CAS can be dropped when an exception occurs. This only applies to internally created CASes and prevents the exception from being transferred to their parent. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which dropping on failure should be allowed. String true false ExceptionsToIgnore Specifies which exceptions to ignore. String true false ActionAfterCasMultiplier dropIfNewCasProduced example.EmailAddress Email Address uima.tcas.Annotation BuggyAdvancedFixedFlowController.xml000066400000000000000000000101361160020716200344740ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/flow org.apache.uima.java org.apache.uima.ee.test.flow.BuggyAdvancedFixedFlowController Advanced Fixed Flow Controller An extension of the FixedFlowController that can also do ParallelSteps and can continue after errors. It is configured via the "Flow" configuration parameter rather than using the flowConstraints element of the aggregate descriptor. 1.0 The Apache Software Foundation ActionAfterCasMultiplier The action to be taken after a CAS has been input to a CAS Multiplier and the CAS Multiplier has finished processing it. Valid values are: continue - the CAS continues on to the next element in the flow stop - the CAS will no longer continue in the flow, and will be returned from the aggregate if possible. drop - the CAS will no longer continue in the flow, and will be dropped (not returned from the aggregate) if possible. dropIfNewCasProduced (the default) - if the CAS multiplier produced a new CAS as a result of processing this CAS, then this CAS will be dropped. If not, then this CAS will continue. String false false Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. This parameter must be overridden in the aggregate AE containing this Flow Conroller. String true true AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which continuing on failure should be allowed. String true false ActionAfterCasMultiplier dropIfNewCasProduced FixedFlowControllerWithExceptionOnInitialize.xml000066400000000000000000000100251160020716200370770ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/flow org.apache.uima.java org.apache.uima.ee.test.flow.AdvancedFixedFlowControllerWithInitFailure Advanced Fixed Flow Controller With Init Failure An extension of the FixedFlowController that can also do ParallelSteps and can continue after errors. It is configured via the "Flow" configuration parameter rather than using the flowConstraints element of the aggregate descriptor. 1.0 The Apache Software Foundation ActionAfterCasMultiplier The action to be taken after a CAS has been input to a CAS Multiplier and the CAS Multiplier has finished processing it. Valid values are: continue - the CAS continues on to the next element in the flow stop - the CAS will no longer continue in the flow, and will be returned from the aggregate if possible. drop - the CAS will no longer continue in the flow, and will be dropped (not returned from the aggregate) if possible. dropIfNewCasProduced (the default) - if the CAS multiplier produced a new CAS as a result of processing this CAS, then this CAS will be dropped. If not, then this CAS will continue. String false false Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. This parameter takes an array of Strings as its value. Each String is the key of AnalysisEngine for which continuing on failure should be allowed. String true false ActionAfterCasMultiplier dropIfNewCasProduced uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier/000077500000000000000000000000001160020716200266705ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier/BlueJCasMultiplier_1.xml000066400000000000000000000172761160020716200333460ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasGenerator BlueJ Cas Generator Nr 1 (Inner Aggregate) Generates specified number of CASes. 1.0 The Apache Software Foundation NumberToGenerate Approximate number of CASes to create. Integer false true StringOne document text String false true StringTwo document text String false true InputFile document text String false true NumberToGenerate 1 StringOne Upcoming UIMA Seminars April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. StringTwo UIMA Summer School August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH InputFile data/IBM_LifeSciences.xml false true true uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier/BlueJCasMultiplier_2.xml000066400000000000000000000172541160020716200333430ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasGenerator BlueJ Cas Generator Nr 2 Generates specified number of CASes. 1.0 The Apache Software Foundation NumberToGenerate Approximate number of CASes to create. Integer false true StringOne document text String false true StringTwo document text String false true InputFile document text String false true NumberToGenerate 1 StringOne Upcoming UIMA Seminars April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. StringTwo UIMA Summer School August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH InputFile data/IBM_LifeSciences.xml false true true uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier/BlueJCasMultiplier_3.xml000066400000000000000000000172541160020716200333440ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasGenerator BlueJ Cas Generator Nr 3 Generates specified number of CASes. 1.0 The Apache Software Foundation NumberToGenerate Approximate number of CASes to create. Integer false true StringOne document text String false true StringTwo document text String false true InputFile document text String false true NumberToGenerate 1 StringOne Upcoming UIMA Seminars April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. StringTwo UIMA Summer School August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH InputFile data/IBM_LifeSciences.xml false true true uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier/SimpleCasGenerator.xml000066400000000000000000000170341160020716200331460ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasGenerator Simple Text Segmenter Generates specified number of CASes. 1.0 The Apache Software Foundation NumberToGenerate Approximate number of CASes to create. Integer false true StringOne document text String false true StringTwo document text String false true InputFile document text String false true NumberToGenerate 1 StringOne Upcoming UIMA Seminars April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. StringTwo UIMA Summer School August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH InputFile data/IBM_LifeSciences.xml false true true SimpleCasGeneratorProducing1000Cases.xml000066400000000000000000000172561160020716200362300ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasGenerator Simple Text Segmenter Generates specified number of CASes. 1.0 The Apache Software Foundation NumberToGenerate Approximate number of CASes to create. Integer false true StringOne document text String false true StringTwo document text String false true InputFile document text String false true NumberToGenerate 1000 StringOne Upcoming UIMA Seminars April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. StringTwo UIMA Summer School August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH InputFile data/IBM_LifeSciences.xml false true true SimpleCasGeneratorProducing10Cases.xml000066400000000000000000000172541160020716200360660ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasGenerator Simple Text Segmenter Generates specified number of CASes. 1.0 The Apache Software Foundation NumberToGenerate Approximate number of CASes to create. Integer false true StringOne document text String false true StringTwo document text String false true InputFile document text String false true NumberToGenerate 10 StringOne Upcoming UIMA Seminars April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. StringTwo UIMA Summer School August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH InputFile data/IBM_LifeSciences.xml false true true SimpleCasGeneratorProducing10Cases2.xml000066400000000000000000000172561160020716200361520ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasGenerator Simple Text Segmenter 2 Generates specified number of CASes. 1.0 The Apache Software Foundation NumberToGenerate Approximate number of CASes to create. Integer false true StringOne document text String false true StringTwo document text String false true InputFile document text String false true NumberToGenerate 10 StringOne Upcoming UIMA Seminars April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. StringTwo UIMA Summer School August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH InputFile data/IBM_LifeSciences.xml false true true SimpleCasGeneratorWith1MillionDocs.xml000066400000000000000000000171731160020716200361450ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasGenerator Simple Text Segmenter Generates specified number of CASes. 1.0 The Apache Software Foundation NumberToGenerate Approximate number of CASes to create. Integer false true StringOne document text String false true StringTwo document text String false true InputFile document text String false true NumberToGenerate 1000000 StringOne Upcoming UIMA Seminars April 7, 2004 Distillery Lunch Seminar UIMA and its Metadata 12:00PM-1:00PM in HAW GN-K35. Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide. Jon Lenchner will give a demo of the Text Analysis Engine configurator tool. April 16, 2004 KM & I Department Tea Title: An Eclipse-based TAE Configurator Tool 3:00PM-4:30PM in HAW GN-K35 . Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use. No more editing XML descriptors by hand! May 11, 2004 UIMA Tutorial 9:00AM-5:00PM in HAW GN-K35. This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications. StringTwo UIMA Summer School August 26, 2003 UIMA 101 - The New UIMA Introduction (Hands-on Tutorial) 9:00AM-5:00PM in HAW GN-K35 August 28, 2003 FROST Tutorial 9:00AM-5:00PM in HAW GN-K35 September 15, 2003 UIMA 201: UIMA Advanced Topics (Hands-on Tutorial) 9:00AM-5:00PM in HAW 1S-F53 September 17, 2003 The UIMA System Integration Test and Hardening Service The "SITH" 3:00PM-4:30PM in HAW GN-K35 UIMA Summer School Tutorial and Presentation Details UIMA 101: The new UIMA tutorial Tuesday August 26 9:00AM - 4:30PM in GN-K35 UIMA 101 is a hands-on programming tutorial. UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher. The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates: 1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and 2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs. Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial. Prerequisites for the UIMA 101 Tutorial 1) Java Programming 2) Some experience with Eclipse IDE helpful FROST Tutorial August 28 9:00AM - 5:00PM in GN-K35 Visitors from the FROST team will be here to talk to us about FROST. UIMA 201: The UIMA Advanced Topics Tutorial September 15: 9:00AM - 5:30PM in Hawthorne 1S-F53 UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples. The advanced topics tutorial is designed for people who have some experience with UIMA and want to use new capabilities of UIMA 1.0 to address one or more of the following Advanced Topics: 1) Collection Processing and Collection Processing Engines (CPEs) 2) Multi-Threading and CAS Pooling 3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs 4) A Semantic Search Application that brings it all together Prerequisites for UIMA 201 1) UIMA 101 Tutorial OR Extensive UIMA Experience The UIMA Integration Test bed Service (The "SITH") September 17 3:00PM - 4:30PM in HAW GN-K35 We have developed the first version of the UIMA Integration Test bed service. This service is being developed to help test, evaluate, certify and publish UIMA compliant components. In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics: 1. SITH Services 2. How to submit components and what to expect in return 3. Overview of the test bed implementation using Collection Processing UIMA and Juru. 4. Next Steps for the SITH InputFile data/IBM_LifeSciences.xml false true true uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/multiplier/SimpleCasMerger.xml000066400000000000000000000065651160020716200324500ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.ae.multiplier.SimpleCasMerger Simple Text Segmenter Generates specified number of CASes. 1.0 The Apache Software Foundation AnnotatorName Name os annotator (default is "CasMerger") String false false NumberToMerge Number of input CASes required for each output CAS. Integer false true InputFile document text String false true InputFile data/IBM_LifeSciences.xml NumberToMerge 5 false true true uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/000077500000000000000000000000001160020716200263455ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex1/000077500000000000000000000000001160020716200270425ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex1/RoomNumberAnnotator.xml000066400000000000000000000045311160020716200335420ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex1.RoomNumberAnnotator Room Number Annotator An example annotator that searches for room numbers in the IBM Watson research buildings. 1.0 The Apache Software Foundation org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.RoomNumber:building true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex1/TutorialTypeSystem.xml000066400000000000000000000033061160020716200334400ustar00rootroot00000000000000 TutorialTypeSystem Type System Definition for the tutorial examples - as of Exercise 1 The Apache Software Foundation 1.0 org.apache.uima.tutorial.RoomNumber uima.tcas.Annotation building Building containing this room uima.cas.String uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex2/000077500000000000000000000000001160020716200270435ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex2/RoomNumberAnnotator.xml000066400000000000000000000067171160020716200335530ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex2.RoomNumberAnnotator Room Number Annotator An example annotator that searches for room numbers in the IBM Watson research buildings. 1.0 The Apache Software Foundation Patterns List of room number regular expression pattterns. String true true Locations List of locations corresponding to the room number expressions specified by the Patterns parameter. String true true Patterns \b[0-4]\d-[0-2]\d\d\b \b[G1-4][NS]-[A-Z]\d\d\b \bJ[12]-[A-Z]\d\d\b Locations Watson - Yorktown Watson - Hawthorne I Watson - Hawthorne II org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.RoomNumber:building true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex3/000077500000000000000000000000001160020716200270445ustar00rootroot00000000000000RoomNumberAndDateTime.xml000066400000000000000000000050321160020716200336340ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex3 org.apache.uima.java false Aggregate TAE - Room Number and DateTime Annotators Detects Room Numbers, Dates, and Times RoomNumber DateTime org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex3/TutorialDateTime.xml000066400000000000000000000053431160020716200330130ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex3.TutorialDateTime TutorialDateTime Annotator Finds dates and times 1.0 The Apache Software Foundation org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateAnnot en true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex3/TutorialTypeSystem.xml000066400000000000000000000047601160020716200334470ustar00rootroot00000000000000 TutorialTypeSystem Type System Definition for the tutorial examples - as of Exercise 3 The Apache Software Foundation 1.0 org.apache.uima.tutorial.RoomNumber uima.tcas.Annotation building Building containing this room uima.cas.String org.apache.uima.tutorial.DateTimeAnnot uima.tcas.Annotation shortDateString uima.cas.String org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.DateTimeAnnot uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex4/000077500000000000000000000000001160020716200270455ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex4/MeetingAnnotator.xml000066400000000000000000000064501160020716200330520ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex4.MeetingAnnotator Meeting Annotator Detects meetings from co-occurrences of room numbers, dates, and times 1.0 The Apache Software Foundation WindowSize Maximum number of characters within which a room number, a date, and two times must occur for a meeting annotation to be created. Integer false true WindowSize 200 org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.Meeting en true true false MeetingDetectorAndNoOpTAE.xml000066400000000000000000000057411160020716200343520ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex4 org.apache.uima.java false Meeting Detector TAE Detects Room Numbers, Times, and Dates in text, and annotates the combination of all three as a meeting. RoomNumber DateTime Meeting NoOp org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex4/MeetingDetectorTAE.xml000066400000000000000000000054621160020716200332120ustar00rootroot00000000000000 org.apache.uima.java false Meeting Detector TAE Detects Room Numbers, Times, and Dates in text, and annotates the combination of all three as a meeting. RoomNumber DateTime Meeting org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false MeetingDetectorTAEContinueOnError.xml000066400000000000000000000127011160020716200361410ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex4 org.apache.uima.java false Meeting Detector TAE Detects Room Numbers, Times, and Dates in text, and annotates the combination of all three as a meeting. Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. String true false FlowController/AllowContinueOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false FlowController/ExceptionsToIgnore Flow RoomNumber DateTime Meeting AllowContinueOnFailure RoomNumber ExceptionsToIgnore org.apache.uima.aae.error.MessageTimeoutException org.apache.uima.aae.error.ForcedMessageTimeoutException RoomNumber DateTime Meeting org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false MeetingDetectorTAEWithCMContinueOnError.xml000066400000000000000000000136311160020716200372200ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex4 org.apache.uima.java false Meeting Detector TAE Detects Room Numbers, Times, and Dates in text, and annotates the combination of all three as a meeting. Flow Specifies the flow. This is an array of strings where each string is either a single Analysis Engine key or a comma-separated list of Analysis Engine keys that should be executed in parallel. String true true FlowController/Flow AllowContinueOnFailure Specifies for which AnalysisEngines the Flow should continue when an exception occurs. String true false FlowController/AllowContinueOnFailure ExceptionsToIgnore Specifies which exceptions to ignore. String true false FlowController/ExceptionsToIgnore Flow TestMultiplier RoomNumber DateTime Meeting NoOp AllowContinueOnFailure RoomNumber ExceptionsToIgnore org.apache.uima.aae.error.MessageTimeoutException org.apache.uima.aae.error.ForcedMessageTimeoutException TestMultiplier RoomNumber DateTime Meeting NoOp org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.TimeAnnot en true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex4/TutorialTypeSystem.xml000066400000000000000000000074151160020716200334500ustar00rootroot00000000000000 TutorialTypeSystem Type System Definition for the tutorial examples - as of Exercise 4 The Apache Software Foundation 1.0 org.apache.uima.tutorial.RoomNumber uima.tcas.Annotation building Building containing this room uima.cas.String org.apache.uima.tutorial.DateTimeAnnot uima.tcas.Annotation shortDateString uima.cas.String org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.Meeting uima.tcas.Annotation room org.apache.uima.tutorial.RoomNumber date org.apache.uima.tutorial.DateAnnot startTime org.apache.uima.tutorial.TimeAnnot endTime org.apache.uima.tutorial.TimeAnnot org.apache.uima.examples.tokenizer.Token uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence uima.tcas.Annotation uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex5/000077500000000000000000000000001160020716200270465ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex5/RoomNumberAnnotator.xml000066400000000000000000000074751160020716200335600ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex5.RoomNumberAnnotator Room Number Annotator An example annotator that searches for room numbers in the IBM Watson research buildings. 1.0 The Apache Software Foundation Patterns List of room number regular expression pattterns. String true true Locations List of locations corresponding to the room number expressions specified by the Patterns parameter. String true true Patterns \b[0-4]\d-[0-2]\d\d\b \b[G1-4][NS]-[A-Z]\d\d\b \bJ[12]-[A-Z]\d\d\b (foo Locations Watson - Yorktown Watson - Hawthorne I Watson - Hawthorne II org.apache.uima.tutorial.RoomNumber org.apache.uima.tutorial.RoomNumber:building true true false uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex6/000077500000000000000000000000001160020716200270475ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex6/TutorialTypeSystem.xml000066400000000000000000000105051160020716200334440ustar00rootroot00000000000000 TutorialTypeSystem Type System Definition for the tutorial examples - as of Exercise 6 The Apache Software Foundation 1.0 org.apache.uima.tutorial.RoomNumber uima.tcas.Annotation building Building containing this room uima.cas.String org.apache.uima.tutorial.DateTimeAnnot uima.tcas.Annotation shortDateString uima.cas.String org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.DateAnnot org.apache.uima.tutorial.DateTimeAnnot org.apache.uima.tutorial.Meeting uima.tcas.Annotation room org.apache.uima.tutorial.RoomNumber date org.apache.uima.tutorial.DateAnnot startTime org.apache.uima.tutorial.TimeAnnot endTime org.apache.uima.tutorial.TimeAnnot org.apache.uima.tutorial.UimaAcronym uima.tcas.Annotation expandedForm uima.cas.String org.apache.uima.tutorial.UimaMeeting org.apache.uima.tutorial.Meeting org.apache.uima.examples.tokenizer.Token uima.tcas.Annotation org.apache.uima.examples.tokenizer.Sentence uima.tcas.Annotation uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex6/UimaAcronymAnnotator.xml000066400000000000000000000064641160020716200337150ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex6.UimaAcronymAnnotator UIMA Acronym Annotator Annotates UIMA Acronyms and provides their expanded form. 1.0 The Apache Software Foundation org.apache.uima.tutorial.UimaAcronym en true true false AcronymTable Table of acronyms and their expanded forms. org.apache.uima.tutorial.ex6.StringMapResource UimaAcronymTableFile A table containing UIMA acronyms and their expanded forms. file:org/apache/uima/tutorial/ex6/uimaAcronyms.txt org.apache.uima.tutorial.ex6.StringMapResource_impl AcronymTable UimaAcronymTableFile uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex6/UimaMeetingAnnotator.xml000066400000000000000000000055311160020716200336670ustar00rootroot00000000000000 org.apache.uima.java true org.apache.uima.tutorial.ex6.UimaMeetingAnnotator UIMA Meeting Annotator Iterates over Meeting annotations and annotates a meeting as a UimaMeeting if a UIMA acronym occurs in close proximity to that meeting. 1.0 The Apache Software Foundation org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.UimaMeeting en true true false UimaTermTable Map whose keps are UIMA terms. org.apache.uima.tutorial.ex6.StringMapResource false UimaMeetingDetectorTAE.xml000066400000000000000000000076641160020716200337570ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/ex6 org.apache.uima.java false UIMA Meeting Detector TAE Annotates meeting notices, and also marks those meetings whose topic is likely to be related to UIMA. Also annotates all UIMA acronyms and provides their expanded form. This TAE also demonstrates using the Resource Manager to share data between annotators. Both the UimaMeetingAnnotator and UimaAcronymAnnotator share a common resource file. MeetingDetector UimaMeetingAnnotator UimaAcronymAnnotator org.apache.uima.tutorial.Meeting org.apache.uima.tutorial.UimaMeeting org.apache.uima.tutorial.UimaAcronym en true true false UimaAcronymTableFile A table containing UIMA acronyms and their exanded forms. file:org/apache/uima/tutorial/ex6/uimaAcronyms.txt org.apache.uima.tutorial.ex6.StringMapResource_impl UimaAcronymAnnotator/AcronymTable UimaAcronymTableFile UimaMeetingAnnotator/UimaTermTable UimaAcronymTableFile uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/search/000077500000000000000000000000001160020716200276125ustar00rootroot00000000000000MeetingIndexBuildSpec.xml000066400000000000000000000042451160020716200344350ustar00rootroot00000000000000uima-as-2.3.1/uimaj-as-activemq/src/test/resources/descriptors/tutorial/search org.apache.uima.examples.tokenizer.Token org.apache.uima.tutorial.DateAnnot