From 463453111ddc87651c31f22b680301d8d6fab264 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Fri, 19 Jul 2013 13:49:02 -0400 Subject: [PATCH 01/46] Adding proof of concept SPARQL update VIVO-101 --- .../webapp/search/indexing/IndexBuilder.java | 37 ++++++++-- .../SparqlUpdateTestDataGetter.java | 66 ++++++++++++++++++ .../pageDataGetter/BrowseDataGetter.java | 2 +- .../SparqlUpdateTestDataGetter.java | 68 +++++++++++++++++++ .../WEB-INF/ontologies/app/sparqlTestMenu.n3 | 22 ++++++ .../body/menupage/page-sparqlUpdateTest.ftl | 12 ++++ 6 files changed, 199 insertions(+), 8 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SparqlUpdateTestDataGetter.java create mode 100644 webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 create mode 100644 webapp/web/templates/freemarker/body/menupage/page-sparqlUpdateTest.ftl diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java index ab8e4750d..497caab35 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java @@ -9,8 +9,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ConcurrentSkipListSet; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; @@ -61,7 +59,10 @@ public class IndexBuilder extends VitroBackgroundThread { /** Indicates that a stop of the indexing objects has been requested. */ private volatile boolean stopRequested = false; - + + /** Indicates that new updates should not be started. */ + private boolean deferNewUpdates = false; + /** Length of time to wait before looking for work (if not wakened sooner). */ public static final long MAX_IDLE_INTERVAL = 1000 * 60 /* msec */ ; @@ -163,7 +164,7 @@ public class IndexBuilder extends VitroBackgroundThread { * This will re-index Individuals were added with addToChanged(). */ public synchronized void doUpdateIndex() { - log.debug("callto doUpdateIndex()"); + log.debug("call to doUpdateIndex()"); //wake up thread and it will attempt to index anything in changedUris this.notifyAll(); } @@ -184,12 +185,33 @@ public class IndexBuilder extends VitroBackgroundThread { this.notifyAll(); this.interrupt(); } - + + /** + * Calling this will cause the IndexBuider to no start a new index update + * until unpuase is called. This is intended to allow a large change + * without slowing it down with incremental search index updates. + */ + public synchronized void pause(){ + this.deferNewUpdates = true; + } + + public synchronized void unpause(){ + if( deferNewUpdates == true ){ + this.deferNewUpdates = false; + this.notifyAll(); + this.interrupt(); + } + } + @Override public void run() { while(! stopRequested ){ try{ - if( reindexRequested ){ + if ( deferNewUpdates ){ + log.debug("there is no indexing working to do, waiting for work"); + synchronized (this) { this.wait(MAX_IDLE_INTERVAL); } + } + else if ( reindexRequested ){ setWorkLevel(WorkLevel.WORKING, FLAG_REBUILDING); log.debug("full re-index requested"); @@ -198,7 +220,8 @@ public class IndexBuilder extends VitroBackgroundThread { notifyListeners( IndexingEventListener.EventTypes.FINISH_FULL_REBUILD ); setWorkLevel(WorkLevel.IDLE); - }else{ + } + else{ boolean workToDo = false; synchronized (changedStmts ){ workToDo = !changedStmts.isEmpty(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java new file mode 100644 index 000000000..4a6a054f2 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java @@ -0,0 +1,66 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.utils.dataGetter; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.hp.hpl.jena.query.Dataset; +import com.hp.hpl.jena.update.GraphStore; +import com.hp.hpl.jena.update.GraphStoreFactory; +import com.hp.hpl.jena.update.UpdateAction; + +import edu.cornell.mannlib.vitro.webapp.search.indexing.IndexBuilder; + +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset; + +/** + * Test to experement with Jena ARQ SPARQL update and the RDFServiceDataset. + */ +public class SparqlUpdateTestDataGetter implements DataGetter{ + private static final Log log = LogFactory.getLog(SparqlUpdateTestDataGetter.class); + + VitroRequest vreq; + ServletContext context; + + /** + * Constructor with display model and data getter URI that will be called by reflection. + */ + public SparqlUpdateTestDataGetter(VitroRequest vreq ){ + if( vreq == null ) + throw new IllegalArgumentException("VitroRequest may not be null."); + this.vreq = vreq; + this.context = vreq.getSession().getServletContext(); + } + + + @Override + public Map getData( Map valueMap ) { + HashMap data = new HashMap(); + + String update = vreq.getParameter("update"); + + if( update != null && !update.trim().isEmpty()){ + try{ + IndexBuilder.getBuilder(context).pause(); + Dataset ds = new RDFServiceDataset( vreq.getUnfilteredRDFService() ); + GraphStore graphStore = GraphStoreFactory.create(ds); + log.warn("The SPARQL update is '"+vreq.getParameter("update")+"'"); + UpdateAction.parseExecute( vreq.getParameter("update") , graphStore ); + }finally{ + IndexBuilder.getBuilder(context).unpause(); + } + + } + + data.put("bodyTemplate", "page-sparqlUpdateTest.ftl"); + return data; + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java index 7fbd63ada..d8bd2209e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java @@ -63,7 +63,7 @@ public class BrowseDataGetter implements PageDataGetter { return DisplayVocabulary.HOME_PAGE_TYPE; } - //Get data servuice + //Get data service @Override public String getDataServiceUrl() { return UrlBuilder.getUrl("/dataservice?getSolrIndividualsByVClass=1&vclassId="); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SparqlUpdateTestDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SparqlUpdateTestDataGetter.java new file mode 100644 index 000000000..f6e074ca7 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SparqlUpdateTestDataGetter.java @@ -0,0 +1,68 @@ + +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONObject; + +import com.hp.hpl.jena.query.Dataset; +import com.hp.hpl.jena.update.GraphStore; +import com.hp.hpl.jena.update.GraphStoreFactory; +import com.hp.hpl.jena.update.UpdateAction; + +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; +import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset; + +/** + * Test to experement with Jena ARQ SPARQL update and the RDFServiceDataset. + */ +public class SparqlUpdateTestDataGetter implements PageDataGetter{ + private static final Log log = LogFactory.getLog(SparqlUpdateTestDataGetter.class); + + @Override + public Map + getData(ServletContext context, + VitroRequest vreq, String pageUri, + Map page ) + { + HashMap data = new HashMap(); + + Dataset ds = new RDFServiceDataset( vreq.getUnfilteredRDFService() ); + GraphStore graphStore = GraphStoreFactory.create(ds); + + log.warn("The SPARQL update is '"+vreq.getParameter("update")+"'"); + + UpdateAction.parseExecute( vreq.getParameter("update") , graphStore ); + + return data; + } + + + @Override + public String getType(){ + return PageDataGetterUtils.generateDataGetterTypeURI(SparqlUpdateTestDataGetter.class.getName()); + } + + + @Override + public String getDataServiceUrl() { + // TODO Auto-generated method stub + return null; + } + + + @Override + public JSONObject convertToJSON(Map map, VitroRequest vreq) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 b/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 new file mode 100644 index 000000000..028595010 --- /dev/null +++ b/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 @@ -0,0 +1,22 @@ +# $This file is distributed under the terms of the license in /doc/license.txt$ + +@prefix owl: . +@prefix display: . +@prefix rdf: . +@prefix rdfs: . + +### Test page for SPARQL UPDATE ### +### Not For Production ### +display:SparqlTestMenuItem + a display:NavigationElement ; + display:linkText "SPARQL Update Test"; + display:toPage display:SparqlUpdateTestPage . + +display:SparqlUpdateTestPage + a display:Page ; + display:title "SPARQL Update Test" ; + display:urlMapping "/sparqlUpdateTest" ; + display:hasDataGetter display:sparqlUpdateDataGetter . + +display:sparqlUpdateDataGetter + a . diff --git a/webapp/web/templates/freemarker/body/menupage/page-sparqlUpdateTest.ftl b/webapp/web/templates/freemarker/body/menupage/page-sparqlUpdateTest.ftl new file mode 100644 index 000000000..17274f829 --- /dev/null +++ b/webapp/web/templates/freemarker/body/menupage/page-sparqlUpdateTest.ftl @@ -0,0 +1,12 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +

SPARQL Update Test

+ +

This is an expermental SPARQL update service.

+ +
+

+ + +

+
\ No newline at end of file From d802b95f9c67296c3a7c6cedd7a955ddb05fae1b Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Fri, 2 Aug 2013 11:30:33 -0400 Subject: [PATCH 02/46] removing white space from very long line --- .../cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java index 1ce5169e5..b83ae68e4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java @@ -547,7 +547,8 @@ public class SimpleReasoner extends StatementListener { * * If it is removed that x is sameAs y, then remove y sameAs x from * the inference graph and then recompute the inferences for x and - * y based on their respective assertions. that x owl:sameAs y, then all asserted and inferred + * y based on their respective assertions. + * that x owl:sameAs y, then all asserted and inferred */ protected void removedABoxSameAsAssertion(Statement stmt, Model inferenceModel) { Resource subject = null; From 98bb7236d11a40834a95446d805242b3c63968f7 Mon Sep 17 00:00:00 2001 From: tworrall Date: Tue, 6 Aug 2013 14:31:26 -0400 Subject: [PATCH 03/46] replaced reference to the sirceforge wiki with a reference to the duraspace wiki --- webapp/web/WEB-INF/resources/shortview_config.n3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/web/WEB-INF/resources/shortview_config.n3 b/webapp/web/WEB-INF/resources/shortview_config.n3 index ace0ff7ad..c4c2abfe4 100644 --- a/webapp/web/WEB-INF/resources/shortview_config.n3 +++ b/webapp/web/WEB-INF/resources/shortview_config.n3 @@ -9,5 +9,5 @@ # Ontology is complete. # # Find out how to use this file at -# https://sourceforge.net/apps/mediawiki/vivo/index.php?title=Using_Short_Views_in_Release_1.5 +# https://wiki.duraspace.org/display/VIVO/Using+Short+Views+in+Release+1.5 # From 3f061da0060ffde44b099d89900b27da14e5653b Mon Sep 17 00:00:00 2001 From: j2blake Date: Thu, 8 Aug 2013 13:22:16 -0400 Subject: [PATCH 04/46] VIVO-246 Re-implement the FreemarkerConfiguration The Configuration must contain mutable information like the theme directory and the TemplateLoader. It must also be request-specific so it can have the correct Locale for language support. But we should only have one instance, so there is only one TemplateCache (alternatively, one TemplateCache per theme). Previously, this was addressed by intercepting the Template processing and adding the request-based info to the Environment. However, this interception code needed to appear each time a Template was processed. This was sometimes overlooked, and at best introduced a bunch of duplicated code. Instead, I extended the freemarker Configuration class to include a ThreadLocal that holds request-specific information. --- .../controller/ajax/VitroAjaxController.java | 6 +- .../FreemarkerComponentGenerator.java | 2 + .../freemarker/FreemarkerConfiguration.java | 379 ------------------ .../FreemarkerConfigurationLoader.java | 66 --- .../freemarker/FreemarkerHttpServlet.java | 4 +- .../freemarker/TemplateProcessingHelper.java | 8 +- .../VTwo/EditConfigurationUtils.java | 4 +- .../webapp/email/FreemarkerEmailFactory.java | 7 +- .../webapp/email/FreemarkerEmailMessage.java | 6 +- .../config/FreemarkerConfiguration.java | 293 ++++++++++++++ .../config/FreemarkerConfigurationImpl.java | 309 ++++++++++++++ .../FreemarkerProcessingServiceImpl.java | 6 +- .../individual/DataPropertyTemplateModel.java | 7 +- .../ObjectPropertyTemplateModel.java | 4 +- .../WEB-INF/resources/startup_listeners.txt | 1 + 15 files changed, 630 insertions(+), 472 deletions(-) delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfiguration.java delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfigurationImpl.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/ajax/VitroAjaxController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/ajax/VitroAjaxController.java index 955a8e2a8..ab848e895 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/ajax/VitroAjaxController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/ajax/VitroAjaxController.java @@ -17,7 +17,7 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfigurationLoader; +import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration; import freemarker.template.Configuration; import freemarker.template.Template; @@ -73,8 +73,8 @@ public abstract class VitroAjaxController extends HttpServlet { * Process data through a Freemarker template and output the result. */ protected void writeTemplate(String templateName, Map map, - VitroRequest vreq, HttpServletResponse response) { - Configuration config = FreemarkerConfigurationLoader.getConfig(vreq); + HttpServletRequest req, HttpServletResponse response) { + Configuration config = FreemarkerConfiguration.getConfig(req); try { Template template = config.getTemplate(templateName); PrintWriter out = response.getWriter(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerComponentGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerComponentGenerator.java index d71dd7366..e01b14cd9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerComponentGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerComponentGenerator.java @@ -61,6 +61,8 @@ public class FreemarkerComponentGenerator extends FreemarkerHttpServlet { return get(templateName, root, request); } + // JB Because this is pretending to be a servlet, but the init method has not been called, providing the context. + // Do that in the constructor, and we should be fine. VIVO-251 // RY We need the servlet context in getConfig(). For some reason using the method inherited from // GenericServlet bombs. @Override diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfiguration.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfiguration.java deleted file mode 100644 index b358b87b6..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfiguration.java +++ /dev/null @@ -1,379 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.controller.freemarker; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean; -import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; -import edu.cornell.mannlib.vitro.webapp.config.RevisionInfoBean; -import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfigurationConstants; -import edu.cornell.mannlib.vitro.webapp.i18n.freemarker.I18nMethodModel; -import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.DataGetter; -import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.DataGetterUtils; -import edu.cornell.mannlib.vitro.webapp.web.directives.IndividualShortViewDirective; -import edu.cornell.mannlib.vitro.webapp.web.directives.UrlDirective; -import edu.cornell.mannlib.vitro.webapp.web.directives.WidgetDirective; -import edu.cornell.mannlib.vitro.webapp.web.methods.IndividualLocalNameMethod; -import edu.cornell.mannlib.vitro.webapp.web.methods.IndividualPlaceholderImageUrlMethod; -import edu.cornell.mannlib.vitro.webapp.web.methods.IndividualProfileUrlMethod; -import freemarker.cache.ClassTemplateLoader; -import freemarker.cache.FileTemplateLoader; -import freemarker.cache.MultiTemplateLoader; -import freemarker.cache.TemplateLoader; -import freemarker.core.Environment; -import freemarker.ext.beans.BeansWrapper; -import freemarker.template.Configuration; -import freemarker.template.DefaultObjectWrapper; -import freemarker.template.ObjectWrapper; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModelException; -import freemarker.template.utility.DeepUnwrap; - -public class FreemarkerConfiguration extends Configuration { - - private static final Log log = LogFactory.getLog(FreemarkerConfiguration.class); - - private static final String PROPERTY_DEVELOPER_DEFEAT_CACHE = "developer.defeatFreemarkerCache"; - private static final String PROPERTY_DEVELOPER_INSERT_DELIMITERS = "developer.insertFreemarkerDelimiters"; - - private final String themeDir; - private final ServletContext context; - private final ApplicationBean appBean; - private final ConfigurationProperties props; - - FreemarkerConfiguration(String themeDir, ApplicationBean appBean, ServletContext context) { - - this.themeDir = themeDir; - this.context = context; - this.appBean = appBean; - this.props = ConfigurationProperties.getBean(context); - - String flag = props.getProperty(PROPERTY_DEVELOPER_DEFEAT_CACHE, "false"); - if (Boolean.valueOf(flag.trim())) { - log.debug("Disabling Freemarker template caching in development build."); - setTemplateUpdateDelay(0); // no template caching in development - } else { - int delay = 60; - log.debug("Setting Freemarker template cache update delay to " + delay + "."); - setTemplateUpdateDelay(delay); // in seconds; Freemarker default is 5 - } - - // Specify how templates will see the data model. - // The Freemarker default wrapper exposes set methods and get methods that take - // arguments. We block exposure to these methods by default. - BeansWrapper wrapper = new DefaultObjectWrapper(); - wrapper.setExposureLevel(BeansWrapper.EXPOSE_PROPERTIES_ONLY); - setObjectWrapper(wrapper); - - // Set some formatting defaults. These can be overridden at the template - // or environment (template-processing) level, or for an individual - // token by using built-ins. - setLocale(java.util.Locale.US); - - String dateFormat = "M/d/yyyy"; - setDateFormat(dateFormat); - String timeFormat = "h:mm a"; - setTimeFormat(timeFormat); - setDateTimeFormat(dateFormat + " " + timeFormat); - - //config.setNumberFormat("#,##0.##"); - - try { - setSetting("url_escaping_charset", "ISO-8859-1"); - } catch (TemplateException e) { - log.error("Error setting value for url_escaping_charset."); - } - - setTemplateLoader(createTemplateLoader()); - - setSharedVariables(); - - } - - /** - * These are values that are accessible to all - * templates loaded by the Configuration's TemplateLoader. They - * should be application- rather than request-specific. - */ - private void setSharedVariables() { - - Map sharedVariables = new HashMap(); - - sharedVariables.put("siteName", appBean.getApplicationName()); - sharedVariables.put("version", getRevisionInfo()); - sharedVariables.put("urls", getSiteUrls()); - sharedVariables.put("themeDir", themeDir); - sharedVariables.put("currentTheme", themeDir.substring(themeDir.lastIndexOf('/')+1)); - - sharedVariables.putAll(getDirectives()); - sharedVariables.putAll(getMethods()); - sharedVariables.put("siteTagline", appBean.getShortHand()); - - //Put in edit configuration constants - useful for freemarker templates/editing - sharedVariables.put("editConfigurationConstants", EditConfigurationConstants.exportConstants()); - - for ( Map.Entry variable : sharedVariables.entrySet() ) { - try { - setSharedVariable(variable.getKey(), variable.getValue()); - } catch (TemplateModelException e) { - log.error("Could not set shared variable '" + variable.getKey() + "' in Freemarker configuration"); - } - } - } - - private final Map getRevisionInfo() { - Map map = new HashMap(); - map.put("label", RevisionInfoBean.getBean(context) - .getReleaseLabel()); - map.put("moreInfoUrl", UrlBuilder.getUrl("/revisionInfo")); - return map; - } - - private final Map getSiteUrls() { - Map urls = new HashMap(); - - // Templates use this to construct urls. - urls.put("base", context.getContextPath()); - - urls.put("home", UrlBuilder.getHomeUrl()); - urls.put("about", UrlBuilder.getUrl(Route.ABOUT)); - urls.put("search", UrlBuilder.getUrl(Route.SEARCH)); - urls.put("termsOfUse", UrlBuilder.getUrl(Route.TERMS_OF_USE)); - urls.put("login", UrlBuilder.getLoginUrl()); - urls.put("logout", UrlBuilder.getLogoutUrl()); - urls.put("siteAdmin", UrlBuilder.getUrl(Route.SITE_ADMIN)); - urls.put("themeImages", UrlBuilder.getUrl(themeDir + "/images")); - urls.put("images", UrlBuilder.getUrl("/images")); - urls.put("theme", UrlBuilder.getUrl(themeDir)); - urls.put("index", UrlBuilder.getUrl("/browse")); - - return urls; - } - - private static Map getDirectives() { - Map map = new HashMap(); - map.put("dump", new freemarker.ext.dump.DumpDirective()); - map.put("dumpAll", new freemarker.ext.dump.DumpAllDirective()); - map.put("help", new freemarker.ext.dump.HelpDirective()); - map.put("shortView", new IndividualShortViewDirective()); - map.put("url", new UrlDirective()); - map.put("widget", new WidgetDirective()); - - - return map; - } - - private static Map getMethods() { - Map map = new HashMap(); - map.put("profileUrl", new IndividualProfileUrlMethod()); - map.put("localName", new IndividualLocalNameMethod()); - map.put("placeholderImageUrl", new IndividualPlaceholderImageUrlMethod()); - map.put("i18n", new I18nMethodModel()); - return map; - } - - // Define template locations. Template loader will look first in the theme-specific - // location, then in the vitro location. - protected final TemplateLoader createTemplateLoader() { - - List loaders = new ArrayList(); - MultiTemplateLoader mtl = null; - try { - // Theme template loader - String themeTemplatePath = context.getRealPath(themeDir) + "/templates"; - File themeTemplateDir = new File(themeTemplatePath); - // Handle the case where there's no theme template directory gracefully - if (themeTemplateDir.exists()) { - FileTemplateLoader themeFtl = new FileTemplateLoader(themeTemplateDir); - loaders.add(themeFtl); - } - - // Vitro template loader - String vitroTemplatePath = context.getRealPath("/templates/freemarker"); - loaders.add(new FlatteningTemplateLoader(new File(vitroTemplatePath))); - - loaders.add(new ClassTemplateLoader(getClass(), "")); - - TemplateLoader[] loaderArray = loaders.toArray(new TemplateLoader[loaders.size()]); - mtl = new MultiTemplateLoader(loaderArray); - - } catch (IOException e) { - log.error("Error creating template loaders"); - } - - // Add the ability to add delimiters to the templates, based on - // settings. - if (Boolean.valueOf(props.getProperty(PROPERTY_DEVELOPER_INSERT_DELIMITERS))) { - return new DelimitingTemplateLoader(mtl); - } else { - return mtl; - } - } - - /** - * Override getTemplate(), so we can apply DataGetters to all included - * templates. - * - * This won't work for top-level Templates, since the Environment hasn't - * been created yet. When TemplateProcessingHelper creates the Environment, - * it must call retrieveAndRunDataGetters() for the top-level Template. - */ - @Override - public Template getTemplate(String name, Locale locale, String encoding, - boolean parse) throws IOException { - Template template = super.getTemplate(name, locale, encoding, parse); - - if (template == null) { - log.debug("Template '" + name + "' not found for locale '" + locale + "'."); - return template; - } - - Environment env = getEnvironment(); - if (env == null) { - log.debug("Not fetching data getters for template '" + template.getName() + "'. No environment."); - return template; - } - - retrieveAndRunDataGetters(env, template.getName()); - return template; - } - - - /** - * Find the DataGetters for this template, and apply them to the Freemarker - * environment. - */ - public static void retrieveAndRunDataGetters(Environment env, String templateName) { - HttpServletRequest req = (HttpServletRequest) env.getCustomAttribute("request"); - VitroRequest vreq = new VitroRequest(req); - - if (dataGettersAlreadyApplied(env, templateName)) { - log.debug("DataGetters for '" + templateName+"' have already been applied"); - return; - } - - try { - List dgList = DataGetterUtils.getDataGettersForTemplate( - vreq, vreq.getDisplayModel(), templateName); - log.debug("Retrieved " + dgList.size() + " data getters for template '" + templateName + "'"); - - @SuppressWarnings("unchecked") - Map dataMap = (Map) DeepUnwrap.permissiveUnwrap(env.getDataModel()); - for (DataGetter dg : dgList) { - applyDataGetter(dg, env, dataMap); - } - } catch (Exception e) { - log.warn(e, e); - } - } - - /** - * Have the DataGetters for this template already been applied to this environment? - * If not, record that they are being applied now. - */ - @SuppressWarnings("unchecked") - private static boolean dataGettersAlreadyApplied(Environment env, String templateName) { - Set names; - Object o = env.getCustomAttribute("dataGettersApplied"); - if (o instanceof Set) { - names = (Set) o; - } else { - names = new HashSet(); - } - - boolean added = names.add(templateName); - if (added) { - env.setCustomAttribute("dataGettersApplied", names); - return false; - } else { - return true; - } - } - - /** - * Get the data from a DataGetter, and store it in global variables in the - * Freemarker environment. - */ - private static void applyDataGetter(DataGetter dg, Environment env, - Map dataMap) throws TemplateModelException { - Map moreData = dg.getData(dataMap); - ObjectWrapper wrapper = env.getObjectWrapper(); - if (moreData != null) { - for (String key : moreData.keySet()) { - Object value = moreData.get(key); - env.setGlobalVariable(key, wrapper.wrap(value)); - log.debug("Stored in environment: '" + key + "' = '" + value + "'"); - } - } - } - - // ---------------------------------------------------------------------- - // Request info and overrides - // ---------------------------------------------------------------------- - - private ThreadLocal reqInfo = new ThreadLocal<>(); - - void setRequestInfo(HttpServletRequest req) { - reqInfo.set(new FreemarkerRequestInfo(req)); - } - - @Override - public Object getCustomAttribute(String name) { - if ("request".equals(name)) { - return reqInfo.get().getRequest(); - } else { - return super.getCustomAttribute(name); - } - } - - @Override - public String[] getCustomAttributeNames() { - String[] nameArray = super.getCustomAttributeNames(); - Set nameSet = new HashSet(Arrays.asList(nameArray)); - nameSet.add("request"); - return nameSet.toArray(new String[nameSet.size()]); - } - - @Override - public Locale getLocale() { - return reqInfo.get().getLocale(); - } - - - - public static class FreemarkerRequestInfo { - private final HttpServletRequest req; - - public FreemarkerRequestInfo(HttpServletRequest req) { - this.req = req; - } - - public HttpServletRequest getRequest() { - return req; - } - - public Locale getLocale() { - return req.getLocale(); - } - } - -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java deleted file mode 100644 index 340686d19..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java +++ /dev/null @@ -1,66 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.controller.freemarker; - -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.ServletContext; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean; -import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; - -public class FreemarkerConfigurationLoader { - private static final Log log = LogFactory - .getLog(FreemarkerConfigurationLoader.class); - - private static final Map themeToConfigMap = new HashMap(); - - public static FreemarkerConfiguration getConfig(VitroRequest vreq) { - String themeDir = getThemeDir(vreq.getAppBean()); - FreemarkerConfiguration config = getConfigForTheme(themeDir, vreq.getAppBean(), vreq.getSession().getServletContext()); - config.setRequestInfo(vreq); - return config; - } - - private static String getThemeDir(ApplicationBean appBean) { - if (appBean == null) { - log.error("Cannot get themeDir from null application bean"); - return null; - } - - String themeDir = appBean.getThemeDir(); - if (themeDir == null) { - log.error("themeDir is null"); - return null; - } - - return themeDir.replaceAll("/$", ""); - } - - /** - * The Configuration is theme-specific because: - * - * 1. The template loader is theme-specific, since it specifies a theme - * directory to load templates from. - * - * 2. Some shared variables are theme-specific. - */ - private static FreemarkerConfiguration getConfigForTheme(String themeDir, - ApplicationBean appBean, ServletContext context) { - synchronized (themeToConfigMap) { - if (themeToConfigMap.containsKey(themeDir)) { - return themeToConfigMap.get(themeDir); - } else { - FreemarkerConfiguration config = new FreemarkerConfiguration( - themeDir, appBean, context); - themeToConfigMap.put(themeDir, config); - return config; - } - } - } - -} \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java index 3cf0faeb0..135cf29b2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java @@ -37,10 +37,12 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.Res import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.email.FreemarkerEmailFactory; import edu.cornell.mannlib.vitro.webapp.email.FreemarkerEmailMessage; +import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.Tags; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.User; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu.MainMenu; import freemarker.ext.beans.BeansWrapper; +import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; @@ -336,7 +338,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { private Map buildRequestUrls(VitroRequest vreq) { Map requestUrls = new HashMap(); - FreemarkerConfiguration config = FreemarkerConfigurationLoader.getConfig(vreq); + Configuration config = FreemarkerConfiguration.getConfig(vreq); TemplateModel urlModel = config.getSharedVariable("urls"); try { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java index 828b09555..08b89c33c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/TemplateProcessingHelper.java @@ -13,7 +13,8 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration; +import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfigurationImpl; import freemarker.core.Environment; import freemarker.template.Configuration; import freemarker.template.Template; @@ -26,7 +27,7 @@ public class TemplateProcessingHelper { private Configuration config = null; public TemplateProcessingHelper(HttpServletRequest request, ServletContext context) { - this.config = FreemarkerConfigurationLoader.getConfig(new VitroRequest(request)); + this.config = FreemarkerConfiguration.getConfig(request); } public StringWriter processTemplate(String templateName, Map map) @@ -50,7 +51,8 @@ public class TemplateProcessingHelper { } // Apply any data-getters that are associated with this template. - FreemarkerConfiguration.retrieveAndRunDataGetters(env, template.getName()); + // TODO clean this up VIVO-249 + FreemarkerConfigurationImpl.retrieveAndRunDataGetters(env, template.getName()); // Now process it. env.process(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java index 5068e2b1b..a214814f7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java @@ -23,11 +23,11 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfigurationLoader; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; +import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration; import freemarker.template.Configuration; public class EditConfigurationUtils { @@ -272,7 +272,7 @@ public class EditConfigurationUtils { //Generate HTML for a specific field name given public static String generateHTMLForElement(VitroRequest vreq, String fieldName, EditConfigurationVTwo editConfig) { String html = ""; - Configuration fmConfig = FreemarkerConfigurationLoader.getConfig(vreq); + Configuration fmConfig = FreemarkerConfiguration.getConfig(vreq); FieldVTwo field = editConfig == null ? null : editConfig.getField(fieldName); MultiValueEditSubmission editSub = EditSubmissionUtils.getEditSubmissionFromSession(vreq.getSession(), editConfig); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailFactory.java index 84f0c1fcd..3f9d3d852 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailFactory.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailFactory.java @@ -25,9 +25,9 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfiguration; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfigurationLoader; +import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; +import freemarker.template.Configuration; /** * A factory that creates Freemarker-based email messages. @@ -59,8 +59,7 @@ public class FreemarkerEmailFactory { } FreemarkerEmailFactory factory = getFactory(vreq); - FreemarkerConfiguration fConfig = FreemarkerConfigurationLoader - .getConfig(vreq); + Configuration fConfig = FreemarkerConfiguration.getConfig(vreq); return new FreemarkerEmailMessage(vreq, fConfig, factory.getEmailSession(), factory.getReplyToAddress()); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailMessage.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailMessage.java index 1b3cd9a53..710242dd9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailMessage.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/email/FreemarkerEmailMessage.java @@ -28,8 +28,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfiguration; import edu.cornell.mannlib.vitro.webapp.web.directives.EmailDirective; +import freemarker.template.Configuration; import freemarker.template.TemplateException; /** @@ -49,7 +49,7 @@ public class FreemarkerEmailMessage { private final VitroRequest vreq; private final Session mailSession; - private final FreemarkerConfiguration config; + private final Configuration config; private final List recipients = new ArrayList(); private final InternetAddress replyToAddress; @@ -64,7 +64,7 @@ public class FreemarkerEmailMessage { /** * Package access - should only be created by the factory. */ - FreemarkerEmailMessage(VitroRequest vreq, FreemarkerConfiguration fConfig, + FreemarkerEmailMessage(VitroRequest vreq, Configuration fConfig, Session mailSession, InternetAddress replyToAddress) { this.vreq = vreq; this.mailSession = mailSession; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java new file mode 100644 index 000000000..fe7555d35 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java @@ -0,0 +1,293 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.freemarker.config; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; +import edu.cornell.mannlib.vitro.webapp.config.RevisionInfoBean; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.DelimitingTemplateLoader; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FlatteningTemplateLoader; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfigurationConstants; +import edu.cornell.mannlib.vitro.webapp.i18n.freemarker.I18nMethodModel; +import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; +import edu.cornell.mannlib.vitro.webapp.web.directives.IndividualShortViewDirective; +import edu.cornell.mannlib.vitro.webapp.web.directives.UrlDirective; +import edu.cornell.mannlib.vitro.webapp.web.directives.WidgetDirective; +import edu.cornell.mannlib.vitro.webapp.web.methods.IndividualLocalNameMethod; +import edu.cornell.mannlib.vitro.webapp.web.methods.IndividualPlaceholderImageUrlMethod; +import edu.cornell.mannlib.vitro.webapp.web.methods.IndividualProfileUrlMethod; +import freemarker.cache.ClassTemplateLoader; +import freemarker.cache.FileTemplateLoader; +import freemarker.cache.MultiTemplateLoader; +import freemarker.cache.TemplateLoader; +import freemarker.ext.beans.BeansWrapper; +import freemarker.template.Configuration; +import freemarker.template.DefaultObjectWrapper; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModelException; + +/** + * Access point for a singleton Configuration instance. + * + * The instance is created at system startup, so we can fail early if there are + * any problems. + * + * The Configuration is slightly extended to hold request-based information in a + * ThreadLocal. The net result is although there is only one configuration (and + * hence only one template cache), each request gets a customization with its + * own locale, etc. + * + * Each time a request asks for the configuration, check to see whether the + * cache is still valid, and whether the theme has changed (needs a new + * TemplateLoader). Store the request info to the ThreadLocal. + */ +public abstract class FreemarkerConfiguration { + private static final Log log = LogFactory + .getLog(FreemarkerConfiguration.class); + + private static final String PROPERTY_DEFEAT_CACHE = "developer.defeatFreemarkerCache"; + private static final String PROPERTY_INSERT_DELIMITERS = "developer.insertFreemarkerDelimiters"; + + private static volatile FreemarkerConfigurationImpl instance; + private static volatile String previousThemeDir; + + public static Configuration getConfig(HttpServletRequest req) { + confirmInstanceIsSet(); + + synchronized (instance) { + clearTemplateCacheIfRequested(req); + keepTemplateLoaderCurrentWithThemeDirectory(req); + setThreadLocalsForRequest(req); + return instance; + } + } + + private static void confirmInstanceIsSet() { + if (instance == null) { + throw new IllegalStateException( + "VitroFreemarkerConfiguration has not been set."); + } + } + + private static void clearTemplateCacheIfRequested(HttpServletRequest req) { + if (isTemplateCacheInvalid(req)) { + instance.clearTemplateCache(); + } + } + + private static boolean isTemplateCacheInvalid(HttpServletRequest req) { + ConfigurationProperties props = ConfigurationProperties.getBean(req); + + // If the developer doesn't want the cache, it's invalid. + if (Boolean.valueOf(props.getProperty(PROPERTY_DEFEAT_CACHE))) { + return true; + } + + return false; + } + + /** + * Keep track of the theme directory. If it changes, create an appropriate + * new TemplateLoader. + * + * Note that setting a new TemplateLoader on the context Configuration also + * creates a new, empty TemplateCache. + */ + private static void keepTemplateLoaderCurrentWithThemeDirectory( + HttpServletRequest req) { + String themeDir = getThemeDirectory(req); + if (hasThemeDirectoryChanged(themeDir)) { + TemplateLoader tl = createTemplateLoader(req, themeDir); + instance.setTemplateLoader(tl); + } + } + + private static String getThemeDirectory(HttpServletRequest req) { + return new VitroRequest(req).getAppBean().getThemeDir(); + } + + private static boolean hasThemeDirectoryChanged(String themeDir) { + synchronized (instance) { + if (StringUtils.equals(themeDir, previousThemeDir)) { + return false; + } else { + previousThemeDir = themeDir; + return true; + } + } + } + + private static TemplateLoader createTemplateLoader(HttpServletRequest req, + String themeDir) { + ServletContext ctx = req.getSession().getServletContext(); + ConfigurationProperties props = ConfigurationProperties.getBean(ctx); + + List loaders = new ArrayList(); + + // Theme template loader + String themeTemplatePath = ctx.getRealPath(themeDir) + "/templates"; + File themeTemplateDir = new File(themeTemplatePath); + // A theme need not contain a template directory. + if (themeTemplateDir.exists()) { + try { + FileTemplateLoader themeFtl = new FileTemplateLoader( + themeTemplateDir); + loaders.add(themeFtl); + } catch (IOException e) { + log.error("Error creating theme template loader", e); + } + } + + // Vitro template loader + String vitroTemplatePath = ctx.getRealPath("/templates/freemarker"); + loaders.add(new FlatteningTemplateLoader(new File(vitroTemplatePath))); + + // TODO VIVO-243 Why is this here? + loaders.add(new ClassTemplateLoader(FreemarkerConfiguration.class, "")); + + TemplateLoader[] loaderArray = loaders + .toArray(new TemplateLoader[loaders.size()]); + MultiTemplateLoader mtl = new MultiTemplateLoader(loaderArray); + + // If requested, add delimiters to the templates. + if (Boolean.valueOf(props.getProperty(PROPERTY_INSERT_DELIMITERS))) { + return new DelimitingTemplateLoader(mtl); + } else { + return mtl; + } + } + + private static void setThreadLocalsForRequest(HttpServletRequest req) { + instance.setRequestInfo(req); + } + + // ---------------------------------------------------------------------- + // Setup class + // ---------------------------------------------------------------------- + + public static class Setup implements ServletContextListener { + @Override + public void contextInitialized(ServletContextEvent sce) { + ServletContext ctx = sce.getServletContext(); + StartupStatus ss = StartupStatus.getBean(ctx); + try { + instance = createConfiguration(ctx); + ss.info(this, "Initialized the Freemarker configuration."); + } catch (Exception e) { + ss.fatal(this, + "Failed to initialize the Freemarker configuration.", e); + } + } + + private FreemarkerConfigurationImpl createConfiguration( + ServletContext ctx) throws TemplateModelException { + FreemarkerConfigurationImpl c = new FreemarkerConfigurationImpl(); + + setMiscellaneousProperties(c); + setSharedVariables(c, ctx); + addDirectives(c); + addMethods(c); + + return c; + } + + private void setMiscellaneousProperties(FreemarkerConfigurationImpl c) { + /* + * Lengthen the cache time. + */ + c.setTemplateUpdateDelay(60); // increase from the 5-second default + + /* + * On most template models, hide the getters and setters that take + * arguments. + */ + BeansWrapper wrapper = new DefaultObjectWrapper(); + wrapper.setExposureLevel(BeansWrapper.EXPOSE_PROPERTIES_ONLY); + c.setObjectWrapper(wrapper); + + /* + * Set a default Locale, but expect it to be overridden by the + * request. + */ + c.setLocale(java.util.Locale.US); + + /* + * This is how we like our date and time strings to look. + */ + String dateFormat = "M/d/yyyy"; + c.setDateFormat(dateFormat); + String timeFormat = "h:mm a"; + c.setTimeFormat(timeFormat); + c.setDateTimeFormat(dateFormat + " " + timeFormat); + + /* + * What character set is used when escaping special characters in a + * URL? + */ + try { + c.setSetting("url_escaping_charset", "ISO-8859-1"); + } catch (TemplateException e) { + log.error("Error setting value for url_escaping_charset."); + } + } + + private void setSharedVariables(FreemarkerConfigurationImpl c, + ServletContext ctx) throws TemplateModelException { + c.setSharedVariable("version", getRevisionInfo(ctx)); + + /* + * Put in edit configuration constants - useful for freemarker + * templates/editing + */ + c.setSharedVariable("editConfigurationConstants", + EditConfigurationConstants.exportConstants()); + } + + private void addDirectives(FreemarkerConfigurationImpl c) { + c.setSharedVariable("dump", new freemarker.ext.dump.DumpDirective()); + c.setSharedVariable("dumpAll", + new freemarker.ext.dump.DumpAllDirective()); + c.setSharedVariable("help", new freemarker.ext.dump.HelpDirective()); + c.setSharedVariable("shortView", new IndividualShortViewDirective()); + c.setSharedVariable("url", new UrlDirective()); + c.setSharedVariable("widget", new WidgetDirective()); + } + + private void addMethods(FreemarkerConfigurationImpl c) { + c.setSharedVariable("profileUrl", new IndividualProfileUrlMethod()); + c.setSharedVariable("localName", new IndividualLocalNameMethod()); + c.setSharedVariable("placeholderImageUrl", + new IndividualPlaceholderImageUrlMethod()); + c.setSharedVariable("i18n", new I18nMethodModel()); + } + + private Map getRevisionInfo(ServletContext ctx) { + Map map = new HashMap(); + map.put("label", RevisionInfoBean.getBean(ctx).getReleaseLabel()); + map.put("moreInfoUrl", UrlBuilder.getUrl("/revisionInfo")); + return map; + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + instance = null; + } + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfigurationImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfigurationImpl.java new file mode 100644 index 000000000..b4318c97f --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfigurationImpl.java @@ -0,0 +1,309 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.freemarker.config; + +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; +import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.DataGetter; +import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.DataGetterUtils; +import freemarker.core.Environment; +import freemarker.template.Configuration; +import freemarker.template.ObjectWrapper; +import freemarker.template.SimpleScalar; +import freemarker.template.Template; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; +import freemarker.template.utility.DeepUnwrap; + +/** + * Extend the Freemarker Configuration class to include some information that is + * particular to the current request. + * + * Takes advantage of the fact that each servlet request runs in a separate + * thread. Stores the request-based information in a ThreadLocal. Override any + * methods that should return that information instead of (or in addition to) + * the common info. + * + * Only the getters are overridden, not the setters. So if you call + * setAllSharedVariables(), for example, it will have no effect on the + * request-based information. + */ +public class FreemarkerConfigurationImpl extends Configuration { + private static final Log log = LogFactory + .getLog(FreemarkerConfigurationImpl.class); + + private final ThreadLocal rbiRef = new ThreadLocal<>(); + + void setRequestInfo(HttpServletRequest req) { + rbiRef.set(new RequestBasedInformation(req, this)); + } + + @Override + public Object getCustomAttribute(String name) { + Map attribs = rbiRef.get().getCustomAttributes(); + if (attribs.containsKey(name)) { + return attribs.get(name); + } else { + return super.getCustomAttribute(name); + } + } + + @Override + public String[] getCustomAttributeNames() { + Set rbiNames = rbiRef.get().getCustomAttributes().keySet(); + return joinNames(rbiNames, super.getCustomAttributeNames()); + } + + @Override + public TemplateModel getSharedVariable(String name) { + Map vars = rbiRef.get().getSharedVariables(); + if (vars.containsKey(name)) { + return vars.get(name); + } else { + return super.getSharedVariable(name); + } + } + + @Override + public Set getSharedVariableNames() { + Set rbiNames = rbiRef.get().getSharedVariables().keySet(); + + @SuppressWarnings("unchecked") + Set superNames = super.getSharedVariableNames(); + + Set allNames = new HashSet<>(superNames); + allNames.addAll(rbiNames); + return allNames; + } + + @Override + public Locale getLocale() { + return rbiRef.get().getReq().getLocale(); + } + + private String[] joinNames(Set nameSet, String[] nameArray) { + Set allNames = new HashSet<>(nameSet); + for (String n : nameArray) { + allNames.add(n); + } + return (String[]) allNames.toArray(); + } + + // ---------------------------------------------------------------------- + // Apply DataGetters to templates when loading. + // + // TODO Clean this up VIVO-249 + // ---------------------------------------------------------------------- + + /** + * Override getTemplate(), so we can apply DataGetters to all included + * templates. + * + * This won't work for top-level Templates, since the Environment hasn't + * been created yet. When TemplateProcessingHelper creates the Environment, + * it must call retrieveAndRunDataGetters() for the top-level Template. + */ + @Override + public Template getTemplate(String name, Locale locale, String encoding, + boolean parse) throws IOException { + Template template = super.getTemplate(name, locale, encoding, parse); + + if (template == null) { + log.debug("Template '" + name + "' not found for locale '" + locale + + "'."); + return template; + } + + Environment env = getEnvironment(); + if (env == null) { + log.debug("Not fetching data getters for template '" + + template.getName() + "'. No environment."); + return template; + } + + retrieveAndRunDataGetters(env, template.getName()); + return template; + } + + /** + * Find the DataGetters for this template, and apply them to the Freemarker + * environment. + */ + public static void retrieveAndRunDataGetters(Environment env, + String templateName) { + HttpServletRequest req = (HttpServletRequest) env + .getCustomAttribute("request"); + VitroRequest vreq = new VitroRequest(req); + + if (dataGettersAlreadyApplied(env, templateName)) { + log.debug("DataGetters for '" + templateName + + "' have already been applied"); + return; + } + + try { + List dgList = DataGetterUtils + .getDataGettersForTemplate(vreq, vreq.getDisplayModel(), + templateName); + log.debug("Retrieved " + dgList.size() + + " data getters for template '" + templateName + "'"); + + @SuppressWarnings("unchecked") + Map dataMap = (Map) DeepUnwrap + .permissiveUnwrap(env.getDataModel()); + for (DataGetter dg : dgList) { + applyDataGetter(dg, env, dataMap); + } + } catch (Exception e) { + log.warn(e, e); + } + } + + /** + * Have the DataGetters for this template already been applied to this + * environment? If not, record that they are being applied now. + */ + @SuppressWarnings("unchecked") + private static boolean dataGettersAlreadyApplied(Environment env, + String templateName) { + Set names; + Object o = env.getCustomAttribute("dataGettersApplied"); + if (o instanceof Set) { + names = (Set) o; + } else { + names = new HashSet(); + } + + boolean added = names.add(templateName); + if (added) { + env.setCustomAttribute("dataGettersApplied", names); + return false; + } else { + return true; + } + } + + /** + * Get the data from a DataGetter, and store it in global variables in the + * Freemarker environment. + */ + private static void applyDataGetter(DataGetter dg, Environment env, + Map dataMap) throws TemplateModelException { + Map moreData = dg.getData(dataMap); + ObjectWrapper wrapper = env.getObjectWrapper(); + if (moreData != null) { + for (String key : moreData.keySet()) { + Object value = moreData.get(key); + env.setGlobalVariable(key, wrapper.wrap(value)); + log.debug("Stored in environment: '" + key + "' = '" + value + + "'"); + } + } + } + + // ---------------------------------------------------------------------- + // Helper class + // ---------------------------------------------------------------------- + + /** + * Holds the request-based information. Currently, it's shared variables, a + * custom attribute, and the locale. In the future, it could be more. + */ + private static class RequestBasedInformation { + private final HttpServletRequest req; + private final Configuration c; + private final Map customAttributes = new HashMap<>(); + private final Map sharedVariables = new HashMap<>(); + + public RequestBasedInformation(HttpServletRequest req, Configuration c) { + this.req = req; + this.c = c; + + setSharedVariables(req); + setCustomAttributes(req); + } + + public HttpServletRequest getReq() { + return req; + } + + public Map getCustomAttributes() { + return customAttributes; + } + + public Map getSharedVariables() { + return sharedVariables; + } + + private void setSharedVariables(HttpServletRequest req) { + ServletContext ctx = req.getSession().getServletContext(); + VitroRequest vreq = new VitroRequest(req); + ApplicationBean appBean = vreq.getAppBean(); + String siteName = appBean.getApplicationName(); + String tagLine = appBean.getShortHand(); + String themeDir = appBean.getThemeDir().replaceAll("/$", ""); + String currentTheme = themeDir + .substring(themeDir.lastIndexOf('/') + 1); + Map siteUrls = getSiteUrls(ctx, themeDir); + + sharedVariables.put("siteName", wrap(siteName)); + sharedVariables.put("themeDir", wrap(themeDir)); + sharedVariables.put("currentTheme", wrap(currentTheme)); + sharedVariables.put("siteTagline", wrap(tagLine)); + sharedVariables.put("urls", wrap(siteUrls)); + } + + private Map getSiteUrls(ServletContext ctx, + String themeDir) { + Map urls = new HashMap(); + + // Templates use this to construct urls. + urls.put("base", ctx.getContextPath()); + urls.put("home", UrlBuilder.getHomeUrl()); + urls.put("about", UrlBuilder.getUrl(Route.ABOUT)); + urls.put("search", UrlBuilder.getUrl(Route.SEARCH)); + urls.put("termsOfUse", UrlBuilder.getUrl(Route.TERMS_OF_USE)); + urls.put("login", UrlBuilder.getLoginUrl()); + urls.put("logout", UrlBuilder.getLogoutUrl()); + urls.put("siteAdmin", UrlBuilder.getUrl(Route.SITE_ADMIN)); + + urls.put("themeImages", UrlBuilder.getUrl(themeDir + "/images")); + urls.put("images", UrlBuilder.getUrl("/images")); + urls.put("theme", UrlBuilder.getUrl(themeDir)); + urls.put("index", UrlBuilder.getUrl("/browse")); + + return urls; + } + + private TemplateModel wrap(Object o) { + try { + return c.getObjectWrapper().wrap(o); + } catch (TemplateModelException e) { + log.error("Failed to wrap this " + + "for the Freemarker configuration: " + o, e); + return new SimpleScalar(String.valueOf(o)); + } + } + + private void setCustomAttributes(HttpServletRequest req) { + customAttributes.put("request", req); + } + + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/services/freemarker/FreemarkerProcessingServiceImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/services/freemarker/FreemarkerProcessingServiceImpl.java index 2f53a8459..b6ccfd536 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/services/freemarker/FreemarkerProcessingServiceImpl.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/services/freemarker/FreemarkerProcessingServiceImpl.java @@ -12,8 +12,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfigurationLoader; +import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration; import edu.cornell.mannlib.vitro.webapp.utils.log.LogUtils; import freemarker.core.ParseException; import freemarker.template.Configuration; @@ -51,8 +50,7 @@ public class FreemarkerProcessingServiceImpl implements throws TemplateProcessingException { Template template = null; try { - Configuration config = FreemarkerConfigurationLoader - .getConfig(new VitroRequest(req)); + Configuration config = FreemarkerConfiguration.getConfig(req); template = config.getTemplate(templateName); } catch (ParseException e) { log.warn("Failed to parse the template at '" + templateName + "'" diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java index f5036463c..b70c24818 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java @@ -5,8 +5,6 @@ package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; @@ -21,13 +19,12 @@ import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.Property; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfigurationLoader; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyStatementDao; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; -import edu.cornell.mannlib.vitro.webapp.web.templatemodels.customlistview.InvalidConfigurationException; +import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.customlistview.DataPropertyListConfig; import freemarker.cache.TemplateLoader; @@ -136,7 +133,7 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel { } protected TemplateLoader getFreemarkerTemplateLoader() { - return FreemarkerConfigurationLoader.getConfig(vreq).getTemplateLoader(); + return FreemarkerConfiguration.getConfig(vreq).getTemplateLoader(); } @Override diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java index 49e36d284..701ad0320 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java @@ -22,12 +22,12 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.Property; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerConfigurationLoader; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; +import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.customlistview.InvalidConfigurationException; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.customlistview.PropertyListConfig; import freemarker.cache.TemplateLoader; @@ -152,7 +152,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel * This will do for now. */ protected TemplateLoader getFreemarkerTemplateLoader() { - return FreemarkerConfigurationLoader.getConfig(vreq).getTemplateLoader(); + return FreemarkerConfiguration.getConfig(vreq).getTemplateLoader(); } protected List> getStatementData() { diff --git a/webapp/web/WEB-INF/resources/startup_listeners.txt b/webapp/web/WEB-INF/resources/startup_listeners.txt index d7e47e9d9..7f83a702a 100644 --- a/webapp/web/WEB-INF/resources/startup_listeners.txt +++ b/webapp/web/WEB-INF/resources/startup_listeners.txt @@ -65,6 +65,7 @@ edu.cornell.mannlib.vitro.webapp.i18n.selection.LocaleSelectionSetup edu.cornell.mannlib.vitro.webapp.search.solr.SolrSetup edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerSetup +edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration$Setup # On shutdown, this will kill the background thread started by Apache Commons File Upload org.apache.commons.fileupload.servlet.FileCleanerCleanup From ec162df154e8edc80d42a935dcec5da884df2657 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Mon, 19 Aug 2013 16:18:18 -0400 Subject: [PATCH 05/46] git seems to be attempting to change the CRLF to LF in the build.xml --- webapp/build.xml | 1044 +++++++++++++++++++++++----------------------- 1 file changed, 522 insertions(+), 522 deletions(-) diff --git a/webapp/build.xml b/webapp/build.xml index a144f0665..e168a2dda 100644 --- a/webapp/build.xml +++ b/webapp/build.xml @@ -1,522 +1,522 @@ - - - - - - - - - - - - - - - - - - - - The Vitro build script requires Java 7 or later. - Java system property java.version = ${java.version} - Java system property java.home = ${java.home} - JAVA_HOME environment variable = ${env.JAVA_HOME} - - - - - - - - - - The Vitro build script requires Ant 1.8 or later. - Ant property ant.version = ${ant.version} - Ant property ant.home = ${ant.home} - ANT_HOME environment variable = ${env.ANT_HOME} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${revisionInfo.timestamp} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -all - Runs "clean", then "deploy". -clean - Delete all artifacts so the next build will be from scratch. -compile - Compile the Java source files. -orng - Configure and deploy the ORNG Shindig application. -test - Compile and run the JUnit tests. -distribute - Create WAR files to be deployed in a servlet container. -deploy - Deploy the application directly into the Tomcat webapps directory. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + The Vitro build script requires Java 7 or later. + Java system property java.version = ${java.version} + Java system property java.home = ${java.home} + JAVA_HOME environment variable = ${env.JAVA_HOME} + + + + + + + + + + The Vitro build script requires Ant 1.8 or later. + Ant property ant.version = ${ant.version} + Ant property ant.home = ${ant.home} + ANT_HOME environment variable = ${env.ANT_HOME} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${revisionInfo.timestamp} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +all - Runs "clean", then "deploy". +clean - Delete all artifacts so the next build will be from scratch. +compile - Compile the Java source files. +orng - Configure and deploy the ORNG Shindig application. +test - Compile and run the JUnit tests. +distribute - Create WAR files to be deployed in a servlet container. +deploy - Deploy the application directly into the Tomcat webapps directory. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 34af3c202a7f1161c755639576f5ef4d92167b84 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Tue, 20 Aug 2013 11:40:23 -0400 Subject: [PATCH 06/46] Adding email password method to PolicyHelper. Adding getClientAddr to VitroRequest --- .../webapp/auth/policy/PolicyHelper.java | 50 ++++++++++++++++++- .../vitro/webapp/controller/VitroRequest.java | 12 +++++ .../freemarker/FreemarkerHttpServlet.java | 8 +-- .../controller/SearchServiceController.java | 33 +++--------- .../SparqlUpdateTestDataGetter.java | 2 +- 5 files changed, 73 insertions(+), 32 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyHelper.java index ec9611df3..b27a8de8a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyHelper.java @@ -17,8 +17,10 @@ import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; +import edu.cornell.mannlib.vitro.webapp.auth.identifier.ActiveIdentifierBundleFactories; import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle; import edu.cornell.mannlib.vitro.webapp.auth.identifier.RequestIdentifiers; +import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission; import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyIface; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; @@ -26,6 +28,9 @@ import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddDataPro import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddObjectPropertyStatement; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropDataPropertyStatement; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropObjectPropertyStatement; +import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; +import edu.cornell.mannlib.vitro.webapp.controller.authenticate.Authenticator; +import edu.cornell.mannlib.vitro.webapp.controller.authenticate.BasicAuthenticator; /** * A collection of static methods to help determine whether requested actions @@ -53,7 +58,7 @@ public class PolicyHelper { IdentifierBundle ids = RequestIdentifiers.getIdBundleForRequest(req); return isAuthorizedForActions(ids, policy, actions); } - + /** * Are these actions authorized for these identifiers by these policies? */ @@ -62,6 +67,48 @@ public class PolicyHelper { return Actions.notNull(actions).isAuthorized(policy, ids); } + /** + * Is the email/password authorized for these actions? + * This should be used when a controller or something needs allow + * actions if the user passes in their email and password. + * + * It may be better to check this as part of a servlet Filter and + * add an identifier bundle. + */ + public static boolean isAuthorizedForActions( HttpServletRequest req, + String email, String password, + Actions actions){ + + if( password == null || email == null || + password.isEmpty() || email.isEmpty()){ + return false; + } + + try{ + Authenticator basicAuth = new BasicAuthenticator(req); + UserAccount user = basicAuth.getAccountForInternalAuth( email ); + log.debug("userAccount is " + user==null?"null":user.getUri() ); + + if( ! basicAuth.isCurrentPassword( user, password ) ){ + log.debug(String.format("UNAUTHORIZED, password not accepted for %s, account URI: %s", + user.getEmailAddress(), user.getUri())); + return false; + }else{ + log.debug(String.format("password accepted for %s, account URI: %s", + user.getEmailAddress(), user.getUri() )); + // figure out if that account can do the actions + IdentifierBundle ids = + ActiveIdentifierBundleFactories.getUserIdentifierBundle(req,user); + PolicyIface policy = ServletPolicyList.getPolicies(req); + return PolicyHelper.isAuthorizedForActions( ids, policy, actions ); + } + + }catch(Exception ex){ + log.error("Error while attempting to authorize actions " + actions.toString(), ex); + return false; + } + } + /** * Do the current policies authorize the current user to add this statement * to this model? @@ -260,6 +307,7 @@ public class PolicyHelper { + stmt.getObject() + ">"; } + /** * No need to instantiate this helper class - all methods are static. */ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java index 854c09ac7..a882e124d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java @@ -171,6 +171,18 @@ public class VitroRequest extends HttpServletRequestWrapper { return getWebappDaoFactory().getApplicationDao().getApplicationBean(); } + /** + * Gets the the ip of the client. + * This will be X-forwarded-for header or, if that header is not + * set, getRemoteAddr(). This still may not be the client's address + * as they may be using a proxy. + * + */ + public String getClientAddr(){ + String xff = getHeader("x-forwarded-for"); + return ( xff == null || xff.trim().isEmpty() ) ? getRemoteAddr() : xff; + } + @SuppressWarnings("unchecked") @Override public Map getParameterMap() { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java index 135cf29b2..71eeaf006 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java @@ -2,7 +2,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; -import static javax.mail.Message.RecipientType.TO; +import static javax.mail.Message.RecipientType.*; import java.io.IOException; import java.io.PrintWriter; @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission; import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequiresActions; import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean; import edu.cornell.mannlib.vitro.webapp.beans.DisplayMessage; import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet; @@ -48,7 +49,7 @@ import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import freemarker.template.utility.DeepUnwrap; -public class FreemarkerHttpServlet extends VitroHttpServlet { +public class FreemarkerHttpServlet extends VitroHttpServlet { private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(FreemarkerHttpServlet.class); @@ -203,7 +204,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { * NB This method can't be static, because then the superclass method gets called rather than * the subclass method. For the same reason, it can't refer to a static or instance field * REQUIRED_ACTIONS which is overridden in the subclass. - */ + * + */ protected Actions requiredActions(VitroRequest vreq) { return Actions.AUTHORIZED; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SearchServiceController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SearchServiceController.java index 1d82546a6..b2dd876ab 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SearchServiceController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/SearchServiceController.java @@ -43,7 +43,7 @@ public class SearchServiceController extends FreemarkerHttpServlet { * userAccount associated with the email. */ @Override - protected Actions requiredActions(VitroRequest vreq) { + public Actions requiredActions(VitroRequest vreq) { try{ // Works by side effect: parse the multi-part request and stash FileItems in request FileUploadServletRequest.parseRequest(vreq, 0); @@ -52,42 +52,21 @@ public class SearchServiceController extends FreemarkerHttpServlet { String pw = vreq.getParameter("password"); String email = vreq.getParameter("email"); - log.debug(String.format("email: '%s' password: '%s' ",email,pw)); - if( pw == null || email == null || pw.isEmpty() || email.isEmpty()){ return SimplePermission.MANAGE_SEARCH_INDEX.ACTIONS; } - Authenticator basicAuth = new BasicAuthenticator(vreq); - UserAccount user = basicAuth.getAccountForInternalAuth( email ); - log.debug("userAccount is " + user==null?"null":user.getUri() ); - - if( ! basicAuth.isCurrentPassword( user, pw ) ){ - log.debug(String.format("UNAUTHORIZED, password not accepted for %s, account URI: %s", - user.getEmailAddress(), user.getUri())); - return Actions.UNAUTHORIZED; - }else{ - log.debug(String.format("password accepted for %s, account URI: %s", - user.getEmailAddress(), user.getUri() )); - } - - //then figure out if that account can manage the search index. - IdentifierBundle ids = - ActiveIdentifierBundleFactories.getUserIdentifierBundle(vreq,user); - PolicyIface policy = ServletPolicyList.getPolicies(vreq); - boolean canManageSearchIndex = - PolicyHelper.isAuthorizedForActions( ids, policy, - SimplePermission.MANAGE_SEARCH_INDEX.ACTIONS ); - if( canManageSearchIndex ){ + if( PolicyHelper.isAuthorizedForActions(vreq, email, pw, + SimplePermission.MANAGE_SEARCH_INDEX.ACTIONS ) ){ return Actions.AUTHORIZED; }else{ - log.debug(String.format("userAccount is unauthorized to" + - " manage the search index.",user.getUri())); + log.debug(email + " is unauthorized to manage the search index. " + + "client IP "+vreq.getClientAddr()); return Actions.UNAUTHORIZED; } }catch(Exception ex){ - log.error("Error while attempting to log in " + + log.error("Error while client IP "+ vreq.getClientAddr() + " attempting to log in " + "to SearchServiceController: " + ex.getMessage()); return Actions.UNAUTHORIZED; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java index 4a6a054f2..0d0ac41aa 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java @@ -21,7 +21,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset; /** - * Test to experement with Jena ARQ SPARQL update and the RDFServiceDataset. + * Test to experiment with Jena ARQ SPARQL update and the RDFServiceDataset. */ public class SparqlUpdateTestDataGetter implements DataGetter{ private static final Log log = LogFactory.getLog(SparqlUpdateTestDataGetter.class); From 3bb968a72a1cbac7e33f86da8b40e6770baa5911 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Tue, 20 Aug 2013 11:41:04 -0400 Subject: [PATCH 07/46] removing some PageDataGetter objects. They are replaced by DataGetter objects --- .../pageDataGetter/BrowseDataGetter.java | 234 ------------------ .../SparqlUpdateTestDataGetter.java | 68 ----- 2 files changed, 302 deletions(-) delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SparqlUpdateTestDataGetter.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java deleted file mode 100644 index d8bd2209e..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java +++ /dev/null @@ -1,234 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import javax.servlet.ServletContext; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.json.JSONArray; -import org.json.JSONObject; - -import edu.cornell.mannlib.vitro.webapp.beans.Individual; -import edu.cornell.mannlib.vitro.webapp.beans.VClass; -import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup; -import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; -import edu.cornell.mannlib.vitro.webapp.controller.json.JsonServlet; -import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; -import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupsForRequest; -import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; -import edu.cornell.mannlib.vitro.webapp.utils.JsonToFmModel; -import edu.cornell.mannlib.vitro.webapp.web.templatemodels.VClassGroupTemplateModel; -import edu.cornell.mannlib.vitro.webapp.web.templatemodels.VClassTemplateModel; -import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist.ListedIndividual; - -public class BrowseDataGetter implements PageDataGetter { - final static Log log = LogFactory.getLog(BrowseDataGetter.class); - - @Override - public Map getData(ServletContext context, - VitroRequest vreq, String pageUri, Map page) { - try{ - Map params = vreq.getParameterMap(); - - Mode mode = getMode( vreq, params ); - switch( mode ){ - case VCLASS_ALPHA: - return doClassAlphaDisplay(params,vreq,context); - case CLASS_GROUP: - return doClassGroupDisplay(params, vreq, context); - case VCLASS: - return doClassDisplay(params, vreq, context); - case ALL_CLASS_GROUPS: - return doAllClassGroupsDisplay( params, page, vreq, context); - default: - return doAllClassGroupsDisplay( params, page, vreq, context); - } - }catch(Throwable th){ - log.error(th,th); - return Collections.emptyMap(); - } - } - - @Override - public String getType() { - return DisplayVocabulary.HOME_PAGE_TYPE; - } - - //Get data service - @Override - public String getDataServiceUrl() { - return UrlBuilder.getUrl("/dataservice?getSolrIndividualsByVClass=1&vclassId="); - } - private Map doClassAlphaDisplay( Map params, VitroRequest request, ServletContext context) throws Exception { - Map body = new HashMap(); - body.putAll(getCommonValues(context, request)); - body.putAll(getClassAlphaValues(params,request,context)); - return body; - } - - private Map getClassAlphaValues( Map params, VitroRequest request, ServletContext context) throws Exception{ - Map map= new HashMap(); - - String classUri = getParam(Mode.VCLASS, request, params); - VitroRequest vreq = new VitroRequest(request); - VClass vclass = vreq.getWebappDaoFactory().getVClassDao().getVClassByURI(classUri); - map.put("class", new VClassTemplateModel(vclass)); - - JSONObject vclassRes = JsonServlet.getSolrIndividualsByVClass(vclass.getURI(), request, context); - map.put("totalCount", JsonToFmModel.convertJSONObjectToMap( (String) vclassRes.get("totalCount") )); - map.put("alpha", JsonToFmModel.convertJSONObjectToMap( (String) vclassRes.get("alpha") )); - map.put("individuals", JsonToFmModel.convertJSONArrayToList( (JSONArray) vclassRes.get("individuals") )); - map.put("pages", JsonToFmModel.convertJSONArrayToList( (JSONArray) vclassRes.get("pages") )); - map.put("letters", JsonToFmModel.convertJSONArrayToList( (JSONArray) vclassRes.get("letters") )); - - return map; - } - - private Map getCommonValues( ServletContext context, VitroRequest vreq){ - Map values = new HashMap(); - - VClassGroupsForRequest vcgc = VClassGroupCache.getVClassGroups(vreq); - List cgList = vcgc.getGroups(); - LinkedList cgtmList = new LinkedList(); - for( VClassGroup classGroup : cgList){ - cgtmList.add( new VClassGroupTemplateModel( classGroup )); - } - values.put("vClassGroups",cgtmList); - - return values; - } - - protected Map doAllClassGroupsDisplay( Map params, Map page, VitroRequest request, ServletContext context) { - Map body = new HashMap(); - body.putAll(getCommonValues(context,request)); - body.putAll(getAllClassGroupData(request, params, page, context)); - - return body; - } - - /** - * Gets a list of all VClassGroups with vclasses with individual counts. - * @param params2 - */ - protected Map getAllClassGroupData(VitroRequest request, Map params, Map page, ServletContext context){ - Map map = new HashMap(); - return map; - } - - protected Map doClassDisplay( Map params, - VitroRequest request, ServletContext context) { - Map body = new HashMap(); - - body.putAll(getCommonValues(context,request)); - body.putAll(getClassData(request,params,context)); - - return body; - } - - private Map getClassData(VitroRequest request, Map params, ServletContext context) { - Map map = new HashMap(); - - map.putAll(getClassGroupData(request, params,context)); - - String classUri = getParam(Mode.VCLASS, request, params); - VitroRequest vreq = new VitroRequest(request); - VClass vclass = vreq.getWebappDaoFactory().getVClassDao().getVClassByURI(classUri); - map.put("class", new VClassTemplateModel(vclass)); - - List inds = vreq.getWebappDaoFactory().getIndividualDao() - .getIndividualsByVClass(vclass); - - List tInds = new ArrayList(inds.size()); - for( Individual ind : inds){ - tInds.add(new ListedIndividual(ind, vreq)); - } - map.put("individualsInClass", tInds); - - return map; - } - - protected Map doClassGroupDisplay(Map params, VitroRequest request, ServletContext context) { - Map body = new HashMap(); - body.putAll(getCommonValues(context,request)); - body.putAll( getClassGroupData(request,params, context)); - - return body; - } - - protected Map getClassGroupData(VitroRequest request, Map params, ServletContext context) { - Map map = new HashMap(); - - String vcgUri = getParam(Mode.CLASS_GROUP, request, params); - VitroRequest vreq = new VitroRequest(request); - - VClassGroupsForRequest vcgc = VClassGroupCache.getVClassGroups(request); - VClassGroup vcg = vcgc.getGroup(vcgUri); - - ArrayList classes = new ArrayList(vcg.size()); - for( VClass vc : vcg){ - classes.add(new VClassTemplateModel(vc)); - } - map.put("classes", classes); - - map.put("classGroup", new VClassGroupTemplateModel(vcg)); - - return map; - } - - - enum Mode{ - VCLASS_ALPHA("vclassAlpha"), - VCLASS("vclassUri"), - CLASS_GROUP("classgroupUri"), - ALL_CLASS_GROUPS("all"); - String param; - Mode(String param){ - this.param = param; - } - } - - protected final static Mode DEFAULT_MODE = Mode.ALL_CLASS_GROUPS; - - protected Mode getMode(VitroRequest request, Map params){ - for( Mode mode : Mode.values()){ - String queryParam = request.getParameter( mode.param ); - if( queryParam != null && !queryParam.isEmpty() ){ - return mode; - } - Object obj = params.get( mode.param ); - String param = obj != null ? obj.toString():null; - if( param != null && !param.isEmpty() ){ - return mode; - } - } - return DEFAULT_MODE; - } - - public static String getParam(Mode mode, VitroRequest request, Map params){ - if( request.getParameter(mode.param) != null ) - return request.getParameter(mode.param); - if( params.get(mode.param) != null ) - return params.get(mode.param).toString(); - else - return null; - } - - /** - * For processig of JSONObject - */ - public JSONObject convertToJSON(Map dataMap, VitroRequest vreq) { - JSONObject rObj = null; - return rObj; - } - - -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SparqlUpdateTestDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SparqlUpdateTestDataGetter.java deleted file mode 100644 index f6e074ca7..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SparqlUpdateTestDataGetter.java +++ /dev/null @@ -1,68 +0,0 @@ - -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; - -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.ServletContext; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.json.JSONObject; - -import com.hp.hpl.jena.query.Dataset; -import com.hp.hpl.jena.update.GraphStore; -import com.hp.hpl.jena.update.GraphStoreFactory; -import com.hp.hpl.jena.update.UpdateAction; - -import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; -import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset; - -/** - * Test to experement with Jena ARQ SPARQL update and the RDFServiceDataset. - */ -public class SparqlUpdateTestDataGetter implements PageDataGetter{ - private static final Log log = LogFactory.getLog(SparqlUpdateTestDataGetter.class); - - @Override - public Map - getData(ServletContext context, - VitroRequest vreq, String pageUri, - Map page ) - { - HashMap data = new HashMap(); - - Dataset ds = new RDFServiceDataset( vreq.getUnfilteredRDFService() ); - GraphStore graphStore = GraphStoreFactory.create(ds); - - log.warn("The SPARQL update is '"+vreq.getParameter("update")+"'"); - - UpdateAction.parseExecute( vreq.getParameter("update") , graphStore ); - - return data; - } - - - @Override - public String getType(){ - return PageDataGetterUtils.generateDataGetterTypeURI(SparqlUpdateTestDataGetter.class.getName()); - } - - - @Override - public String getDataServiceUrl() { - // TODO Auto-generated method stub - return null; - } - - - @Override - public JSONObject convertToJSON(Map map, VitroRequest vreq) { - // TODO Auto-generated method stub - return null; - } - -} From 63da01ed7b9bc159263d0de1bc9cafa40a3324a9 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Tue, 20 Aug 2013 11:42:08 -0400 Subject: [PATCH 08/46] Adding RequiresActions interface --- .../ifaces/RequiresActions.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/ifaces/RequiresActions.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/ifaces/RequiresActions.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/ifaces/RequiresActions.java new file mode 100644 index 000000000..b5dbad51f --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/ifaces/RequiresActions.java @@ -0,0 +1,34 @@ +package edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; + +/** + * Interface to objects that provide a list of Actions that are + * required for the object to be used. + * + * This is intended to provide a way to setup DataGetter + * objects to be used with the FreemarkerHttpServlet.requiredActions() + * method. + * + * @author bdc34 + */ +public interface RequiresActions { + + /** + * Returns Actions that are required to be authorized for + * the object to be used. + * + * The code that is calling this method + * could use methods from PolicyHelper to check if the + * request has authorization to do these Actions. The code + * calling this method would then have the ability to + * deny the action if it is not authorized. + * + * @param vreq + * @return Should not be null. Return Actions.AUTHORIZED + * if no authorization is required to do use the object. + */ + public Actions requiredActions(VitroRequest vreq) ; + +} From 2c5ce8c5ce2ad753fe2c37b88ce6dc85f7c1d6d3 Mon Sep 17 00:00:00 2001 From: j2blake Date: Tue, 20 Aug 2013 15:25:57 -0400 Subject: [PATCH 09/46] VIVO-248 Move filegraph RDF files into the home directory --- webapp/build.xml | 31 +++- .../tbox/filegraph}/vitro-0.7.owl | 0 .../tbox/filegraph}/vitroPublic.owl | 0 .../webapp/servlet/setup/FileGraphSetup.java | 150 +++++++++++------- 4 files changed, 119 insertions(+), 62 deletions(-) rename webapp/{web/WEB-INF/filegraph/tbox => rdffiles/tbox/filegraph}/vitro-0.7.owl (100%) rename webapp/{web/WEB-INF/filegraph/tbox => rdffiles/tbox/filegraph}/vitroPublic.owl (100%) diff --git a/webapp/build.xml b/webapp/build.xml index 05e3edec9..6aae2b2af 100644 --- a/webapp/build.xml +++ b/webapp/build.xml @@ -69,6 +69,9 @@ + + + @@ -194,6 +197,21 @@ + + + + + + + + + + + + + @@ -369,12 +387,22 @@ + + + + + + + + @@ -399,6 +427,7 @@ + diff --git a/webapp/web/WEB-INF/filegraph/tbox/vitro-0.7.owl b/webapp/rdffiles/tbox/filegraph/vitro-0.7.owl similarity index 100% rename from webapp/web/WEB-INF/filegraph/tbox/vitro-0.7.owl rename to webapp/rdffiles/tbox/filegraph/vitro-0.7.owl diff --git a/webapp/web/WEB-INF/filegraph/tbox/vitroPublic.owl b/webapp/rdffiles/tbox/filegraph/vitroPublic.owl similarity index 100% rename from webapp/web/WEB-INF/filegraph/tbox/vitroPublic.owl rename to webapp/rdffiles/tbox/filegraph/vitroPublic.owl diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java index f734f2054..94c464cae 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java @@ -2,13 +2,17 @@ package edu.cornell.mannlib.vitro.webapp.servlet.setup; -import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -26,23 +30,36 @@ import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; +import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; +import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; // This ContextListener must run after the JenaDataSourceSetup ContextListener public class FileGraphSetup implements ServletContextListener { + private static final Log log = LogFactory.getLog(FileGraphSetup.class); + private static final String RDFFILES = "rdffiles"; private static final String ABOX = "abox"; private static final String TBOX = "tbox"; - private static final String PATH_ROOT = "/WEB-INF/filegraph/"; + private static final String FILEGRAPH = "filegraph"; + private static final String PROPERTY_VITRO_HOME = "vitro.home"; + public static final String FILEGRAPH_URI_ROOT = "http://vitro.mannlib.cornell.edu/filegraph/"; + + /** Ignore hidden files when looking for filegraph RDF. */ + private static final DirectoryStream.Filter REJECT_HIDDEN_FILES = new DirectoryStream.Filter() { + @Override + public boolean accept(Path entry) throws IOException { + return !Files.isHidden(entry); + } + }; - private static final Log log = LogFactory.getLog(FileGraphSetup.class); - - public void contextInitialized(ServletContextEvent sce) { + @Override + public void contextInitialized(ServletContextEvent sce) { boolean aboxChanged = false; // indicates whether any ABox file graph model has changed boolean tboxChanged = false; // indicates whether any TBox file graph model has changed @@ -57,24 +74,20 @@ public class FileGraphSetup implements ServletContextListener { RDFServiceModelMaker maker = new RDFServiceModelMaker(RDFServiceUtils.getRDFServiceFactory(ctx)); // ABox files - Set pathSet = ctx.getResourcePaths(PATH_ROOT + ABOX); + Set paths = getFilegraphPaths(ctx, RDFFILES, ABOX, FILEGRAPH); - cleanupDB(dataset, pathToURI(pathSet, ABOX), ABOX); + cleanupDB(dataset, pathsToURIs(paths, ABOX), ABOX); - if (pathSet != null) { - OntModel aboxBaseModel = baseOms.getABoxModel(); - aboxChanged = readGraphs(sce, pathSet, maker, ABOX, aboxBaseModel); - } + OntModel aboxBaseModel = baseOms.getABoxModel(); + aboxChanged = readGraphs(paths, maker, ABOX, aboxBaseModel); // TBox files - pathSet = ctx.getResourcePaths(PATH_ROOT + TBOX); + paths = getFilegraphPaths(ctx, RDFFILES, TBOX, FILEGRAPH); - cleanupDB(dataset, pathToURI(pathSet, TBOX),TBOX); + cleanupDB(dataset, pathsToURIs(paths, TBOX),TBOX); - if (pathSet != null) { - OntModel tboxBaseModel = baseOms.getTBoxModel(); - tboxChanged = readGraphs(sce, pathSet, maker, TBOX, tboxBaseModel); - } + OntModel tboxBaseModel = baseOms.getTBoxModel(); + tboxChanged = readGraphs(paths, maker, TBOX, tboxBaseModel); } catch (ClassCastException cce) { String errMsg = "Unable to cast servlet context attribute to the appropriate type " + cce.getLocalizedMessage(); log.error(errMsg); @@ -99,7 +112,35 @@ public class FileGraphSetup implements ServletContextListener { } } - /* + private Set getFilegraphPaths(ServletContext ctx, String... strings) { + StartupStatus ss = StartupStatus.getBean(ctx); + + ConfigurationProperties props = ConfigurationProperties.getBean(ctx); + String homeDirProperty = props.getProperty(PROPERTY_VITRO_HOME); + Path filegraphDir = Paths.get(homeDirProperty, strings); + + Set paths = new TreeSet<>(); + if (Files.isDirectory(filegraphDir)) { + try (DirectoryStream stream = Files.newDirectoryStream( + filegraphDir, REJECT_HIDDEN_FILES)) { + for (Path p : stream) { + paths.add(p); + } + ss.info(this, "Read " + paths.size() + " RDF files from '" + + filegraphDir + "'"); + } catch (IOException e) { + ss.fatal(this, "Failed to read filegraph RDF from '" + + filegraphDir + "' directory.", e); + } + } else { + ss.info(this, "Filegraph directory '" + filegraphDir + + "' doesn't exist."); + } + log.debug("Paths from '" + filegraphDir + "': " + paths); + return paths; + } + + /* * Reads the graphs stored as files in sub-directories of * 1. updates the SDB store to reflect the current contents of the graph. * 2. adds the graph as an in-memory submodel of the base in-memory graph @@ -107,7 +148,7 @@ public class FileGraphSetup implements ServletContextListener { * Note: no connection needs to be maintained between the in-memory copy of the * graph and the DB copy. */ - public boolean readGraphs(ServletContextEvent sce, Set pathSet, RDFServiceModelMaker dataset, String type, OntModel baseModel) { + public boolean readGraphs(Set pathSet, RDFServiceModelMaker dataset, String type, OntModel baseModel) { int count = 0; @@ -115,18 +156,17 @@ public class FileGraphSetup implements ServletContextListener { // For each file graph in the target directory update or add that graph to // the Jena SDB, and attach the graph as a submodel of the base model - for ( String p : pathSet ) { + for ( Path p : pathSet ) { count++; // note this will count the empty files too - File file = new File(sce.getServletContext().getRealPath(p)); - try { - FileInputStream fis = new FileInputStream( file ); + FileInputStream fis = new FileInputStream( p.toFile() ); try { OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - if ( p.endsWith(".n3") || p.endsWith(".N3") || p.endsWith(".ttl") || p.endsWith(".TTL") ) { + String fn = p.getFileName().toString().toLowerCase(); + if ( fn.endsWith(".n3") || fn.endsWith(".ttl") ) { model.read( fis, null, "N3" ); - } else if ( p.endsWith(".owl") || p.endsWith(".OWL") || p.endsWith(".rdf") || p.endsWith(".RDF") || p.endsWith(".xml") || p.endsWith(".XML") ) { + } else if ( fn.endsWith(".owl") || fn.endsWith(".rdf") || fn.endsWith(".xml") ) { model.read( fis, null, "RDF/XML" ); } else { log.warn("Ignoring " + type + " file graph " + p + " because the file extension is unrecognized."); @@ -134,7 +174,7 @@ public class FileGraphSetup implements ServletContextListener { if ( !model.isEmpty() ) { baseModel.addSubModel(model); - log.info("Attached file graph as " + type + " submodel " + p); + log.info("Attached file graph as " + type + " submodel " + pathToURI(p, type)); } modelChanged = modelChanged | updateGraphInDB(dataset, model, type, p); @@ -155,8 +195,8 @@ public class FileGraphSetup implements ServletContextListener { log.warn("Exception while trying to close file graph file: " + p,ioe); } } // end - for - - System.out.println("Read " + count + " " + type + " file graph" + ((count == 1) ? "" : "s") + " from " + PATH_ROOT + type); + + log.info("Read " + count + " " + type + " file graph" + ((count == 1) ? "" : "s")); return modelChanged; } @@ -171,7 +211,7 @@ public class FileGraphSetup implements ServletContextListener { * Otherwise, if a graph with the given name is in the DB and is isomorphic with * the graph that was read from the files system, then do nothing. */ - public boolean updateGraphInDB(RDFServiceModelMaker dataset, Model fileModel, String type, String path) { + public boolean updateGraphInDB(RDFServiceModelMaker dataset, Model fileModel, String type, Path path) { String graphURI = pathToURI(path,type); Model dbModel = dataset.getModel(graphURI); boolean modelChanged = false; @@ -224,46 +264,34 @@ public class FileGraphSetup implements ServletContextListener { return; } + /* + * Takes a set of paths for file graphs and returns a set containing a graph + * uri for each path. + */ + private Set pathsToURIs(Set paths, String type) { + HashSet uriSet = new HashSet(); + for (Path path : paths) { + uriSet.add(pathToURI(path, type)); + } + log.debug("uriSet = " + uriSet); + return uriSet; + } + /* - * Takes a set of path names for file graphs and returns a set containing - * a graph uri for each path name in the input set. If pathSet is null - * returns an empty set. - */ - public Set pathToURI (Set pathSet, String type) { - - HashSet uriSet = new HashSet(); - - if (pathSet != null) { - for ( String path : pathSet ) { - uriSet.add(pathToURI(path,type)); - } - } - - return uriSet; - } - - /* - * Takes a path name for a file graph and returns the corresponding SDB URI + * Takes a path for a file graph and returns the corresponding SDB URI * for the graph. The correspondence is by defined convention. */ - public String pathToURI(String path, String type) { - - String uri = null; - - if (path != null) { - File file = new File(path); - uri = FILEGRAPH_URI_ROOT + type + "/" + file.getName(); - } - - return uri; + private String pathToURI(Path path, String type) { + return FILEGRAPH_URI_ROOT + type + "/" + path.getFileName(); } - - public void contextDestroyed( ServletContextEvent sce ) { + + @Override + public void contextDestroyed( ServletContextEvent sce ) { // nothing to do } private static boolean isUpdateRequired(ServletContext ctx) { return (ctx.getAttribute(UpdateKnowledgeBase.KBM_REQURIED_AT_STARTUP) != null); } - + } From 290333a21ed84422785d384613f97e7472ee3945 Mon Sep 17 00:00:00 2001 From: j2blake Date: Tue, 20 Aug 2013 17:13:48 -0400 Subject: [PATCH 10/46] VIVO-248 Move more RDF files into the home directory Files for initializing the TBOX, ABOX, ApplicationMetadata and UserAccounts models. --- .../servlet/setup/ContentModelSetup.java | 66 ++++++---- .../setup/JenaDataSourceSetupBase.java | 7 +- .../webapp/servlet/setup/RDFFilesLoader.java | 118 ++++++++++++++++++ .../webapp/servlet/setup/UserModelSetup.java | 6 +- .../utils/jena/InitialJenaModelUtils.java | 64 ---------- 5 files changed, 160 insertions(+), 101 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/jena/InitialJenaModelUtils.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java index 454d5474c..ab983464f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java @@ -24,11 +24,13 @@ import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.shared.Lock; import com.hp.hpl.jena.util.ResourceUtils; +import com.hp.hpl.jena.util.iterator.ClosableIterator; import com.hp.hpl.jena.vocabulary.RDF; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.FactoryID; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelID; +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig; import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelSynchronizer; @@ -40,7 +42,6 @@ import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; -import edu.cornell.mannlib.vitro.webapp.utils.jena.InitialJenaModelUtils; /** * Sets up the content models, OntModelSelectors and webapp DAO factories. @@ -79,9 +80,16 @@ public class ContentModelSetup extends JenaDataSourceSetupBase OntModel unionABoxModel = createCombinedBulkUpdatingModel(baseABoxModel, inferenceABoxModel); OntModel unionTBoxModel = createCombinedBulkUpdatingModel(baseTBoxModel, inferenceTBoxModel); + if (isFirstStartup()) { - loadInitialApplicationMetadataModel(applicationMetadataModel, ctx); - loadDataFromFilesystem(baseABoxModel, baseTBoxModel, applicationMetadataModel, ctx); + RDFFilesLoader loader = new RDFFilesLoader(ctx); + loader.loadFirstTimeFiles("abox", baseABoxModel, true); + loader.loadFirstTimeFiles("tbox", baseTBoxModel, true); + + loader.loadFirstTimeFiles("applicationMetadata", applicationMetadataModel, true); + setPortalUriOnFirstTime(applicationMetadataModel, ctx); + } else { + checkForNamespaceMismatch( applicationMetadataModel, ctx ); } log.info("Setting up full models"); @@ -101,7 +109,6 @@ public class ContentModelSetup extends JenaDataSourceSetupBase models.setOntModel(ModelID.UNION_TBOX, unionTBoxModel); models.setOntModel(ModelID.UNION_FULL, unionFullModel); - checkForNamespaceMismatch( applicationMetadataModel, ctx ); log.info("Setting up DAO factories"); @@ -159,35 +166,40 @@ public class ContentModelSetup extends JenaDataSourceSetupBase return ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC, unionModel); } - private void loadInitialApplicationMetadataModel(OntModel applicationMetadataModel, - ServletContext ctx) { - try { - applicationMetadataModel.add( - InitialJenaModelUtils.loadInitialModel(ctx, getDefaultNamespace(ctx))); - } catch (Throwable e) { - throw new RuntimeException("Unable to load application metadata model cache from DB", e); - } - } - - private void loadDataFromFilesystem(OntModel baseABoxModel, OntModel baseTBoxModel, OntModel applicationMetadataModel, - ServletContext ctx) { - Long startTime = System.currentTimeMillis(); - log.info("Initializing models from RDF files"); - - readOntologyFilesInPathSet(USER_ABOX_PATH, ctx, baseABoxModel); - readOntologyFilesInPathSet(USER_TBOX_PATH, ctx, baseTBoxModel); - readOntologyFilesInPathSet(USER_APPMETA_PATH, ctx, applicationMetadataModel); - - log.debug(((System.currentTimeMillis() - startTime) / 1000) - + " seconds to read RDF files "); - } - private long secondsSince(long startTime) { return (System.currentTimeMillis() - startTime) / 1000; } /* ===================================================================== */ + /** + * If we are loading the application metadata for the first time, set the + * URI of the Portal based on the default namespace. + */ + private void setPortalUriOnFirstTime(OntModel model, ServletContext ctx) { + // currently, only a single portal is permitted in the initialization + // data + Resource portalResource = null; + ClosableIterator portalResIt = model + .listSubjectsWithProperty(RDF.type, + model.getResource(VitroVocabulary.PORTAL)); + try { + if (portalResIt.hasNext()) { + Resource portalRes = portalResIt.next(); + if (portalRes.isAnon()) { + portalResource = portalRes; + } + } + } finally { + portalResIt.close(); + } + + if (portalResource != null) { + ResourceUtils.renameResource(portalResource, getDefaultNamespace(ctx) + "portal1"); + } + } + + /** * If we find a "portal1" portal (and we should), its URI should use the * default namespace. diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java index f56d75a3d..4e89c46bf 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java @@ -70,11 +70,6 @@ public class JenaDataSourceSetupBase extends JenaBaseDaoCon { DEFAULT_TESTONRETURN = true, DEFAULT_TESTWHILEIDLE = true; protected static String BASE = "/WEB-INF/ontologies/"; - protected static String USERPATH = BASE+"user/"; - protected static String USER_ABOX_PATH = BASE+"user/abox"; - protected static String USER_TBOX_PATH = BASE+"user/tbox"; - protected static String USER_APPMETA_PATH = BASE+"user/applicationMetadata"; - protected static String SYSTEMPATH = BASE+"system/"; public static String APPPATH = BASE+"app/"; //these files are loaded everytime the system starts up public static String APPPATH_LOAD = APPPATH + "menuload/"; @@ -395,6 +390,7 @@ public class JenaDataSourceSetupBase extends JenaBaseDaoCon { return dbModel; } + // TODO get rid of this? public static void readOntologyFilesInPathSet(String path, ServletContext ctx, Model model) { log.debug("Reading ontology files from '" + path + "'"); @@ -406,6 +402,7 @@ public class JenaDataSourceSetupBase extends JenaBaseDaoCon { } } + // TODO get rid of this? public static void readOntologyFileFromPath(String p, Model model, ServletContext ctx) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java new file mode 100644 index 000000000..d0b151013 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java @@ -0,0 +1,118 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.servlet.setup; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Set; +import java.util.TreeSet; + +import javax.servlet.ServletContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.hp.hpl.jena.rdf.model.Model; + +import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; + +/** + * Help to load RDF files on first time and on every startup. + */ +public class RDFFilesLoader { + private static final Log log = LogFactory.getLog(RDFFilesLoader.class); + + private static final String PROPERTY_VITRO_HOME = "vitro.home"; + private static final String DEFAULT_RDF_FORMAT = "RDF/XML"; + private static final String FIRST_TIME = "firsttime"; + + /** Directory filter that ignores sub-directories and hidden files. */ + private static final DirectoryStream.Filter RDF_FILE_FILTER = new DirectoryStream.Filter() { + @Override + public boolean accept(Path p) throws IOException { + if (Files.isHidden(p)) { + return false; + } + if (Files.isDirectory(p)) { + log.warn("RDF files in subdirectories are not loaded. Directory '" + + p + "' ignored."); + return false; + } + return true; + } + }; + + private final String homeDirProperty; + + public RDFFilesLoader(ServletContext ctx) { + ConfigurationProperties props = ConfigurationProperties.getBean(ctx); + this.homeDirProperty = props.getProperty(PROPERTY_VITRO_HOME); + } + + /** + * Load the "first time" files if the model is empty. + */ + public void loadFirstTimeFiles(String modelPath, Model model) { + loadFirstTimeFiles(modelPath, model, model.isEmpty()); + } + + /** + * Load the "first time" files if we say it is the first time. + */ + public void loadFirstTimeFiles(String modelPath, Model model, boolean firstTime) { + if (firstTime) { + Set paths = getPaths(homeDirProperty, modelPath, FIRST_TIME); + for (Path p : paths) { + readOntologyFileIntoModel(p, model); + } + } + } + + private Set getPaths(String parentDir, String... strings) { + Path dir = Paths.get(parentDir, strings); + + Set paths = new TreeSet<>(); + if (Files.isDirectory(dir)) { + try (DirectoryStream stream = Files.newDirectoryStream(dir, + RDF_FILE_FILTER)) { + for (Path p : stream) { + paths.add(p); + } + } catch (IOException e) { + log.warn("Failed to read directory '" + dir + "'", e); + } + } else { + log.debug("Filegraph directory '" + dir + "' doesn't exist."); + } + log.debug("Paths from '" + dir + "': " + paths); + return paths; + } + + private static void readOntologyFileIntoModel(Path p, Model model) { + String format = getRdfFormat(p); + log.info("Loading ontology file at " + p + " as format " + format); + try (InputStream stream = new FileInputStream(p.toFile())) { + model.read(stream, null, format); + log.debug("...successful"); + } catch (IOException e) { + log.error("Failed to load ontology file at '" + p + "' as format " + + format, e); + } + } + + private static String getRdfFormat(Path p) { + String filename = p.getFileName().toString().toLowerCase(); + if (filename.endsWith("n3")) + return "N3"; + else if (filename.endsWith("ttl")) + return "TURTLE"; + else + return DEFAULT_RDF_FORMAT; + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java index 47b51a5a3..dcae1a549 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java @@ -24,8 +24,6 @@ import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; */ public class UserModelSetup extends JenaDataSourceSetupBase implements ServletContextListener { - protected static String AUTHPATH = BASE + "auth/"; - private static final Log log = LogFactory.getLog( UserModelSetup.class.getName()); @@ -58,9 +56,7 @@ public class UserModelSetup extends JenaDataSourceSetupBase ModelFactory.createOntologyModel( MEM_ONT_MODEL_SPEC); // This is used in Selenium testing, when we load user accounts from a file. - if (userAccountsDbModel.isEmpty()) { - readOntologyFilesInPathSet(AUTHPATH, ctx, userAccountsDbModel); - } + new RDFFilesLoader(ctx).loadFirstTimeFiles("auth", userAccountsDbModel); userAccountsModel.add(userAccountsDbModel); userAccountsModel.getBaseModel().register( diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/jena/InitialJenaModelUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/jena/InitialJenaModelUtils.java deleted file mode 100644 index 06bb59872..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/jena/InitialJenaModelUtils.java +++ /dev/null @@ -1,64 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.utils.jena; - -import javax.servlet.ServletContext; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.hp.hpl.jena.ontology.OntModel; -import com.hp.hpl.jena.ontology.OntModelSpec; -import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.rdf.model.ModelFactory; -import com.hp.hpl.jena.rdf.model.Resource; -import com.hp.hpl.jena.util.ResourceUtils; -import com.hp.hpl.jena.util.iterator.ClosableIterator; -import com.hp.hpl.jena.vocabulary.RDF; - -import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; -import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase; - -public class InitialJenaModelUtils { - - private static final String INIT_DATA_DIRECTORY = "/WEB-INF/init-data"; - - private static final Log log = LogFactory.getLog(InitialJenaModelUtils.class); - - public static Model loadInitialModel(ServletContext ctx, String defaultNamespace) { - - OntModel initialModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - - try { - JenaDataSourceSetupBase.readOntologyFilesInPathSet(INIT_DATA_DIRECTORY, ctx, initialModel); - } catch (Throwable t) { - log.warn("Unable to read initial model data from " + INIT_DATA_DIRECTORY, t); - } - - if (initialModel.size() == 0) { - return initialModel; - } - - //find and rename portal object - //currently, only a single portal is permitted in the initialization data - Resource portalResource = null; - ClosableIterator portalResIt = initialModel.listSubjectsWithProperty(RDF.type, initialModel.getResource(VitroVocabulary.PORTAL)); - try { - if (portalResIt.hasNext()) { - Resource portalRes = portalResIt.next(); - if (portalRes.isAnon()) { - portalResource = portalRes; - } - } - } finally { - portalResIt.close(); - } - if (portalResource != null) { - ResourceUtils.renameResource(portalResource, defaultNamespace + "portal1"); - } - - return initialModel; - - } - -} From f2312a4067f439e599f43266d6ec9e7e73058f38 Mon Sep 17 00:00:00 2001 From: j2blake Date: Wed, 21 Aug 2013 11:27:29 -0400 Subject: [PATCH 11/46] VIVO-248 Move more RDF files into the home directory Files for initializing the display, displayTbox and displayDisplay models. Also restructure the RDFFilesLoader. --- .../everytime}/displayModelListViews.rdf | 0 .../display/firsttime}/application.owl | 0 .../display/firsttime}/menu.n3 | 0 .../display/firsttime}/profilePageType.n3 | 0 .../everytime}/displayDisplay.n3 | 0 .../displayTbox/everytime}/displayTBOX.n3 | 0 .../beans/FileBasedProhibitedFromSearch.java | 6 +- .../servlet/setup/ApplicationModelSetup.java | 159 ++---------------- .../servlet/setup/ContentModelSetup.java | 7 +- .../setup/JenaDataSourceSetupBase.java | 91 ---------- .../webapp/servlet/setup/RDFFilesLoader.java | 105 +++++++++--- .../webapp/servlet/setup/UserModelSetup.java | 97 +++++------ 12 files changed, 151 insertions(+), 314 deletions(-) rename webapp/{web/WEB-INF/ontologies/app/loadedAtStartup => rdffiles/display/everytime}/displayModelListViews.rdf (100%) rename webapp/{web/WEB-INF/ontologies/app => rdffiles/display/firsttime}/application.owl (100%) rename webapp/{web/WEB-INF/ontologies/app => rdffiles/display/firsttime}/menu.n3 (100%) rename webapp/{web/WEB-INF/ontologies/app => rdffiles/display/firsttime}/profilePageType.n3 (100%) rename webapp/{web/WEB-INF/ontologies/app/menuload => rdffiles/displayDisplay/everytime}/displayDisplay.n3 (100%) rename webapp/{web/WEB-INF/ontologies/app/menuload => rdffiles/displayTbox/everytime}/displayTBOX.n3 (100%) diff --git a/webapp/web/WEB-INF/ontologies/app/loadedAtStartup/displayModelListViews.rdf b/webapp/rdffiles/display/everytime/displayModelListViews.rdf similarity index 100% rename from webapp/web/WEB-INF/ontologies/app/loadedAtStartup/displayModelListViews.rdf rename to webapp/rdffiles/display/everytime/displayModelListViews.rdf diff --git a/webapp/web/WEB-INF/ontologies/app/application.owl b/webapp/rdffiles/display/firsttime/application.owl similarity index 100% rename from webapp/web/WEB-INF/ontologies/app/application.owl rename to webapp/rdffiles/display/firsttime/application.owl diff --git a/webapp/web/WEB-INF/ontologies/app/menu.n3 b/webapp/rdffiles/display/firsttime/menu.n3 similarity index 100% rename from webapp/web/WEB-INF/ontologies/app/menu.n3 rename to webapp/rdffiles/display/firsttime/menu.n3 diff --git a/webapp/web/WEB-INF/ontologies/app/profilePageType.n3 b/webapp/rdffiles/display/firsttime/profilePageType.n3 similarity index 100% rename from webapp/web/WEB-INF/ontologies/app/profilePageType.n3 rename to webapp/rdffiles/display/firsttime/profilePageType.n3 diff --git a/webapp/web/WEB-INF/ontologies/app/menuload/displayDisplay.n3 b/webapp/rdffiles/displayDisplay/everytime/displayDisplay.n3 similarity index 100% rename from webapp/web/WEB-INF/ontologies/app/menuload/displayDisplay.n3 rename to webapp/rdffiles/displayDisplay/everytime/displayDisplay.n3 diff --git a/webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 b/webapp/rdffiles/displayTbox/everytime/displayTBOX.n3 similarity index 100% rename from webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 rename to webapp/rdffiles/displayTbox/everytime/displayTBOX.n3 diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/FileBasedProhibitedFromSearch.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/FileBasedProhibitedFromSearch.java index 45549f9f7..3f7502a64 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/FileBasedProhibitedFromSearch.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/FileBasedProhibitedFromSearch.java @@ -3,12 +3,10 @@ package edu.cornell.mannlib.vitro.webapp.search.beans; import java.io.File; -import java.io.FileInputStream; import com.hp.hpl.jena.ontology.OntModel; -import com.hp.hpl.jena.rdf.model.ModelFactory; -import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase; +import edu.cornell.mannlib.vitro.webapp.servlet.setup.RDFFilesLoader; public class FileBasedProhibitedFromSearch extends ProhibitedFromSearch { @@ -19,7 +17,7 @@ public class FileBasedProhibitedFromSearch extends ProhibitedFromSearch { * @param dir to find N3 files in. */ public FileBasedProhibitedFromSearch(String uri, File dir){ - super( uri, JenaDataSourceSetupBase.getModelFromDir(dir)); + super( uri, RDFFilesLoader.getModelFromDir(dir)); } public FileBasedProhibitedFromSearch(String URI, OntModel model) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ApplicationModelSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ApplicationModelSetup.java index 366cbc5d6..7bb26c752 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ApplicationModelSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ApplicationModelSetup.java @@ -1,9 +1,6 @@ /* $This file is distributed under the terms of the license in /doc/license.txt$ */ package edu.cornell.mannlib.vitro.webapp.servlet.setup; -import java.io.File; -import java.io.FileOutputStream; - import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; @@ -11,14 +8,8 @@ import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.joda.time.DateTime; -import org.joda.time.format.ISODateTimeFormat; import com.hp.hpl.jena.ontology.OntModel; -import com.hp.hpl.jena.query.Query; -import com.hp.hpl.jena.query.QueryExecution; -import com.hp.hpl.jena.query.QueryExecutionFactory; -import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; @@ -58,16 +49,15 @@ implements ServletContextListener { try { Model displayDbModel = makeDBModel(bds, JENA_DISPLAY_METADATA_MODEL, DB_ONT_MODEL_SPEC, ctx); - if (displayDbModel.size() == 0) { - readOntologyFilesInPathSet(APPPATH, ctx,displayDbModel); - } + RDFFilesLoader.loadFirstTimeFiles(ctx, "display", displayDbModel, displayDbModel.isEmpty()); + OntModel displayModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC); displayModel.add(displayDbModel); displayModel.getBaseModel().register(new ModelSynchronizer(displayDbModel)); ModelAccess.on(ctx).setDisplayModel(displayModel); - //at each startup load all RDF files from directory to sub-models of display model - initializeDisplayLoadedAtStartup(ctx, displayModel); + //at each startup load all RDF files from directory to sub-models of display model + RDFFilesLoader.loadEveryTimeFiles(ctx, "display", displayModel); } catch (Throwable t) { log.error("Unable to load user application configuration model", t); ss.fatal(this, "Unable to load user application configuration model", t); @@ -78,158 +68,35 @@ implements ServletContextListener { Model displayTboxModel = makeDBModel(bds, JENA_DISPLAY_TBOX_MODEL, DB_ONT_MODEL_SPEC, ctx); - //Reading in single file every time, needs to be cleared/removed every time - readOntologyFileFromPath(APPPATH_LOAD + "displayTBOX.n3", displayTboxModel, ctx); - OntModel appTBOXModel = ModelFactory.createOntologyModel( - MEM_ONT_MODEL_SPEC); + OntModel appTBOXModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC); appTBOXModel.add(displayTboxModel); appTBOXModel.getBaseModel().register(new ModelSynchronizer(displayTboxModel)); ModelAccess.on(ctx).setOntModel(ModelID.DISPLAY_TBOX, appTBOXModel); - log.debug("Loaded file " + APPPATH_LOAD + "displayTBOX.n3 into display tbox model"); + + //Reading in every time, needs to be cleared/removed every time + RDFFilesLoader.loadEveryTimeFiles(ctx, "displayTbox", appTBOXModel); } catch (Throwable t) { log.error("Unable to load user application configuration model TBOX", t); ss.fatal(this, "Unable to load user application configuration model TBOX", t); } - //Display Display model, currently empty, create if doesn't exist but no files to load + //Display Display model, currently reading in every time try { Model displayDisplayModel = makeDBModel(bds, JENA_DISPLAY_DISPLAY_MODEL, DB_ONT_MODEL_SPEC, ctx); - //Reading in single file every time, needs to be cleared/removed every - readOntologyFileFromPath(APPPATH_LOAD + "displayDisplay.n3", displayDisplayModel, ctx); - OntModel appDisplayDisplayModel = ModelFactory.createOntologyModel( - MEM_ONT_MODEL_SPEC); + OntModel appDisplayDisplayModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC); appDisplayDisplayModel.add(displayDisplayModel); appDisplayDisplayModel.getBaseModel().register(new ModelSynchronizer(displayDisplayModel)); ModelAccess.on(ctx).setOntModel(ModelID.DISPLAY_DISPLAY, appDisplayDisplayModel); - log.debug("Loaded file " + APPPATH_LOAD + "displayDisplay.n3 into display display model"); + + //Reading in every time, needs to be cleared/removed every time + RDFFilesLoader.loadEveryTimeFiles(ctx, "displayDisplay", appDisplayDisplayModel); } catch (Throwable t) { log.error("Unable to load user application configuration model Display Model", t); ss.fatal(this, "Unable to load user application configuration model Display Model", t); } } - - /** - * Load the RDF found in the directory DISPLAY_MODEL_LOAD_AT_STARTUP_DIR - * a sub-models of displayModel. The RDF from thes files will not be saved - * in the database and it will be reloaded each time the system starts up. - */ - private void initializeDisplayLoadedAtStartup(ServletContext ctx, OntModel displayModel){ - log.info("loading display model from files in " + ctx.getRealPath(DISPLAY_MODEL_LOAD_AT_STARTUP_DIR) ); - Model displayLoadAtStartup = readInDisplayModelLoadAtStartup(ctx); - - if( log.isDebugEnabled() ){ - log.debug("loaded display model from files in " + ctx.getRealPath(DISPLAY_MODEL_LOAD_AT_STARTUP_DIR) ); - displayLoadAtStartup.write(System.out, "N3-PP"); - } - - checkForOldListViews(ctx,displayModel,displayLoadAtStartup); - displayModel.addSubModel( displayLoadAtStartup ); - } - - protected Model readInDisplayModelLoadAtStartup( ServletContext ctx ){ - return getModelFromDir( new File( ctx.getRealPath( DISPLAY_MODEL_LOAD_AT_STARTUP_DIR ))); - } - - /** - * All of the list views should now reside in files in DISPLAY_MODEL_LOAD_AT_STARTUP_DIR. - * This will check for custom list view annotation statements in the displayModel, check - * if they exist in the files in DISPLAY_MODEL_LOAD_AT_STARTUP_DIR, and write any that don't - * exist there to a file in DISPLAY_MODEL_LOAD_AT_STARTUP_DIR. After that the statements - * will be removed from the displayDBModel. - * - * returns true if there were old list view statements in the DB, returns false - * if there were none. displayLoadAlways should be reloaded from the file system - * if this returns true as this method may have changed the files. - * - * displayLoadAtStartup and displayModel may be modified. - */ - private void checkForOldListViews( ServletContext ctx, OntModel displayModel, Model displayLoadAtStartup){ - // run construct for old custom list view statements from displayModel - Model oldListViewModel = getOldListViewStatements( displayModel ); - if( log.isDebugEnabled() ){ - log.debug("Printing the old list view statements from the display model to System.out."); - oldListViewModel.write(System.out,"N3-PP"); - } - - // find statements in old stmts that are not in loadedAtStartup and - // save them in a new file in DISPLAY_MODEL_LOAD_AT_STARTUP_DIR - // so that in the future they will be in loadedAtStartup - Model stmtsInOldAndFiles = displayLoadAtStartup.intersection( displayModel ); - Model unhandledOldListViewStmts = oldListViewModel.difference( stmtsInOldAndFiles ); - - boolean saved = false; - boolean neededSave = false; - - if( unhandledOldListViewStmts != null && !unhandledOldListViewStmts.isEmpty() ){ - log.debug("need to deal with old list view statements from the display model"); - neededSave = true; - try{ - //create a file for the old statements in the loadAtStartup directory - String newFileName = ctx.getRealPath( - DISPLAY_MODEL_LOAD_AT_STARTUP_DIR + File.separator - + new DateTime().toString(ISODateTimeFormat.basicDateTime()) + ".n3" ); - File file = new File( newFileName ); - file.createNewFile(); - - log.info("Relocating " + unhandledOldListViewStmts.size() + " custom list view statements from DB and saving to " - + file.getAbsolutePath()+ File.separator + file.getName() - + ". These will be loaded from this file when the system starts up."); - - FileOutputStream fileOut = new FileOutputStream(file); - unhandledOldListViewStmts.write(fileOut, "N3-PP"); - fileOut.close(); - saved = true; - }catch(Throwable th){ - log.warn("Could not save old list view statements. Leaving them in the DB",th); - } - - //need to reload displayLoadAlways because DISPLAY_MODEL_LOAD_AT_STARTUP_DIR may have changed - displayLoadAtStartup.removeAll().add(readInDisplayModelLoadAtStartup(ctx)); - } - - - if( oldListViewModel != null && ! oldListViewModel.isEmpty() ){ - //At this point, there are old list view statements in the DB but they - //should are all redundant with ones in DISPLAY_MODEL_LOAD_AT_STARTUP_DIR - if( (neededSave && saved) || (!neededSave) ){ - //if there was nothing to save, just remove the old stuff - //if there was stuff to save, only remove if it was saved. - log.debug("removing old statements from displayModel"); - displayModel.remove(oldListViewModel); - } - } - - } - - private Model getOldListViewStatements(OntModel displayModel) { - //run a construct on displayModel to get all list view statements - Query query = QueryFactory.create ( listViewQuery ); - QueryExecution qexec = QueryExecutionFactory.create(query, displayModel) ; - Model oldModel = null; - - try { - oldModel = qexec.execConstruct(); - } catch( Throwable th ){ - log.error("could not check for old custom list views, query exception",th); - }finally { - qexec.close() ; - } - - if( oldModel != null) - return oldModel; - else - return ModelFactory.createDefaultModel(); - } - - private static final String listViewQuery = "" + - "PREFIX d: \n" + - "CONSTRUCT { \n" + - " ?a d:listViewConfigFile ?b . \n" + - "} WHERE {\n" + - " ?a d:listViewConfigFile ?b . \n" + - "} "; @Override public void contextDestroyed(ServletContextEvent arg0) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java index ab983464f..02ec7bf8d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java @@ -82,11 +82,10 @@ public class ContentModelSetup extends JenaDataSourceSetupBase if (isFirstStartup()) { - RDFFilesLoader loader = new RDFFilesLoader(ctx); - loader.loadFirstTimeFiles("abox", baseABoxModel, true); - loader.loadFirstTimeFiles("tbox", baseTBoxModel, true); + RDFFilesLoader.loadFirstTimeFiles(ctx, "abox", baseABoxModel, true); + RDFFilesLoader.loadFirstTimeFiles(ctx, "tbox", baseTBoxModel, true); - loader.loadFirstTimeFiles("applicationMetadata", applicationMetadataModel, true); + RDFFilesLoader.loadFirstTimeFiles(ctx, "applicationMetadata", applicationMetadataModel, true); setPortalUriOnFirstTime(applicationMetadataModel, ctx); } else { checkForNamespaceMismatch( applicationMetadataModel, ctx ); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java index 4e89c46bf..b79b71fa2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java @@ -3,11 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.servlet.setup; import java.beans.PropertyVetoException; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; import java.sql.SQLException; -import java.util.Set; import javax.servlet.ServletContext; import javax.sql.DataSource; @@ -69,16 +65,6 @@ public class JenaDataSourceSetupBase extends JenaBaseDaoCon { protected final static boolean DEFAULT_TESTONBORROW = true, DEFAULT_TESTONRETURN = true, DEFAULT_TESTWHILEIDLE = true; - protected static String BASE = "/WEB-INF/ontologies/"; - public static String APPPATH = BASE+"app/"; - //these files are loaded everytime the system starts up - public static String APPPATH_LOAD = APPPATH + "menuload/"; - - //All files in this directory will be reloaded every startup - //and attached as sub-models to the displayOntModel. - static final String DISPLAY_MODEL_LOAD_AT_STARTUP_DIR = - APPPATH + "loadedAtStartup"; - protected static boolean firstStartup = false; String DB_USER = "jenatest"; // database user id @@ -390,47 +376,6 @@ public class JenaDataSourceSetupBase extends JenaBaseDaoCon { return dbModel; } - // TODO get rid of this? - public static void readOntologyFilesInPathSet(String path, - ServletContext ctx, Model model) { - log.debug("Reading ontology files from '" + path + "'"); - Set paths = ctx.getResourcePaths(path); - if (paths != null) { - for (String p : paths) { - readOntologyFileFromPath(p, model, ctx); - } - } - } - - // TODO get rid of this? - public static void readOntologyFileFromPath(String p, - Model model, - ServletContext ctx) { - //Check that this is a file and not a directory - File f = new File(ctx.getRealPath(p)); - if(f.exists() && f.isFile()){ - String format = getRdfFormat(p); - log.info("Loading ontology file at " + p + - " as format " + format); - InputStream ontologyInputStream = ctx.getResourceAsStream(p); - try { - model.read(ontologyInputStream, null, format); - log.debug("...successful"); - } catch (Throwable t) { - log.error("Failed to load ontology file at '" + p + - "' as format " + format, t); - } - } else { - if(!f.exists()) { - log.info("File for path " + p + " does not exist"); - } - else if(f.isDirectory()) { - log.info("Path " + p + - " corresponds to directory and not file so was not read in"); - } - } - } - private static String getRdfFormat(String filename){ String defaultformat = "RDF/XML"; if( filename == null ) @@ -486,42 +431,6 @@ public class JenaDataSourceSetupBase extends JenaBaseDaoCon { } - /** - * Read all the files in the directory as RDF files - * and return a model build from all RDF data found in those files. - * This will attempt to load formats supported by getRdfFormat(). - */ - public static OntModel getModelFromDir( File dir){ - if( dir == null ) - throw new IllegalStateException("Must pass a File to getModelFromDir()"); - if( !dir.isDirectory() ) - throw new IllegalStateException( - "Directory must be a File object for a directory"); - if( !dir.canRead() ) - throw new IllegalStateException("getModelFromDir(): Directory " + - " must be readable, check premissions on " - + dir.getAbsolutePath()); - - OntModel model = ModelFactory.createOntologyModel(); - for( File file : dir.listFiles()){ - if( file.isFile() - && file.canRead() - && file.getName() != null ){ - String format = getRdfFormat( file.getName() ); - try{ - model.read( new FileInputStream(file), null, format); - log.info("read in file " + file.getCanonicalPath() ); - }catch( Throwable th){ - log.warn("Could not load file " + - file.getAbsolutePath() + file.separator + file.getName() + - " check that it contains valid " + format + " data.", - th); - } - } - } - return model; - } - public static void setVitroJenaModelMaker(VitroJenaModelMaker vjmm, ServletContext ctx){ ctx.setAttribute(rdbModelMaker, vjmm); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java index d0b151013..0fc145d7b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java @@ -2,6 +2,7 @@ package edu.cornell.mannlib.vitro.webapp.servlet.setup; +import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -17,7 +18,10 @@ import javax.servlet.ServletContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; @@ -30,8 +34,9 @@ public class RDFFilesLoader { private static final String PROPERTY_VITRO_HOME = "vitro.home"; private static final String DEFAULT_RDF_FORMAT = "RDF/XML"; private static final String FIRST_TIME = "firsttime"; + private static final String EVERY_TIME = "everytime"; - /** Directory filter that ignores sub-directories and hidden files. */ + /** Path filter that ignores sub-directories and hidden files. */ private static final DirectoryStream.Filter RDF_FILE_FILTER = new DirectoryStream.Filter() { @Override public boolean accept(Path p) throws IOException { @@ -47,33 +52,77 @@ public class RDFFilesLoader { } }; - private final String homeDirProperty; - - public RDFFilesLoader(ServletContext ctx) { - ConfigurationProperties props = ConfigurationProperties.getBean(ctx); - this.homeDirProperty = props.getProperty(PROPERTY_VITRO_HOME); - } - - /** - * Load the "first time" files if the model is empty. - */ - public void loadFirstTimeFiles(String modelPath, Model model) { - loadFirstTimeFiles(modelPath, model, model.isEmpty()); - } - /** * Load the "first time" files if we say it is the first time. + * + * The location is based on the home directory and the model path: "abox", + * "display", etc. + * + * The files from the directory are added to the model. */ - public void loadFirstTimeFiles(String modelPath, Model model, boolean firstTime) { + public static void loadFirstTimeFiles(ServletContext ctx, String modelPath, + Model model, boolean firstTime) { if (firstTime) { - Set paths = getPaths(homeDirProperty, modelPath, FIRST_TIME); + Set paths = getPaths(locateHomeDirectory(ctx), modelPath, + FIRST_TIME); for (Path p : paths) { readOntologyFileIntoModel(p, model); } } } - private Set getPaths(String parentDir, String... strings) { + /** + * Load the "every time" files. + * + * The location is based on the home directory and the model path: "abox", + * "display", etc. + * + * The files from the directory become a sub-model of the model. + */ + public static void loadEveryTimeFiles(ServletContext ctx, String modelPath, + OntModel model) { + OntModel everytimeModel = ModelFactory + .createOntologyModel(OntModelSpec.OWL_MEM); + Set paths = getPaths(locateHomeDirectory(ctx), modelPath, + EVERY_TIME); + for (Path p : paths) { + readOntologyFileIntoModel(p, everytimeModel); + } + model.addSubModel(everytimeModel); + } + + /** + * Create a model from all the RDF files in the specified directory. + */ + public static OntModel getModelFromDir(File dir) { + OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); + if (dir == null) { + log.warn("Must pass a File to getModelFromDir()"); + return model; + } + if (!dir.isDirectory()) { + log.warn("Directory must be a File object for a directory"); + return model; + } + if (!dir.canRead()) { + log.warn("getModelFromDir(): Directory " + + " must be readable, check permissions on " + + dir.getAbsolutePath()); + return model; + } + + Set paths = getPaths(dir.getPath()); + for (Path p : paths) { + readOntologyFileIntoModel(p, model); + } + return model; + } + + /** + * Find the paths to RDF files in this directory. Sub-directories and hidden + * files are ignored. + */ + private static Set getPaths(String parentDir, String... strings) { Path dir = Paths.get(parentDir, strings); Set paths = new TreeSet<>(); @@ -87,7 +136,7 @@ public class RDFFilesLoader { log.warn("Failed to read directory '" + dir + "'", e); } } else { - log.debug("Filegraph directory '" + dir + "' doesn't exist."); + log.debug("Directory '" + dir + "' doesn't exist."); } log.debug("Paths from '" + dir + "': " + paths); return paths; @@ -99,9 +148,9 @@ public class RDFFilesLoader { try (InputStream stream = new FileInputStream(p.toFile())) { model.read(stream, null, format); log.debug("...successful"); - } catch (IOException e) { - log.error("Failed to load ontology file at '" + p + "' as format " - + format, e); + } catch (Exception e) { + log.warn("Could not load RDF file '" + p + + "'. Check that it contains valid " + format + " data.", e); } } @@ -115,4 +164,16 @@ public class RDFFilesLoader { return DEFAULT_RDF_FORMAT; } + private static String locateHomeDirectory(ServletContext ctx) { + return ConfigurationProperties.getBean(ctx).getProperty( + PROPERTY_VITRO_HOME); + } + + /** + * No need to create an instance -- all methods are static. + */ + private RDFFilesLoader() { + // Nothing to initialize. + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java index dcae1a549..121537b76 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java @@ -17,55 +17,58 @@ import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelSynchronizer; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; - -/** - * Setup the user account model. If it does not exist in the - * database, create and populate it. +/** + * Setup the user account model. If it does not exist in the database, create + * and populate it. */ -public class UserModelSetup extends JenaDataSourceSetupBase - implements ServletContextListener { - private static final Log log = LogFactory.getLog( - UserModelSetup.class.getName()); +public class UserModelSetup extends JenaDataSourceSetupBase implements + ServletContextListener { + private static final Log log = LogFactory.getLog(UserModelSetup.class + .getName()); - @Override - public void contextInitialized(ServletContextEvent sce) { - ServletContext ctx = sce.getServletContext(); - StartupStatus ss = StartupStatus.getBean(ctx); - - DataSource bds = getApplicationDataSource(ctx); - if( bds == null ){ - ss.fatal(this, "A DataSource must be setup before ModelSetup "+ - "is run. Make sure that JenaPersistentDataSourceSetup runs before "+ - "ModelSetup."); - return; - } - - setupUserAccountModel(bds, ctx, ss); - } - - @Override - public void contextDestroyed(ServletContextEvent arg0) { - // Does nothing. - } + @Override + public void contextInitialized(ServletContextEvent sce) { + ServletContext ctx = sce.getServletContext(); + StartupStatus ss = StartupStatus.getBean(ctx); - private void setupUserAccountModel (DataSource bds, ServletContext ctx ,StartupStatus ss){ - try { - Model userAccountsDbModel = makeDBModel(bds, - JENA_USER_ACCOUNTS_MODEL, DB_ONT_MODEL_SPEC, ctx); - OntModel userAccountsModel = - ModelFactory.createOntologyModel( MEM_ONT_MODEL_SPEC); - - // This is used in Selenium testing, when we load user accounts from a file. - new RDFFilesLoader(ctx).loadFirstTimeFiles("auth", userAccountsDbModel); + DataSource bds = getApplicationDataSource(ctx); + if (bds == null) { + ss.fatal( + this, + "A DataSource must be setup before ModelSetup " + + "is run. Make sure that JenaPersistentDataSourceSetup runs before " + + "ModelSetup."); + return; + } - userAccountsModel.add(userAccountsDbModel); - userAccountsModel.getBaseModel().register( - new ModelSynchronizer(userAccountsDbModel)); - ModelAccess.on(ctx).setUserAccountsModel(userAccountsModel); - - } catch (Throwable t) { - log.error("Unable to load user accounts model from DB", t); - ss.fatal(this, "Unable to load user accounts model from DB", t); - } - } + setupUserAccountModel(bds, ctx, ss); + } + + @Override + public void contextDestroyed(ServletContextEvent arg0) { + // Does nothing. + } + + private void setupUserAccountModel(DataSource bds, ServletContext ctx, + StartupStatus ss) { + try { + Model userAccountsDbModel = makeDBModel(bds, + JENA_USER_ACCOUNTS_MODEL, DB_ONT_MODEL_SPEC, ctx); + OntModel userAccountsModel = ModelFactory + .createOntologyModel(MEM_ONT_MODEL_SPEC); + + // This is used in Selenium testing, to load accounts from a file. + RDFFilesLoader.loadFirstTimeFiles(ctx, "auth", userAccountsDbModel, + userAccountsDbModel.isEmpty()); + + userAccountsModel.add(userAccountsDbModel); + userAccountsModel.getBaseModel().register( + new ModelSynchronizer(userAccountsDbModel)); + ModelAccess.on(ctx).setUserAccountsModel(userAccountsModel); + + } catch (Throwable t) { + log.error("Unable to load user accounts model from DB", t); + ss.fatal(this, "Unable to load user accounts model from DB", t); + } + } } From 7a431478cb8a41eabe91910b4d3f3ef3b1613c63 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Wed, 21 Aug 2013 13:01:13 -0400 Subject: [PATCH 12/46] Adding authorization to SparqlUpdate, changing name of SparqlUpdateTestDataGetter to SparqlUpdate. Adding AND to Actions --- .../webapp/auth/requestedAction/Actions.java | 78 ++++++++++++++++++- .../controller/freemarker/PageController.java | 39 ++++++++++ .../utils/dataGetter/DataGetterUtils.java | 21 +++-- ...eTestDataGetter.java => SparqlUpdate.java} | 48 +++++++++--- .../WEB-INF/ontologies/app/sparqlTestMenu.n3 | 17 ++-- 5 files changed, 177 insertions(+), 26 deletions(-) rename webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/{SparqlUpdateTestDataGetter.java => SparqlUpdate.java} (57%) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/Actions.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/Actions.java index ad668aa6d..03e3a4573 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/Actions.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/Actions.java @@ -39,15 +39,39 @@ public class Actions { return (actions == null) ? AUTHORIZED : actions; } - private final List> clauseList; - + /** + * This is a list of clauses that get ORed together. + * If all of the RequestedAction objects from any of the + * Sets are authorized, then the Actions object should + * be considered authorized. + */ + private List> clauseList; + + public Actions(){ + clauseList= new ArrayList>(); + } + public Actions(RequestedAction... actions) { this(Arrays.asList(actions)); } + public Actions(Actions... actions){ + Set accumActs = new HashSet(); + for( Actions actionToAnd : actions){ + if( actionToAnd != null ){ + for( Set ras : actionToAnd.clauseList){ + accumActs.addAll( ras ); + } + } + } + clauseList= new ArrayList>(); + clauseList.add( accumActs ); + } + public Actions(Collection actions) { this(Collections.> emptyList(), actions); } + private Actions(List> oldList, Collection newActions) { @@ -61,7 +85,19 @@ public class Actions { } this.clauseList = Collections.unmodifiableList(newList); } - + + public Actions and(RequestedAction... newActions){ + return and(Arrays.asList( newActions)); + } + + public Actions and(Collection newActions){ + return new Actions( this.clauseList, newActions); + } + + public void and( Actions otherAct ) throws Exception{ + andWithAction(otherAct); + } + public Actions or(RequestedAction... newActions) { return or(Arrays.asList(newActions)); } @@ -143,6 +179,42 @@ public class Actions { return sb.toString(); } + /** + * AND for Actions. + * ANDing with an Action with multiple disjoint clauses is not supported. + * + * To do the AND, we take each ORed clause, and add all of the RequestedActions + * so now in each of the alternative clauses, all of the singleClauseToAnd + * RequestedActions are required. + * + * @throws Exception when multiple disjoint clauses are present on both Actions. + */ + private void andWithAction( Actions otherAct ) throws Exception{ + Set singleClauseToAnd; + List> clauses; + + if( otherAct.singleAndClause() ){ + clauses = this.clauseList; + singleClauseToAnd = otherAct.clauseList.get(0); + }else if( this.singleAndClause() ){ + clauses = new ArrayList>( otherAct.clauseList ); + singleClauseToAnd = this.clauseList.get(0); + }else{ + //both have multiple ORed clauses, give up + throw new Exception("ANDing with an Action with multiple disjoint clauses is not supported."); + } + + // + for( Set clause : clauses){ + clause.addAll( singleClauseToAnd ); + } + this.clauseList = clauses; + } + + private boolean singleAndClause(){ + return clauseList.size() == 1; + } + /** * Nobody knows about this action class, so only the root user should be * authorized for it. diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java index 10ff18f7c..70ebed8c8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java @@ -3,6 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -17,6 +18,8 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission; import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequiresActions; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; @@ -41,6 +44,42 @@ public class PageController extends FreemarkerHttpServlet{ protected static final String DATA_GETTER_MAP = "pageTypeToDataGetterMap"; + /** + * Get the required actions for all the data getters then + * AND them together. + */ + @Override + protected Actions requiredActions(VitroRequest vreq) { + try { + Actions actAcc = null; + List dgList = + DataGetterUtils.getDataGettersForPage(vreq, vreq.getDisplayModel(), getPageUri(vreq)); + for( DataGetter dg : dgList){ + if( dg instanceof RequiresActions ){ + RequiresActions ra = (RequiresActions) dg; + Actions acts = ra.requiredActions(vreq); + if( acts != null ){ + if( actAcc != null ){ + actAcc.and( acts ); + }else{ + actAcc = acts; + } + } + } + } + + if( actAcc == null ) + return Actions.AUTHORIZED; + else + return actAcc; + + } catch (Exception e) { + // TODO Auto-generated catch block + log.debug(e); + return Actions.UNAUTHORIZED; + } + } + @Override protected ResponseValues processRequest(VitroRequest vreq) throws Exception { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterUtils.java index 46a8f3b68..008a3870f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterUtils.java @@ -55,7 +55,12 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; public class DataGetterUtils { final static Log log = LogFactory.getLog(DataGetterUtils.class); - + + /** + * Attribute name in request for DataGetters + */ + public final static String DATA_GETTERS_FOR_PAGE = "data_getters_for_page"; + /** * Get a list of DataGetter objects that are associated with a page. * This should not return PageDataGetters and should not throw an @@ -63,10 +68,16 @@ public class DataGetterUtils { */ public static List getDataGettersForPage(VitroRequest vreq, Model displayModel, String pageURI) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException { - List dgUris = getDataGetterURIsForAssociatedURI(displayModel, pageURI); - List dgList = dataGettersForURIs(vreq, displayModel, dgUris); - log.debug("getDataGettersForPage: " + dgList); - return dgList; + + if( vreq.getAttribute(DATA_GETTERS_FOR_PAGE) != null){ + return (List) vreq.getAttribute(DATA_GETTERS_FOR_PAGE); + }else{ + List dgUris = getDataGetterURIsForAssociatedURI(displayModel, pageURI); + List dgList = dataGettersForURIs(vreq, displayModel, dgUris); + log.debug("getDataGettersForPage: " + dgList); + vreq.setAttribute( DATA_GETTERS_FOR_PAGE , dgList ); + return dgList; + } } /** diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdate.java similarity index 57% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdate.java index 0d0ac41aa..7bb33194b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdateTestDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlUpdate.java @@ -11,28 +11,35 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.hp.hpl.jena.query.Dataset; +import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.update.GraphStore; import com.hp.hpl.jena.update.GraphStoreFactory; import com.hp.hpl.jena.update.UpdateAction; -import edu.cornell.mannlib.vitro.webapp.search.indexing.IndexBuilder; - +import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission; +import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequiresActions; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset; +import edu.cornell.mannlib.vitro.webapp.search.indexing.IndexBuilder; /** - * Test to experiment with Jena ARQ SPARQL update and the RDFServiceDataset. + * Handle a SPARQL Update request. This uses Jena ARQ and the RDFServiceDataset to + * evaluate a SPARQL Update with the RDFService. + * + * The reason to make this a DataGettere was to allow configuration in RDF of this + * service. */ -public class SparqlUpdateTestDataGetter implements DataGetter{ - private static final Log log = LogFactory.getLog(SparqlUpdateTestDataGetter.class); +public class SparqlUpdate implements DataGetter, RequiresActions{ + + private static final Log log = LogFactory.getLog(SparqlUpdate.class); VitroRequest vreq; ServletContext context; - /** - * Constructor with display model and data getter URI that will be called by reflection. - */ - public SparqlUpdateTestDataGetter(VitroRequest vreq ){ + public SparqlUpdate( + VitroRequest vreq, Model displayModel, String dataGetterURI ) { if( vreq == null ) throw new IllegalArgumentException("VitroRequest may not be null."); this.vreq = vreq; @@ -40,6 +47,10 @@ public class SparqlUpdateTestDataGetter implements DataGetter{ } + /** + * Gets the update from the request and then executes it on + * the RDFService. + */ @Override public Map getData( Map valueMap ) { HashMap data = new HashMap(); @@ -61,6 +72,25 @@ public class SparqlUpdateTestDataGetter implements DataGetter{ data.put("bodyTemplate", "page-sparqlUpdateTest.ftl"); return data; + } + + + /** + * Check if this request is authorized by the email/password. + * If not do normal authorization. + */ + @Override + public Actions requiredActions(VitroRequest vreq) { + String email = vreq.getParameter("email"); + String password = vreq.getParameter("password"); + + boolean isAuth = PolicyHelper.isAuthorizedForActions(vreq, + email, password, SimplePermission.MANAGE_SEARCH_INDEX.ACTIONS); + + if( isAuth ) + return Actions.AUTHORIZED; + else + return SimplePermission.MANAGE_SEARCH_INDEX.ACTIONS; } } diff --git a/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 b/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 index 028595010..6dcb46376 100644 --- a/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 +++ b/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 @@ -5,18 +5,17 @@ @prefix rdf: . @prefix rdfs: . -### Test page for SPARQL UPDATE ### -### Not For Production ### -display:SparqlTestMenuItem +### page for SPARQL UPDATE ### +display:SparqlUpdateMenuItem a display:NavigationElement ; - display:linkText "SPARQL Update Test"; - display:toPage display:SparqlUpdateTestPage . + display:linkText "SPARQL Update"; + display:toPage display:SparqlUpdatePage . -display:SparqlUpdateTestPage +display:SparqlUpdatePage a display:Page ; - display:title "SPARQL Update Test" ; - display:urlMapping "/sparqlUpdateTest" ; + display:title "SPARQL Update" ; + display:urlMapping "/sparql" ; display:hasDataGetter display:sparqlUpdateDataGetter . display:sparqlUpdateDataGetter - a . + a . From 1c475a56612b23206b3f64d82839e1bb0bbb9731 Mon Sep 17 00:00:00 2001 From: j2blake Date: Wed, 21 Aug 2013 15:08:48 -0400 Subject: [PATCH 13/46] VIVO-248 Tweak some issues with file paths and Application Model init. --- .../servlet/setup/ContentModelSetup.java | 22 ++++++++++++++----- .../webapp/servlet/setup/RDFFilesLoader.java | 18 +++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java index 02ec7bf8d..3ad2addca 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java @@ -82,11 +82,9 @@ public class ContentModelSetup extends JenaDataSourceSetupBase if (isFirstStartup()) { + initializeApplicationMetadata(ctx, applicationMetadataModel); RDFFilesLoader.loadFirstTimeFiles(ctx, "abox", baseABoxModel, true); RDFFilesLoader.loadFirstTimeFiles(ctx, "tbox", baseTBoxModel, true); - - RDFFilesLoader.loadFirstTimeFiles(ctx, "applicationMetadata", applicationMetadataModel, true); - setPortalUriOnFirstTime(applicationMetadataModel, ctx); } else { checkForNamespaceMismatch( applicationMetadataModel, ctx ); } @@ -171,13 +169,27 @@ public class ContentModelSetup extends JenaDataSourceSetupBase /* ===================================================================== */ + /** + * We need to read the RDF files and change the Portal from a blank node to + * one with a URI in the default namespace. + * + * Do this before adding the data to the RDFService-backed model, to avoid + * warnings about editing a blank node. + */ + private void initializeApplicationMetadata(ServletContext ctx, + OntModel applicationMetadataModel) { + OntModel temporaryAMModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC); + RDFFilesLoader.loadFirstTimeFiles(ctx, "applicationMetadata", temporaryAMModel, true); + setPortalUriOnFirstTime(temporaryAMModel, ctx); + applicationMetadataModel.add(temporaryAMModel); + } + /** * If we are loading the application metadata for the first time, set the * URI of the Portal based on the default namespace. */ private void setPortalUriOnFirstTime(OntModel model, ServletContext ctx) { - // currently, only a single portal is permitted in the initialization - // data + // Only a single portal is permitted in the initialization data Resource portalResource = null; ClosableIterator portalResIt = model .listSubjectsWithProperty(RDF.type, diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java index 0fc145d7b..cbd0f8c3d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java @@ -33,6 +33,7 @@ public class RDFFilesLoader { private static final String PROPERTY_VITRO_HOME = "vitro.home"; private static final String DEFAULT_RDF_FORMAT = "RDF/XML"; + private static final String RDF_FILES = "rdffiles"; private static final String FIRST_TIME = "firsttime"; private static final String EVERY_TIME = "everytime"; @@ -63,11 +64,14 @@ public class RDFFilesLoader { public static void loadFirstTimeFiles(ServletContext ctx, String modelPath, Model model, boolean firstTime) { if (firstTime) { - Set paths = getPaths(locateHomeDirectory(ctx), modelPath, - FIRST_TIME); + Set paths = getPaths(locateHomeDirectory(ctx), RDF_FILES, + modelPath, FIRST_TIME); for (Path p : paths) { readOntologyFileIntoModel(p, model); } + } else { + log.debug("Not loading first time files on '" + modelPath + + "', firstTime=false"); } } @@ -83,8 +87,8 @@ public class RDFFilesLoader { OntModel model) { OntModel everytimeModel = ModelFactory .createOntologyModel(OntModelSpec.OWL_MEM); - Set paths = getPaths(locateHomeDirectory(ctx), modelPath, - EVERY_TIME); + Set paths = getPaths(locateHomeDirectory(ctx), RDF_FILES, + modelPath, EVERY_TIME); for (Path p : paths) { readOntologyFileIntoModel(p, everytimeModel); } @@ -144,13 +148,13 @@ public class RDFFilesLoader { private static void readOntologyFileIntoModel(Path p, Model model) { String format = getRdfFormat(p); - log.info("Loading ontology file at " + p + " as format " + format); + log.info("Loading file at " + p + " as " + format); try (InputStream stream = new FileInputStream(p.toFile())) { model.read(stream, null, format); log.debug("...successful"); } catch (Exception e) { - log.warn("Could not load RDF file '" + p - + "'. Check that it contains valid " + format + " data.", e); + log.warn("Could not load file '" + p + "' as " + format + + ". Check that it contains valid data.", e); } } From b0e0c773c935bf63929040846385f5aade7ae471 Mon Sep 17 00:00:00 2001 From: j2blake Date: Wed, 21 Aug 2013 15:55:19 -0400 Subject: [PATCH 14/46] VIVO-248 Use /rdf instead of /rdffiles --- webapp/build.xml | 2 +- .../display/everytime/displayModelListViews.rdf | 0 .../{rdffiles => rdf}/display/firsttime/application.owl | 0 webapp/{rdffiles => rdf}/display/firsttime/menu.n3 | 0 .../display/firsttime/profilePageType.n3 | 0 .../displayDisplay/everytime/displayDisplay.n3 | 0 .../displayTbox/everytime/displayTBOX.n3 | 0 webapp/{rdffiles => rdf}/tbox/filegraph/vitro-0.7.owl | 0 webapp/{rdffiles => rdf}/tbox/filegraph/vitroPublic.owl | 0 .../vitro/webapp/servlet/setup/FileGraphSetup.java | 6 +++--- .../vitro/webapp/servlet/setup/RDFFilesLoader.java | 8 ++++---- 11 files changed, 8 insertions(+), 8 deletions(-) rename webapp/{rdffiles => rdf}/display/everytime/displayModelListViews.rdf (100%) rename webapp/{rdffiles => rdf}/display/firsttime/application.owl (100%) rename webapp/{rdffiles => rdf}/display/firsttime/menu.n3 (100%) rename webapp/{rdffiles => rdf}/display/firsttime/profilePageType.n3 (100%) rename webapp/{rdffiles => rdf}/displayDisplay/everytime/displayDisplay.n3 (100%) rename webapp/{rdffiles => rdf}/displayTbox/everytime/displayTBOX.n3 (100%) rename webapp/{rdffiles => rdf}/tbox/filegraph/vitro-0.7.owl (100%) rename webapp/{rdffiles => rdf}/tbox/filegraph/vitroPublic.owl (100%) diff --git a/webapp/build.xml b/webapp/build.xml index 6aae2b2af..6d7c066cf 100644 --- a/webapp/build.xml +++ b/webapp/build.xml @@ -206,7 +206,7 @@ - + diff --git a/webapp/rdffiles/display/everytime/displayModelListViews.rdf b/webapp/rdf/display/everytime/displayModelListViews.rdf similarity index 100% rename from webapp/rdffiles/display/everytime/displayModelListViews.rdf rename to webapp/rdf/display/everytime/displayModelListViews.rdf diff --git a/webapp/rdffiles/display/firsttime/application.owl b/webapp/rdf/display/firsttime/application.owl similarity index 100% rename from webapp/rdffiles/display/firsttime/application.owl rename to webapp/rdf/display/firsttime/application.owl diff --git a/webapp/rdffiles/display/firsttime/menu.n3 b/webapp/rdf/display/firsttime/menu.n3 similarity index 100% rename from webapp/rdffiles/display/firsttime/menu.n3 rename to webapp/rdf/display/firsttime/menu.n3 diff --git a/webapp/rdffiles/display/firsttime/profilePageType.n3 b/webapp/rdf/display/firsttime/profilePageType.n3 similarity index 100% rename from webapp/rdffiles/display/firsttime/profilePageType.n3 rename to webapp/rdf/display/firsttime/profilePageType.n3 diff --git a/webapp/rdffiles/displayDisplay/everytime/displayDisplay.n3 b/webapp/rdf/displayDisplay/everytime/displayDisplay.n3 similarity index 100% rename from webapp/rdffiles/displayDisplay/everytime/displayDisplay.n3 rename to webapp/rdf/displayDisplay/everytime/displayDisplay.n3 diff --git a/webapp/rdffiles/displayTbox/everytime/displayTBOX.n3 b/webapp/rdf/displayTbox/everytime/displayTBOX.n3 similarity index 100% rename from webapp/rdffiles/displayTbox/everytime/displayTBOX.n3 rename to webapp/rdf/displayTbox/everytime/displayTBOX.n3 diff --git a/webapp/rdffiles/tbox/filegraph/vitro-0.7.owl b/webapp/rdf/tbox/filegraph/vitro-0.7.owl similarity index 100% rename from webapp/rdffiles/tbox/filegraph/vitro-0.7.owl rename to webapp/rdf/tbox/filegraph/vitro-0.7.owl diff --git a/webapp/rdffiles/tbox/filegraph/vitroPublic.owl b/webapp/rdf/tbox/filegraph/vitroPublic.owl similarity index 100% rename from webapp/rdffiles/tbox/filegraph/vitroPublic.owl rename to webapp/rdf/tbox/filegraph/vitroPublic.owl diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java index 94c464cae..5e039e808 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java @@ -42,7 +42,7 @@ import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; public class FileGraphSetup implements ServletContextListener { private static final Log log = LogFactory.getLog(FileGraphSetup.class); - private static final String RDFFILES = "rdffiles"; + private static final String RDF = "rdf"; private static final String ABOX = "abox"; private static final String TBOX = "tbox"; private static final String FILEGRAPH = "filegraph"; @@ -74,7 +74,7 @@ public class FileGraphSetup implements ServletContextListener { RDFServiceModelMaker maker = new RDFServiceModelMaker(RDFServiceUtils.getRDFServiceFactory(ctx)); // ABox files - Set paths = getFilegraphPaths(ctx, RDFFILES, ABOX, FILEGRAPH); + Set paths = getFilegraphPaths(ctx, RDF, ABOX, FILEGRAPH); cleanupDB(dataset, pathsToURIs(paths, ABOX), ABOX); @@ -82,7 +82,7 @@ public class FileGraphSetup implements ServletContextListener { aboxChanged = readGraphs(paths, maker, ABOX, aboxBaseModel); // TBox files - paths = getFilegraphPaths(ctx, RDFFILES, TBOX, FILEGRAPH); + paths = getFilegraphPaths(ctx, RDF, TBOX, FILEGRAPH); cleanupDB(dataset, pathsToURIs(paths, TBOX),TBOX); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java index cbd0f8c3d..50838e472 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RDFFilesLoader.java @@ -33,7 +33,7 @@ public class RDFFilesLoader { private static final String PROPERTY_VITRO_HOME = "vitro.home"; private static final String DEFAULT_RDF_FORMAT = "RDF/XML"; - private static final String RDF_FILES = "rdffiles"; + private static final String RDF = "rdf"; private static final String FIRST_TIME = "firsttime"; private static final String EVERY_TIME = "everytime"; @@ -64,7 +64,7 @@ public class RDFFilesLoader { public static void loadFirstTimeFiles(ServletContext ctx, String modelPath, Model model, boolean firstTime) { if (firstTime) { - Set paths = getPaths(locateHomeDirectory(ctx), RDF_FILES, + Set paths = getPaths(locateHomeDirectory(ctx), RDF, modelPath, FIRST_TIME); for (Path p : paths) { readOntologyFileIntoModel(p, model); @@ -87,8 +87,8 @@ public class RDFFilesLoader { OntModel model) { OntModel everytimeModel = ModelFactory .createOntologyModel(OntModelSpec.OWL_MEM); - Set paths = getPaths(locateHomeDirectory(ctx), RDF_FILES, - modelPath, EVERY_TIME); + Set paths = getPaths(locateHomeDirectory(ctx), RDF, modelPath, + EVERY_TIME); for (Path p : paths) { readOntologyFileIntoModel(p, everytimeModel); } From b425682a920b004f3dc870238de03056eb167b59 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Wed, 21 Aug 2013 16:02:36 -0400 Subject: [PATCH 15/46] Changing SimplePermission and SimpleRequestedAction to use URIs instead of localnames --- .../auth/permissions/SimplePermission.java | 86 +++++++++---------- .../SimpleRequestedAction.java | 18 ++-- 2 files changed, 49 insertions(+), 55 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/SimplePermission.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/SimplePermission.java index 80b32b478..ab6df594e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/SimplePermission.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/SimplePermission.java @@ -27,55 +27,55 @@ public class SimplePermission extends Permission { private static final Map allInstances = new HashMap(); public static final SimplePermission ACCESS_SPECIAL_DATA_MODELS = new SimplePermission( - "AccessSpecialDataModels"); + NAMESPACE + "AccessSpecialDataModels"); public static final SimplePermission DO_BACK_END_EDITING = new SimplePermission( - "DoBackEndEditing"); + NAMESPACE + "DoBackEndEditing"); public static final SimplePermission DO_FRONT_END_EDITING = new SimplePermission( - "DoFrontEndEditing"); + NAMESPACE + "DoFrontEndEditing"); public static final SimplePermission EDIT_ONTOLOGY = new SimplePermission( - "EditOntology"); + NAMESPACE + "EditOntology"); public static final SimplePermission EDIT_OWN_ACCOUNT = new SimplePermission( - "EditOwnAccount"); + NAMESPACE + "EditOwnAccount"); public static final SimplePermission EDIT_SITE_INFORMATION = new SimplePermission( - "EditSiteInformation"); + NAMESPACE + "EditSiteInformation"); public static final SimplePermission LOGIN_DURING_MAINTENANCE = new SimplePermission( - "LoginDuringMaintenance"); + NAMESPACE + "LoginDuringMaintenance"); public static final SimplePermission MANAGE_MENUS = new SimplePermission( - "ManageMenus"); + NAMESPACE + "ManageMenus"); public static final SimplePermission MANAGE_OWN_PROXIES = new SimplePermission( - "ManageOwnProxies"); + NAMESPACE + "ManageOwnProxies"); public static final SimplePermission MANAGE_PORTALS = new SimplePermission( - "ManagePortals"); + NAMESPACE + "ManagePortals"); public static final SimplePermission MANAGE_PROXIES = new SimplePermission( - "ManageProxies"); + NAMESPACE + "ManageProxies"); public static final SimplePermission MANAGE_SEARCH_INDEX = new SimplePermission( - "ManageSearchIndex"); + NAMESPACE + "ManageSearchIndex"); public static final SimplePermission MANAGE_TABS = new SimplePermission( - "ManageTabs"); + NAMESPACE + "ManageTabs"); public static final SimplePermission MANAGE_USER_ACCOUNTS = new SimplePermission( - "ManageUserAccounts"); + NAMESPACE + "ManageUserAccounts"); public static final SimplePermission QUERY_FULL_MODEL = new SimplePermission( - "QueryFullModel"); + NAMESPACE + "QueryFullModel"); public static final SimplePermission QUERY_USER_ACCOUNTS_MODEL = new SimplePermission( - "QueryUserAccountsModel"); + NAMESPACE + "QueryUserAccountsModel"); public static final SimplePermission REBUILD_VCLASS_GROUP_CACHE = new SimplePermission( - "RebuildVClassGroupCache"); + NAMESPACE + "RebuildVClassGroupCache"); public static final SimplePermission REFRESH_VISUALIZATION_CACHE = new SimplePermission( - "RefreshVisualizationCache"); + NAMESPACE + "RefreshVisualizationCache"); public static final SimplePermission SEE_INDVIDUAL_EDITING_PANEL = new SimplePermission( - "SeeIndividualEditingPanel"); + NAMESPACE + "SeeIndividualEditingPanel"); public static final SimplePermission SEE_REVISION_INFO = new SimplePermission( - "SeeRevisionInfo"); + NAMESPACE + "SeeRevisionInfo"); public static final SimplePermission SEE_SITE_ADMIN_PAGE = new SimplePermission( - "SeeSiteAdminPage"); + NAMESPACE + "SeeSiteAdminPage"); public static final SimplePermission SEE_STARTUP_STATUS = new SimplePermission( - "SeeStartupStatus"); + NAMESPACE + "SeeStartupStatus"); public static final SimplePermission SEE_VERBOSE_PROPERTY_INFORMATION = new SimplePermission( - "SeeVerbosePropertyInformation"); + NAMESPACE + "SeeVerbosePropertyInformation"); public static final SimplePermission USE_ADVANCED_DATA_TOOLS_PAGES = new SimplePermission( - "UseAdvancedDataToolsPages"); + NAMESPACE + "UseAdvancedDataToolsPages"); public static final SimplePermission USE_SPARQL_QUERY_PAGE = new SimplePermission( - "UseSparqlQueryPage"); + NAMESPACE + "UseSparqlQueryPage"); // ---------------------------------------------------------------------- // These instances are "catch all" permissions to cover poorly defined @@ -84,33 +84,35 @@ public class SimplePermission extends Permission { // ---------------------------------------------------------------------- public static final SimplePermission USE_BASIC_AJAX_CONTROLLERS = new SimplePermission( - "UseBasicAjaxControllers"); + NAMESPACE + "UseBasicAjaxControllers"); public static final SimplePermission USE_MISCELLANEOUS_ADMIN_PAGES = new SimplePermission( - "UseMiscellaneousAdminPages"); + NAMESPACE + "UseMiscellaneousAdminPages"); public static final SimplePermission USE_MISCELLANEOUS_CURATOR_PAGES = new SimplePermission( - "UseMiscellaneousCuratorPages"); + NAMESPACE + "UseMiscellaneousCuratorPages"); public static final SimplePermission USE_MISCELLANEOUS_EDITOR_PAGES = new SimplePermission( - "UseMiscellaneousEditorPages"); + NAMESPACE + "UseMiscellaneousEditorPages"); public static final SimplePermission USE_MISCELLANEOUS_PAGES = new SimplePermission( - "UseMiscellaneousPages"); + NAMESPACE + "UseMiscellaneousPages"); public static List getAllInstances() { return new ArrayList(allInstances.values()); } - private final String localName; + //private final String localName; + private final String uri; public final RequestedAction ACTION; public final Actions ACTIONS; - public SimplePermission(String localName) { - super(NAMESPACE + localName); + public SimplePermission(String uri) { + super(uri); - if (localName == null) { - throw new NullPointerException("name may not be null."); + if (uri == null) { + throw new NullPointerException("uri may not be null."); } - this.localName = localName; - this.ACTION = new SimpleRequestedAction(localName); + //this.localName = localName; + this.uri = uri; + this.ACTION = new SimpleRequestedAction(uri); this.ACTIONS = new Actions(this.ACTION); if (allInstances.containsKey(this.uri)) { @@ -120,14 +122,6 @@ public class SimplePermission extends Permission { allInstances.put(uri, this); } - public String getLocalName() { - return this.localName; - } - - public String getNamespace() { - return NAMESPACE; - } - @Override public boolean isAuthorized(RequestedAction whatToAuth) { if (whatToAuth != null) { @@ -142,7 +136,7 @@ public class SimplePermission extends Permission { @Override public String toString() { - return "SimplePermission['" + localName + "']"; + return "SimplePermission['" + uri+ "']"; } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/SimpleRequestedAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/SimpleRequestedAction.java index 89beacf13..117f89fda 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/SimpleRequestedAction.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/SimpleRequestedAction.java @@ -8,31 +8,31 @@ import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAct * A RequestedAction that can be recognized by a SimplePermission. */ public class SimpleRequestedAction extends RequestedAction { - private final String localName; + private final String uri; - public SimpleRequestedAction(String localName) { - if (localName == null) { - throw new NullPointerException("localName may not be null."); + public SimpleRequestedAction(String uri) { + if (uri == null) { + throw new NullPointerException("uri may not be null."); } - this.localName = localName; + this.uri = uri; } @Override public String getURI() { - return "java:" + this.getClass().getName() + "#" + localName; + return uri; } @Override public int hashCode() { - return (localName == null) ? 0 : localName.hashCode(); + return uri.hashCode(); } @Override public boolean equals(Object o) { if (o instanceof SimpleRequestedAction) { SimpleRequestedAction that = (SimpleRequestedAction) o; - return equivalent(this.localName, that.localName); + return equivalent(this.uri, that.uri); } return false; } @@ -43,7 +43,7 @@ public class SimpleRequestedAction extends RequestedAction { @Override public String toString() { - return "SimpleRequestedAction['" + localName + "']"; + return "SimpleRequestedAction['" + uri + "']"; } } From e6c2596a35e1651cd2b4f355c5898d908430dcaf Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Wed, 21 Aug 2013 16:03:53 -0400 Subject: [PATCH 16/46] Changing PageController to use permissions on pages. VIVO-63 Adding Permissions to display model. --- .../controller/freemarker/PageController.java | 81 ++++-- .../vitro/webapp/dao/DisplayVocabulary.java | 1 + .../mannlib/vitro/webapp/dao/PageDao.java | 6 + .../vitro/webapp/dao/jena/PageDaoJena.java | 67 ++++- .../ontologies/app/menuload/displayDisplay.n3 | 12 +- .../ontologies/app/menuload/displayTBOX.n3 | 236 +++++++++--------- .../web/WEB-INF/ontologies/app/permissions.n3 | 159 ++++++++++++ 7 files changed, 415 insertions(+), 147 deletions(-) create mode 100644 webapp/web/WEB-INF/ontologies/app/permissions.n3 diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java index 70ebed8c8..45dc6cf3f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java @@ -3,7 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; -import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -19,6 +19,8 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission; import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.SimpleRequestedAction; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequiresActions; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; @@ -51,27 +53,16 @@ public class PageController extends FreemarkerHttpServlet{ @Override protected Actions requiredActions(VitroRequest vreq) { try { - Actions actAcc = null; - List dgList = - DataGetterUtils.getDataGettersForPage(vreq, vreq.getDisplayModel(), getPageUri(vreq)); - for( DataGetter dg : dgList){ - if( dg instanceof RequiresActions ){ - RequiresActions ra = (RequiresActions) dg; - Actions acts = ra.requiredActions(vreq); - if( acts != null ){ - if( actAcc != null ){ - actAcc.and( acts ); - }else{ - actAcc = acts; - } - } - } - } - - if( actAcc == null ) + Actions pageActs = getActionsForPage( vreq ); + Actions dgActs = getActionsForDataGetters( vreq ); + + if( pageActs == null && dgActs == null){ return Actions.AUTHORIZED; - else - return actAcc; + }else if( pageActs == null && dgActs != null ){ + return dgActs; + }else{ + return pageActs; + } } catch (Exception e) { // TODO Auto-generated catch block @@ -79,6 +70,54 @@ public class PageController extends FreemarkerHttpServlet{ return Actions.UNAUTHORIZED; } } + + /** + * Get all the required actions directly required for the page. + */ + private Actions getActionsForPage( VitroRequest vreq ) throws Exception{ + List simplePremUris = vreq.getWebappDaoFactory().getPageDao() + .getRequiredActions( getPageUri(vreq) ); + + List actions = new ArrayList(); + + for( String uri : simplePremUris ){ + actions.add( new SimpleRequestedAction(uri) ); + } + + return new Actions( actions ); + } + /** + * Get Actions object for the data getters for the page. + */ + private Actions getActionsForDataGetters(VitroRequest vreq ){ + try { + Actions dgActs = null; + + List dgList = + DataGetterUtils.getDataGettersForPage( + vreq, vreq.getDisplayModel(), getPageUri(vreq)); + + for( DataGetter dg : dgList){ + if( dg instanceof RequiresActions ){ + RequiresActions ra = (RequiresActions) dg; + Actions acts = ra.requiredActions(vreq); + if( acts != null ){ + if( dgActs != null ){ + dgActs.and( acts ); + }else{ + dgActs = acts; + } + } + } + } + + return dgActs; + } catch (Exception e) { + // TODO Auto-generated catch block + log.debug(e); + return Actions.UNAUTHORIZED; + } + } @Override protected ResponseValues processRequest(VitroRequest vreq) throws Exception { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/DisplayVocabulary.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/DisplayVocabulary.java index 4a832d784..a3f0fdab3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/DisplayVocabulary.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/DisplayVocabulary.java @@ -48,6 +48,7 @@ public class DisplayVocabulary { public static final String ITEM_TO_PAGE = NS + "toPage"; public static final String HAS_ELEMENT = NS + "hasElement"; public static final String USES_DATAGETTER_CLASS = NS + "usesDataGetterClass"; + public static final String REQUIRED_ACTIONS = NS + "requiredAction"; /**Data Getter object properties **/ public static final String HAS_DATA_GETTER = NS + "hasDataGetter"; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/PageDao.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/PageDao.java index b08f559d1..3004dddd7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/PageDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/PageDao.java @@ -29,4 +29,10 @@ public interface PageDao { List getDataGetterClass(String pageUri); + /** + * Gets the required actions directly associated with a page. + * Does not get required actions for any data getters that are + * related to the page. + */ + List getRequiredActions(String pageUri); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PageDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PageDaoJena.java index e8ac4392e..e723e0a2b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PageDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PageDaoJena.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -77,7 +78,14 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { " ?pageUri display:hasDataGetter ?dg .\n"+ " ?dg rdf:type ?dataGetterType . \n" + "} \n" ; - + + //Get the required actions directly associated with a page + static final protected String requiredActionsQuery = + prefixes + "\n" + + "SELECT ?requiredAction WHERE{\n" + + " ?pageUri <" + DisplayVocabulary.REQUIRED_ACTIONS + "> ?requiredAction .\n"+ + "}"; + //Get data getter URIs static final protected String dataGetterURIsQueryString = prefixes + "\n" + @@ -519,10 +527,54 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { return dataGetterClasses; } - + + /** + * Gets the requiredActions directly associated with page. + */ + public List getRequiredActions(String pageUri){ + QuerySolutionMap initialBindings = new QuerySolutionMap(); + initialBindings.add("pageUri", ResourceFactory.createResource(pageUri)); + List actions = new ArrayList(); + + Model dModel = getOntModelSelector().getDisplayModel(); + try{ + QueryExecution qe = + QueryExecutionFactory.create( requiredActionsQuery, dModel, initialBindings); + actions = executeQueryToList( qe ); + qe.close(); + }finally{ + dModel.enterCriticalSection(false); + } + return actions; + } /* *************************** Utility methods ********************************* */ - + + /** + * Assumes single bound variable in solution. + */ + protected List executeQueryToList(QueryExecution qex){ + List rv = new LinkedList(); + ResultSet results = qex.execSelect(); + while (results.hasNext()) { + rv.add(querySolutionToString( results.nextSolution() )); + } + return rv; + } + + /** + * Assumes single bound variable in solution. + */ + protected String querySolutionToString( QuerySolution soln ){ + Iterator varNames = soln.varNames(); + if(varNames.hasNext()){ + String name = varNames.next(); + return nodeToString( soln.get(name) ); + }else{ + return ""; + } + } + /** * Converts a sparql query that returns a multiple rows to a list of maps. * The maps will have column names as keys to the values. @@ -548,7 +600,9 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { } return map; } - + + + static protected Object nodeToObject( RDFNode node ){ if( node == null ){ return ""; @@ -582,11 +636,6 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { return ""; } } - protected Map resultsToMap(){ - return null; - } - - } diff --git a/webapp/web/WEB-INF/ontologies/app/menuload/displayDisplay.n3 b/webapp/web/WEB-INF/ontologies/app/menuload/displayDisplay.n3 index 35f95df09..8b30c3945 100644 --- a/webapp/web/WEB-INF/ontologies/app/menuload/displayDisplay.n3 +++ b/webapp/web/WEB-INF/ontologies/app/menuload/displayDisplay.n3 @@ -14,4 +14,14 @@ rdf:type "true"^^xsd:boolean ; - \ No newline at end of file + +display:requiresAction + a owl:ObjectProperty ; + rdfs:label "Required Action"@en-US ; + rdfs:comment "Indicates that a resource has a required action that may need to be authorized" . + rdfs:range display:RequiredAction . + + "true"^^xsd:boolean ; + + "true"^^xsd:boolean ; + diff --git a/webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 b/webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 index 5d3fe4ccb..dd3bf4ea7 100644 --- a/webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 +++ b/webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 @@ -4,127 +4,130 @@ @prefix xsd: . @prefix owl: . @prefix rdf: . - +@prefix display: . +@prefix vitro: . #########Classes######### ###Basic -owl:Class - a owl:Class . - -owl:Ontology - a owl:Class . - -owl:AnnotationProperty - a owl:Class . - -owl:DatatypeProperty - a owl:Class . - -owl:ObjectProperty - a owl:Class . +owl:Class a owl:Class . +owl:Ontology a owl:Class . +owl:AnnotationProperty a owl:Class . +owl:DatatypeProperty a owl: +owl:ObjectProperty a owl:Class . ###Display Model - +display:MainMenu a owl:Class ; - - "individual-menu.ftl"^^xsd:string . + vitro:customDisplayViewAnnot "individual-menu.ftl"^^xsd:string . - - a owl:Class . +display:NavigationElement a owl:Class . - - a owl:Class . +display:Page a owl:Class . - - a owl:Class . +display:HomePage a owl:Class . - - a owl:Class . +display:ClassGroupPage a owl:Class . - - a owl:Class . +display:IndividualsForClassesPage a owl:Class . - - a owl:Class . +display:InternalClassesPage a owl:Class . - - a owl:Class . +display:DataGetter a owl:Class . + +display:RequiredAction a owl:Class ; + rdfs:comment "Represents a action that may need authorization to perform.". - a owl:Class . + a owl:Class ; + rdfs:comment "Data getter for running a SPARQL query." -##Adding a data getter type that is Solr Class search, i.e. get individuals for VClass - a owl:Class . + a owl:Class ; + rdfs:comment "A data getter for a Solr Class search, i.e. get individuals for VClass" . + + a owl:Class ; + rdfs:comment "A data getter that runs a SPARQL Update" . + + a owl:Class ; + rdfs:comment "A data getter for a standard Vitro browse page" . + + + a owl:Class ; + rdfs:comment "A data getter for a VClassGroup page". + + + a owl:Class ; + rdfs:comment "A data getter for a Fixed piece of HTML stored in RDF". + + + a owl:Class . + ########Data Properties######### ###Basic rdfs:comment - a owl:DatatypeProperty . - + a owl:DatatypeProperty . rdfs:label - a owl:DatatypeProperty . - - + a owl:DatatypeProperty . owl:versionInfo a owl:DatatypeProperty . -###Vitro model +###Vitro model - +vitro:modTime a owl:DatatypeProperty . - +vitro:displayRank + a owl:DatatypeProperty . +vitro:customDisplayViewAnnot a owl:DatatypeProperty . - - a owl:DatatypeProperty . - -###Display model +###Display model - - a owl:DatatypeProperty . - - a owl:DatatypeProperty . - - - a owl:DatatypeProperty . +display:listViewConfigFile + a owl:DatatypeProperty . - - a owl:DatatypeProperty . - - - a owl:DatatypeProperty . - - - a owl:DatatypeProperty ; - +display:title + a owl:DatatypeProperty . + +display:urlMapping + a owl:DatatypeProperty . + +display:requiresBodyTemplate + a owl:DatatypeProperty . + +display:isSelfContainedTemplate + a owl:DatatypeProperty . + +display:menuPosition + a owl:DatatypeProperty ; + vitro:displayLimitAnnot "1"^^xsd:int . - - a owl:DatatypeProperty . - - - a owl:DatatypeProperty . - - - a owl:DatatypeProperty . +display:linkText + a owl:DatatypeProperty . - - a owl:DatatypeProperty . - - - a owl:DatatypeProperty. - - - a owl:DatatypeProperty. - - - a owl:DatatypeProperty. - - +display:hasMenuText + a owl:DatatypeProperty . + +display:usesDataGetterClass + a owl:DatatypeProperty . + +display:query + a owl:DatatypeProperty . + +display:saveToVar + a owl:DatatypeProperty. + +display:queryModel + a owl:DatatypeProperty. + +display:htmlValue + a owl:DatatypeProperty. + +display:cannotDeletePage a owl:DatatypeProperty. ######### Object Properties######### @@ -134,12 +137,11 @@ rdfs:range rdfs:domain a owl:ObjectProperty . owl:topObjectProperty - a owl:ObjectProperty . + a owl:ObjectProperty . -##Adding object property defining class for solr data getter - - a owl:ObjectProperty. - +display:hasVClassId + a owl:ObjectProperty ; + rdfs:comment "Object property defining class for solr data getter" . ###Vitro properties without which individual templates throw errors as are required @@ -148,71 +150,73 @@ owl:topObjectProperty rdfs:range ; rdfs:subPropertyOf , owl:topObjectProperty . - +vitro:primaryLink a owl:ObjectProperty ; rdfs:label "Primary Link"@en-US ; - rdfs:range ; - rdfs:subPropertyOf , owl:topObjectProperty ; - + rdfs:range vitro:Link ; + rdfs:subPropertyOf vitro:primaryLink , owl:topObjectProperty ; + vitro:customEntryFormAnnot "defaultLinkForm.jsp"^^xsd:string ; - + vitro:forceStubDeletionAnnot "true"^^xsd:boolean ; - + vitro:offerCreateNewOptionAnnot "true"^^xsd:boolean ; - + vitro:selectFromExistingAnnot "false"^^xsd:boolean ; - + vitro:stubObjectPropertyAnnot "true"^^xsd:boolean . rdf:type a owl:ObjectProperty ; rdfs:label "RDF Type"@en-US ; rdfs:range owl:Class ; - + vitro:customEntryFormAnnot "edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators.RdfTypeGenerator"^^xsd:string ; - + vitro:offerCreateNewOptionAnnot "true"^^xsd:boolean ; - + vitro:selectFromExistingAnnot "true"^^xsd:boolean . - +vitro:additionalLink a owl:ObjectProperty ; rdfs:label "Additional Link"@en-US ; - rdfs:range ; - rdfs:subPropertyOf , owl:topObjectProperty ; - + rdfs:range vitro:Link ; + rdfs:subPropertyOf vitro:additionalLink , owl:topObjectProperty ; + vitro:customEntryFormAnnot "defaultLinkForm.jsp"^^xsd:string ; - + vitro:forceStubDeletionAnnot "true"^^xsd:boolean ; - + vitro:offerCreateNewOptionAnnot "true"^^xsd:boolean ; - + vitro:selectFromExistingAnnot "false"^^xsd:boolean ; - + vitro:stubObjectPropertyAnnot "true"^^xsd:boolean . ###Display model -###Adding menu management customform annotation - +display:hasElement a owl:ObjectProperty . - +display:excludeClass a owl:ObjectProperty . - +display:toPage a owl:ObjectProperty . - +display:forClassGroup a owl:ObjectProperty . - +display:hasDataGetter a owl:ObjectProperty . - +display:getIndividualsForClass a owl:ObjectProperty . - +display:restrictResultsByClass a owl:ObjectProperty . + +display:requiresAction + a owl:ObjectProperty . diff --git a/webapp/web/WEB-INF/ontologies/app/permissions.n3 b/webapp/web/WEB-INF/ontologies/app/permissions.n3 new file mode 100644 index 000000000..b11bb9d98 --- /dev/null +++ b/webapp/web/WEB-INF/ontologies/app/permissions.n3 @@ -0,0 +1,159 @@ +# $This file is distributed under the terms of the license in /doc/license.txt$ + +@prefix owl: . +@prefix display: . +@prefix rdf: . +@prefix rdfs: . +@prefix action: . + +# These are the reqired action objects from the SimplePermission.java. + +action:AccessSpecialDataModels + a display:RequiredAction ; + rdfs:label "ACCESS_SPECIAL_DATA_MODELS" . + + +action:DoBackEndEditing + a display:RequiredAction ; + rdfs:label "DO_BACK_END_EDITING" . + + +action:DoFrontEndEditing + a display:RequiredAction ; + rdfs:label "DO_FRONT_END_EDITING" . + + +action:EditOntology + a display:RequiredAction ; + rdfs:label "EDIT_ONTOLOGY" . + + +action:EditOwnAccount + a display:RequiredAction ; + rdfs:label "EDIT_OWN_ACCOUNT" . + + +action:EditSiteInformation + a display:RequiredAction ; + rdfs:label "EDIT_SITE_INFORMATION" . + + +action:LoginDuringMaintenance + a display:RequiredAction ; + rdfs:label "LOGIN_DURING_MAINTENANCE" . + + +action:ManageMenus + a display:RequiredAction ; + rdfs:label "MANAGE_MENUS" . + + +action:ManageOwnProxies + a display:RequiredAction ; + rdfs:label "MANAGE_OWN_PROXIES" . + + +action:ManagePortals + a display:RequiredAction ; + rdfs:label "MANAGE_PORTALS" . + + +action:ManageProxies + a display:RequiredAction ; + rdfs:label "MANAGE_PROXIES" . + + +action:ManageSearchIndex + a display:RequiredAction ; + rdfs:label "MANAGE_SEARCH_INDEX" . + + +action:ManageTabs + a display:RequiredAction ; + rdfs:label "MANAGE_TABS" . + + +action:ManageUserAccounts + a display:RequiredAction ; + rdfs:label "MANAGE_USER_ACCOUNTS" . + + +action:QueryFullModel + a display:RequiredAction ; + rdfs:label "QUERY_FULL_MODEL" . + + +action:QueryUserAccountsModel + a display:RequiredAction ; + rdfs:label "QUERY_USER_ACCOUNTS_MODEL" . + + +action:RebuildVClassGroupCache + a display:RequiredAction ; + rdfs:label "REBUILD_VCLASS_GROUP_CACHE" . + + +action:RefreshVisualizationCache + a display:RequiredAction ; + rdfs:label "REFRESH_VISUALIZATION_CACHE" . + + +action:SeeIndividualEditingPanel + a display:RequiredAction ; + rdfs:label "SEE_INDVIDUAL_EDITING_PANEL" . + + +action:SeeRevisionInfo + a display:RequiredAction ; + rdfs:label "SEE_REVISION_INFO" . + + +action:SeeSiteAdminPage + a display:RequiredAction ; + rdfs:label "SEE_SITE_ADMIN_PAGE" . + + +action:SeeStartupStatus + a display:RequiredAction ; + rdfs:label "SEE_STARTUP_STATUS" . + + +action:SeeVerbosePropertyInformation + a display:RequiredAction ; + rdfs:label "SEE_VERBOSE_PROPERTY_INFORMATION" . + + +action:UseAdvancedDataToolsPages + a display:RequiredAction ; + rdfs:label "USE_ADVANCED_DATA_TOOLS_PAGES" . + + +action:UseSparqlQueryPage + a display:RequiredAction ; + rdfs:label "USE_SPARQL_QUERY_PAGE" . + + +action:UseBasicAjaxControllers + a display:RequiredAction ; + rdfs:label "USE_BASIC_AJAX_CONTROLLERS" . + + +action:UseMiscellaneousAdminPages + a display:RequiredAction ; + rdfs:label "USE_MISCELLANEOUS_ADMIN_PAGES" . + + +action:UseMiscellaneousCuratorPages + a display:RequiredAction ; + rdfs:label "USE_MISCELLANEOUS_CURATOR_PAGES" . + + +action:UseMiscellaneousEditorPages + a display:RequiredAction ; + rdfs:label "USE_MISCELLANEOUS_EDITOR_PAGES" . + + +action:UseMiscellaneousPages + a display:RequiredAction ; + rdfs:label "USE_MISCELLANEOUS_PAGES" . + From 9d1fef76ea74d3c6ff6aadb5af9a6c1d64518346 Mon Sep 17 00:00:00 2001 From: j2blake Date: Thu, 22 Aug 2013 10:56:49 -0400 Subject: [PATCH 17/46] VIVO-258 Add a "selected" flag to each Freemarker locale variable. --- .../i18n/selection/LocaleSelectionDataGetter.java | 10 ++++++---- .../freemarker/page/partials/languageSelector.ftl | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/i18n/selection/LocaleSelectionDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/i18n/selection/LocaleSelectionDataGetter.java index 627ad04ca..9bd5107f2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/i18n/selection/LocaleSelectionDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/i18n/selection/LocaleSelectionDataGetter.java @@ -60,11 +60,11 @@ public class LocaleSelectionDataGetter implements DataGetter { return Collections.emptyMap(); } - Map result = new HashMap(); + Map result = new HashMap<>(); result.put("selectLocaleUrl", UrlBuilder.getUrl("/selectLocale")); result.put("locales", buildLocalesList(selectables)); - Map bodyMap = new HashMap(); + Map bodyMap = new HashMap<>(); bodyMap.put("selectLocale", result); log.debug("Sending these values: " + bodyMap); return bodyMap; @@ -72,7 +72,7 @@ public class LocaleSelectionDataGetter implements DataGetter { private List> buildLocalesList(List selectables) { Locale currentLocale = SelectedLocale.getCurrentLocale(vreq); - List> list = new ArrayList>(); + List> list = new ArrayList<>(); for (Locale locale : selectables) { try { list.add(buildLocaleMap(locale, currentLocale)); @@ -86,10 +86,12 @@ public class LocaleSelectionDataGetter implements DataGetter { private Map buildLocaleMap(Locale locale, Locale currentLocale) throws FileNotFoundException { - Map map = new HashMap(); + Map map = new HashMap<>(); map.put("code", locale.toString()); map.put("label", locale.getDisplayName(currentLocale)); map.put("imageUrl", LocaleSelectorUtilities.getImageUrl(vreq, locale)); + map.put("selected", currentLocale.equals(locale)); return map; } + } diff --git a/webapp/web/templates/freemarker/page/partials/languageSelector.ftl b/webapp/web/templates/freemarker/page/partials/languageSelector.ftl index 71561b5e1..d3e178a0f 100644 --- a/webapp/web/templates/freemarker/page/partials/languageSelector.ftl +++ b/webapp/web/templates/freemarker/page/partials/languageSelector.ftl @@ -25,4 +25,5 @@ * -- code * -- label (tooltip relative to the current Locale) * -- imageUrl + * -- selected (boolean) --> \ No newline at end of file From 45510fefcaad738e3f7585ced28e54235ee9a560 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Thu, 22 Aug 2013 15:03:27 -0400 Subject: [PATCH 18/46] Changing Actions to remove OR support. Adding OR support to PolicyList VIVO-101 VIVO-63 --- .../auth/policy/CompositPolicyDecision.java | 21 ++ .../vitro/webapp/auth/policy/PolicyList.java | 74 ++++- .../auth/policy/ifaces/PolicyDecision.java | 5 + .../webapp/auth/requestedAction/Actions.java | 306 +++++++++++------- .../requestedAction/AllRequestedAction.java | 26 ++ .../requestedAction/AnyRequestedAction.java | 25 ++ .../requestedAction/AuthorizedAction.java | 11 + .../requestedAction/UnauthorizedAction.java | 11 + .../controller/freemarker/PageController.java | 8 +- .../webapp/auth/policy/PolicyListTest.java | 154 +++++++++ 10 files changed, 508 insertions(+), 133 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/CompositPolicyDecision.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AllRequestedAction.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AnyRequestedAction.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AuthorizedAction.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/UnauthorizedAction.java create mode 100644 webapp/test/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyListTest.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/CompositPolicyDecision.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/CompositPolicyDecision.java new file mode 100644 index 000000000..c0e9b1045 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/CompositPolicyDecision.java @@ -0,0 +1,21 @@ +package edu.cornell.mannlib.vitro.webapp.auth.policy; + +import java.util.List; + +import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.Authorization; +import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyDecision; + +/** + * Policy decision that is made from some analysis of a set of decisions. + * @author bdc34 + * + */ +public class CompositPolicyDecision extends BasicPolicyDecision implements PolicyDecision { + List subDecisions; + + public CompositPolicyDecision(Authorization auth, String message, List subDecisions){ + super( auth, message); + this.subDecisions = subDecisions; + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyList.java index d05f04bab..ca6e047ff 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyList.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyList.java @@ -4,6 +4,8 @@ package edu.cornell.mannlib.vitro.webapp.auth.policy; import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedList; +import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -12,6 +14,8 @@ import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle; import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.Authorization; import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyDecision; import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyIface; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AllRequestedAction; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AnyRequestedAction; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; /** @@ -38,8 +42,68 @@ public class PolicyList extends ArrayList implements PolicyIface{ @Override public PolicyDecision isAuthorized(IdentifierBundle whoToAuth, RequestedAction whatToAuth) { - PolicyDecision pd = null; - for(PolicyIface policy : this){ + + if( whatToAuth instanceof AllRequestedAction ){ + return doAllAction( whoToAuth, ((AllRequestedAction)whatToAuth)); + }else if ( whatToAuth instanceof AnyRequestedAction ){ + return doAnyAction(whoToAuth, ((AnyRequestedAction)whatToAuth)); + }else{ + return checkAgainstPolicys( whoToAuth , whatToAuth); + } + } + + /** + * Checks that at least one of the subRequestedActions are authorized. + */ + private PolicyDecision doAnyAction(IdentifierBundle whoToAuth, + AnyRequestedAction whatToAuth) { + boolean anyAuth = false; + List subPd = new LinkedList(); + for( RequestedAction subAct : whatToAuth.getRequestedActions()){ + PolicyDecision pd = isAuthorized(whoToAuth,subAct); + subPd.add(pd); + if( pd.getAuthorized() == Authorization.AUTHORIZED){ + anyAuth = true; + break; + } + } + if( anyAuth ) + return new CompositPolicyDecision( Authorization.AUTHORIZED, + "Some sub-RequestedAction authorized", subPd); + else + return new CompositPolicyDecision( Authorization.UNAUTHORIZED, + "None of the sub-RequestedAction were authorized", subPd); + } + + /** + * Checks that all the subRequestedActions are authorized. + */ + private PolicyDecision doAllAction(IdentifierBundle whoToAuth, AllRequestedAction whatToAuth) { + boolean allAuth = true; + + List subPd = new LinkedList(); + for( RequestedAction subAct : whatToAuth.getRequestedActions()){ + PolicyDecision pd = isAuthorized( whoToAuth, subAct) ; + subPd.add( pd ); + if( pd.getAuthorized() != Authorization.AUTHORIZED ){ + allAuth = false; + break; + } + } + + if( allAuth ) + return new CompositPolicyDecision( + Authorization.AUTHORIZED, + "All sub-RequestedActions authorized.", subPd ); + else + return new CompositPolicyDecision( + Authorization.UNAUTHORIZED, + "Not all sub-RequestedActions authorized.", subPd ); + } + + protected PolicyDecision checkAgainstPolicys( IdentifierBundle whoToAuth, RequestedAction whatToAuth){ + PolicyDecision pd = null; + for(PolicyIface policy : this){ try{ pd = policy.isAuthorized(whoToAuth, whatToAuth); if( pd != null ){ @@ -47,8 +111,8 @@ public class PolicyList extends ArrayList implements PolicyIface{ break; if( pd.getAuthorized() == Authorization.UNAUTHORIZED ) break; - // if( pd.getAuthorized() == Authorization.INCONCLUSIVE ) - // continue; + if( pd.getAuthorized() == Authorization.INCONCLUSIVE ) + continue; } else{ log.debug("policy " + policy.toString() + " returned a null PolicyDecision"); } @@ -58,6 +122,6 @@ public class PolicyList extends ArrayList implements PolicyIface{ } log.debug("decision " + pd + " for " + whatToAuth); return pd; - } + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/ifaces/PolicyDecision.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/ifaces/PolicyDecision.java index f5e942240..6cd869cca 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/ifaces/PolicyDecision.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/ifaces/PolicyDecision.java @@ -2,6 +2,11 @@ package edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces; +/** + * Object to represent a decision from a policy. The intent is + * that the message would be presented to users to indicate why + * they are not authorized for some action. + */ public interface PolicyDecision { public Authorization getAuthorized(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/Actions.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/Actions.java index 03e3a4573..04f79e966 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/Actions.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/Actions.java @@ -21,12 +21,16 @@ import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyIface; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; /** - * An immutable list of OR and AND relationships for the required - * authorizations. A group of AND relationships is a "clause", and the list of - * clauses are in an OR relationship. + * A list of RequiredAction objects. * - * Authorization is successful if ALL of the actions in ANY of the clauses are + * Authorization is considered successful if ALL of the actions are * authorized, or if there are NO clauses. + * + * A previous version of this class had a capability to do OR clauses but + * this feature was unused and hindered composition of Actions + * objects. The ability to do an OR has been moved to AnyRequestedAction + * and AllRequestedAction. + * */ public class Actions { private static final Log log = LogFactory.getLog(Actions.class); @@ -40,139 +44,193 @@ public class Actions { } /** - * This is a list of clauses that get ORed together. - * If all of the RequestedAction objects from any of the + * This is a set of RequestedActions that get ANDed together. + * + * If all of the RequestedAction objects from the * Sets are authorized, then the Actions object should * be considered authorized. */ - private List> clauseList; + private Set requestedActions; public Actions(){ - clauseList= new ArrayList>(); + requestedActions= Collections.emptySet(); } + /** + * AND together all the RequestedAction from all the actions. + */ + public Actions(Actions... actions){ + Set newActs = new HashSet(); + + for( Actions actionToAnd : actions){ + if( actionToAnd != null && actionToAnd.requestedActions != null ){ + newActs.addAll( actionToAnd.requestedActions ); + } + } + + this.requestedActions = Collections.unmodifiableSet( newActs ); + } + public Actions(RequestedAction... actions) { this(Arrays.asList(actions)); } - - public Actions(Actions... actions){ - Set accumActs = new HashSet(); - for( Actions actionToAnd : actions){ - if( actionToAnd != null ){ - for( Set ras : actionToAnd.clauseList){ - accumActs.addAll( ras ); - } - } - } - clauseList= new ArrayList>(); - clauseList.add( accumActs ); - } - + public Actions(Collection actions) { - this(Collections.> emptyList(), actions); + this(Collections. emptySet(), actions); } - - private Actions(List> oldList, - Collection newActions) { - List> newList = new ArrayList>(); - newList.addAll(oldList); - - Set newActionSet = new HashSet( - newActions); - if (!newActionSet.isEmpty()) { - newList.add(Collections.unmodifiableSet(newActionSet)); + private Actions(Set oldList, + Collection newActions) { + + Set newActs = new HashSet(); + + if( oldList != null ){ + newActs.addAll(oldList); } - this.clauseList = Collections.unmodifiableList(newList); + + if ( newActions != null ) { + newActs.addAll( newActions ); + } + + this.requestedActions = Collections.unmodifiableSet(newActs); } + /** require all RequestedActions on this and the ones in newActions to authorize.*/ public Actions and(RequestedAction... newActions){ return and(Arrays.asList( newActions)); } + /** require all RequestedActions on this and the ones in newActions to authorize.*/ public Actions and(Collection newActions){ - return new Actions( this.clauseList, newActions); + if( newActions == null || newActions.size() == 0) + return this; + else + return new Actions( this.requestedActions, newActions); + } + + /** require all RequestedActions on this and the ones in newActions to authorize.*/ + public Actions and(Actions newActions){ + return new Actions( this.requestedActions, newActions.requestedActions); } - public void and( Actions otherAct ) throws Exception{ - andWithAction(otherAct); - } - public Actions or(RequestedAction... newActions) { return or(Arrays.asList(newActions)); } - public Actions or(Collection newActions) { - return new Actions(this.clauseList, newActions); + /** + * OR together this.requestedActions and newActions. + */ + public Actions or(Collection newActions) { + RequestedAction acts; + + if( newActions == null || newActions.size() == 0 ){ + return this; + } + + int thisActionCount = this.requestedActions.size(); + int newActionCount = newActions.size(); + + /* This minimizes the number of extra RequestedActions + * that get created when there is only one in this + * or newActions.*/ + if( thisActionCount == 1 && newActionCount == 1 ){ + return new Actions( + new AnyRequestedAction( + this.requestedActions.iterator().next(), + newActions.iterator().next() )); + } + + if( thisActionCount == 1 && newActionCount > 1 ){ + return new Actions( + new AnyRequestedAction( + this.requestedActions.iterator().next(), + new AllRequestedAction( newActions ))); + } + + if( thisActionCount > 1 && newActionCount == 1){ + return new Actions( new AnyRequestedAction( + new AllRequestedAction( this.requestedActions), + newActions.iterator().next())); + } + + if( thisActionCount > 1 && newActionCount > 1 ){ + return new Actions( + new AnyRequestedAction( + new AllRequestedAction( this.requestedActions ), + new AllRequestedAction( newActions ))); + } + //should never be reached. + log.error("Could not properly create disjunction"); + return null; } public boolean isEmpty() { - for (Set clause : clauseList) { - if (!clause.isEmpty()) { - return false; - } - } - return true; + return this.requestedActions.isEmpty(); } - /** No clauses means everything is authorized */ + + /** + * Are the RequestedAction objects for this Actions authorized + * with the ids and policy? + */ public boolean isAuthorized(PolicyIface policy, IdentifierBundle ids) { - if (clauseList.isEmpty()) { + /* No clauses means everything is authorized */ + if (requestedActions.isEmpty()) { log.debug("Empty Actions is authorized"); return true; } - return isAuthorizedForClauseList(policy, ids); - } - - /** Any entire clause is good enough. */ - private boolean isAuthorizedForClauseList(PolicyIface policy, - IdentifierBundle ids) { - for (Set clause : clauseList) { - if (isAuthorizedForClause(policy, ids, clause)) { - return true; - } + + /* Are all the RequestedAction object authorized? */ + List decisions = new ArrayList(); + for (RequestedAction action : requestedActions) { + PolicyDecision decision = policy.isAuthorized(ids, action); + log.debug("decision for '" + action.getClass().getSimpleName() + "' was: " + + decision); + decisions.add( decision ); } - return false; + return areAllAuthorized( decisions ); } - /** All actions in a clause must be authorized. */ - private static boolean isAuthorizedForClause(PolicyIface policy, - IdentifierBundle ids, Set clause) { - for (RequestedAction action : clause) { - if (!isAuthorizedForAction(policy, ids, action)) { - log.debug("not authorized"); - return false; - } - } - return true; - } - - /** Is this action authorized? */ - private static boolean isAuthorizedForAction(PolicyIface policy, - IdentifierBundle ids, RequestedAction action) { - PolicyDecision decision = policy.isAuthorized(ids, action); - log.debug("decision for '" + action.getClass().getSimpleName() + "' was: " - + decision); - return (decision != null) - && (decision.getAuthorized() == Authorization.AUTHORIZED); + private boolean areAllAuthorized( List decisions ){ + for( PolicyDecision dec : decisions){ + if( dec == null || dec.getAuthorized() != Authorization.AUTHORIZED ){ + return false; + } + } + return true; } + +// /** All actions in a clause must be authorized. */ +// private static boolean isAuthorizedForClause(PolicyIface policy, +// IdentifierBundle ids, Set clause) { +// for (RequestedAction action : clause) { +// if (!isAuthorizedForAction(policy, ids, action)) { +// log.debug("not authorized"); +// return false; +// } +// } +// return true; +// } +// +// /** Is this action authorized? */ +// private static boolean isAuthorizedForAction(PolicyIface policy, +// IdentifierBundle ids, RequestedAction action) { +// PolicyDecision decision = policy.isAuthorized(ids, action); +// log.debug("decision for '" + action.getClass().getSimpleName() + "' was: " +// + decision); +// return (decision != null) +// && (decision.getAuthorized() == Authorization.AUTHORIZED); +// } @Override public String toString() { StringBuffer sb = new StringBuffer("Actions["); - for (Iterator> cit = clauseList.iterator(); cit.hasNext();) { - Set clause = cit.next(); - sb.append("("); - for (Iterator it = clause.iterator(); it.hasNext();) { - RequestedAction action = it.next(); - sb.append(action.getClass().getSimpleName()); - if (it.hasNext()) { - sb.append(", "); - } - } - sb.append(")"); - if (cit.hasNext()) { - sb.append(" or "); + Iterator it = this.requestedActions.iterator(); + while( it.hasNext() ){ + RequestedAction act = it.next(); + sb.append( act.toString() ); + if (it.hasNext()) { + sb.append(", "); } } sb.append("]"); @@ -189,37 +247,37 @@ public class Actions { * * @throws Exception when multiple disjoint clauses are present on both Actions. */ - private void andWithAction( Actions otherAct ) throws Exception{ - Set singleClauseToAnd; - List> clauses; - - if( otherAct.singleAndClause() ){ - clauses = this.clauseList; - singleClauseToAnd = otherAct.clauseList.get(0); - }else if( this.singleAndClause() ){ - clauses = new ArrayList>( otherAct.clauseList ); - singleClauseToAnd = this.clauseList.get(0); - }else{ - //both have multiple ORed clauses, give up - throw new Exception("ANDing with an Action with multiple disjoint clauses is not supported."); - } - - // - for( Set clause : clauses){ - clause.addAll( singleClauseToAnd ); - } - this.clauseList = clauses; - } + //private void andWithAction( Actions otherAct ) throws Exception{ +// Set singleClauseToAnd; +// List> clauses; +// +// if( otherAct.singleAndClause() ){ +// clauses = this.requestedActions; +// singleClauseToAnd = otherAct.requestedActions.get(0); +// }else if( this.singleAndClause() ){ +// clauses = new ArrayList>( otherAct.requestedActions ); +// singleClauseToAnd = this.requestedActions.get(0); +// }else{ +// //both have multiple ORed clauses, give up +// throw new Exception("ANDing with an Action with multiple disjoint clauses is not supported."); +// } +// +// // +// for( Set clause : clauses){ +// clause.addAll( singleClauseToAnd ); +// } +// this.requestedActions = clauses; + //} - private boolean singleAndClause(){ - return clauseList.size() == 1; - } +// private boolean singleAndClause(){ +// return requestedActions.size() == 1; +// } - /** - * Nobody knows about this action class, so only the root user should be - * authorized for it. - */ - private static class UnauthorizedAction extends RequestedAction { - // no members - } +// /** +// * Nobody knows about this action class, so only the root user should be +// * authorized for it. +// */ +// private static class UnauthorizedAction extends RequestedAction { +// // no members +// } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AllRequestedAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AllRequestedAction.java new file mode 100644 index 000000000..9863ca81d --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AllRequestedAction.java @@ -0,0 +1,26 @@ +package edu.cornell.mannlib.vitro.webapp.auth.requestedAction; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; + +/** + * This action should be authorized if all of its subActions are authorized. + * @author bdc34 + */ +public class AllRequestedAction extends RequestedAction{ + private final Collection subActions ; + + public AllRequestedAction(RequestedAction... actions ){ + this( Arrays.asList( actions )); + } + public AllRequestedAction(Collection subActions){ + this.subActions = Collections.unmodifiableCollection( subActions ); + } + + public Collection getRequestedActions(){ + return subActions; + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AnyRequestedAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AnyRequestedAction.java new file mode 100644 index 000000000..6b00dfa4c --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AnyRequestedAction.java @@ -0,0 +1,25 @@ +package edu.cornell.mannlib.vitro.webapp.auth.requestedAction; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; + +public class AnyRequestedAction extends RequestedAction { + private final Collection subActions ; + + public AnyRequestedAction(RequestedAction... acts){ + this( Arrays.asList( acts) ); + } + + public AnyRequestedAction(Collection subActions){ + this.subActions = Collections.unmodifiableCollection( subActions ); + } + + public Collection getRequestedActions(){ + return subActions; + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AuthorizedAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AuthorizedAction.java new file mode 100644 index 000000000..c8b9acfb7 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AuthorizedAction.java @@ -0,0 +1,11 @@ +package edu.cornell.mannlib.vitro.webapp.auth.requestedAction; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; + +/** + * Action that should always be authorized. Mainly for testing. + * @author bdc34 + */ +public class AuthorizedAction extends RequestedAction{ + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/UnauthorizedAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/UnauthorizedAction.java new file mode 100644 index 000000000..7f5a220d4 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/UnauthorizedAction.java @@ -0,0 +1,11 @@ +package edu.cornell.mannlib.vitro.webapp.auth.requestedAction; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; + +/** + * Action that is always unauthorized. Mainly for testing. + * @author bdc34 + */ +public class UnauthorizedAction extends RequestedAction{ + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java index 45dc6cf3f..d082690f4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java @@ -100,12 +100,12 @@ public class PageController extends FreemarkerHttpServlet{ for( DataGetter dg : dgList){ if( dg instanceof RequiresActions ){ RequiresActions ra = (RequiresActions) dg; - Actions acts = ra.requiredActions(vreq); - if( acts != null ){ + Actions newActions = ra.requiredActions(vreq); + if( newActions != null ){ if( dgActs != null ){ - dgActs.and( acts ); + dgActs = dgActs.and( newActions ); }else{ - dgActs = acts; + dgActs = newActions; } } } diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyListTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyListTest.java new file mode 100644 index 000000000..855e368ad --- /dev/null +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyListTest.java @@ -0,0 +1,154 @@ +package edu.cornell.mannlib.vitro.webapp.auth.policy; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; + +import org.junit.Test; + +import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle; +import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.Authorization; +import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyDecision; +import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyIface; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AllRequestedAction; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AnyRequestedAction; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizedAction; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.UnauthorizedAction; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; + +public class PolicyListTest { + + @Test + public void basicPolicyListTest() { + + List polis = new ArrayList(); + polis.add( new SimplePolicy() ); + PolicyIface policy = new PolicyList( polis ); + PolicyDecision decision = policy.isAuthorized(null, new UnauthorizedAction()); + Assert.assertEquals(Authorization.UNAUTHORIZED, decision.getAuthorized() ); + + decision = policy.isAuthorized(null, new AuthorizedAction()); + Assert.assertEquals(Authorization.AUTHORIZED, decision.getAuthorized() ); + } + + /** + * Tests the handling of the AnyRequestedAction by the PolicyList. + */ + @Test + public void anyActionTest(){ + List polis = new ArrayList(); + polis.add( new SimplePolicy() ); + PolicyIface policy = new PolicyList( polis ); + + AnyRequestedAction act = new AnyRequestedAction( new UnauthorizedAction() ); + PolicyDecision decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.UNAUTHORIZED, decision.getAuthorized() ); + + act = new AnyRequestedAction( new UnauthorizedAction() , new UnauthorizedAction()); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.UNAUTHORIZED, decision.getAuthorized() ); + + act = new AnyRequestedAction( new UnauthorizedAction(),new UnauthorizedAction(),new UnauthorizedAction()); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.UNAUTHORIZED, decision.getAuthorized() ); + + act = new AnyRequestedAction( new AuthorizedAction() ); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.AUTHORIZED, decision.getAuthorized() ); + + act = new AnyRequestedAction( new AuthorizedAction(),new UnauthorizedAction() ); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.AUTHORIZED, decision.getAuthorized() ); + + act = new AnyRequestedAction( new UnauthorizedAction(),new AuthorizedAction() ); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.AUTHORIZED, decision.getAuthorized() ); + + act = new AnyRequestedAction( new UnauthorizedAction(),new UnauthorizedAction(),new AuthorizedAction()); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.AUTHORIZED, decision.getAuthorized() ); + + act = new AnyRequestedAction( new UnauthorizedAction(),new AuthorizedAction(),new AuthorizedAction()); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.AUTHORIZED, decision.getAuthorized() ); + + act = new AnyRequestedAction( new AuthorizedAction(),new AuthorizedAction(),new AuthorizedAction()); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.AUTHORIZED, decision.getAuthorized() ); + } + + /** + * Tests the handling of the AllRequestedAction by the PolicyList. + */ + @Test + public void andActionTest(){ + List polis = new ArrayList(); + polis.add( new SimplePolicy() ); + PolicyIface policy = new PolicyList( polis ); + + AllRequestedAction act = new AllRequestedAction( new UnauthorizedAction(), new UnauthorizedAction(), new UnauthorizedAction()); + PolicyDecision decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.UNAUTHORIZED, decision.getAuthorized() ); + + act = new AllRequestedAction( new UnauthorizedAction() ); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.UNAUTHORIZED, decision.getAuthorized() ); + + act = new AllRequestedAction( new UnauthorizedAction() , new AuthorizedAction() ); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.UNAUTHORIZED, decision.getAuthorized() ); + + act = new AllRequestedAction( new AuthorizedAction() , new UnauthorizedAction() ); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.UNAUTHORIZED, decision.getAuthorized() ); + + act = new AllRequestedAction( new AuthorizedAction() , new AuthorizedAction() ,new UnauthorizedAction() ); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.UNAUTHORIZED, decision.getAuthorized() ); + + act = new AllRequestedAction( new AuthorizedAction() ); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.AUTHORIZED, decision.getAuthorized() ); + + act = new AllRequestedAction( new AuthorizedAction() , new AuthorizedAction(), new AuthorizedAction() ); + decision = policy.isAuthorized(null, act); + Assert.assertNotNull( decision ); + Assert.assertEquals(Authorization.AUTHORIZED, decision.getAuthorized() ); + } + + + /** + * policy that only responds to Unauthorized and Authorized actions. + */ + public class SimplePolicy implements PolicyIface { + + @Override + public PolicyDecision isAuthorized(IdentifierBundle whoToAuth, + RequestedAction whatToAuth) { + if( whatToAuth instanceof UnauthorizedAction ) + return new BasicPolicyDecision( Authorization.UNAUTHORIZED, "SimplePolicy unauthorized"); + if( whatToAuth instanceof AuthorizedAction ) + return new BasicPolicyDecision( Authorization.AUTHORIZED, "SimplePolicy authorized"); + else + return new BasicPolicyDecision(Authorization.INCONCLUSIVE, "SimplePolicy INCONCLUSIVE"); + } + + + } +} From 19cf28da88bc552558d04422f71eca472590ec5f Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Thu, 22 Aug 2013 16:41:04 -0400 Subject: [PATCH 19/46] Fixing type with Sparql Update page permissions. VIVO-101 VIVO-63 --- .../webapp/controller/freemarker/PageController.java | 3 +-- webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 | 8 +++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java index d082690f4..785bb031b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java @@ -143,8 +143,7 @@ public class PageController extends FreemarkerHttpServlet{ return doNotFound(vreq); } - //executePageDataGetters( pageUri, vreq, getServletContext(), mapForTemplate ); - //these should all be data getters now + //these should all be DataGetters now, not PageDataGetters executeDataGetters( pageUri, vreq, mapForTemplate); mapForTemplate.putAll( getPageControllerValues( pageUri, vreq, getServletContext(), mapForTemplate)); diff --git a/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 b/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 index 6dcb46376..d3a8e017d 100644 --- a/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 +++ b/webapp/web/WEB-INF/ontologies/app/sparqlTestMenu.n3 @@ -11,11 +11,13 @@ display:SparqlUpdateMenuItem display:linkText "SPARQL Update"; display:toPage display:SparqlUpdatePage . +display:sparqlUpdateDataGetter + a . + display:SparqlUpdatePage a display:Page ; display:title "SPARQL Update" ; display:urlMapping "/sparql" ; - display:hasDataGetter display:sparqlUpdateDataGetter . + display:hasDataGetter display:sparqlUpdateDataGetter ; + display:requiredAction . -display:sparqlUpdateDataGetter - a . From 22f29cb958f4693e557e15ab8993a61478e6f170 Mon Sep 17 00:00:00 2001 From: j2blake Date: Fri, 23 Aug 2013 10:40:51 -0400 Subject: [PATCH 20/46] Create a language-neutral Dataset in the VitroRequest. --- .../vitro/webapp/controller/VitroRequest.java | 8 ++++++++ .../mannlib/vitro/webapp/dao/jena/QueryUtils.java | 15 +++++++++++---- .../vitro/webapp/filters/RequestModelsPrep.java | 1 + 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java index 854c09ac7..7b6acc351 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java @@ -95,6 +95,14 @@ public class VitroRequest extends HttpServletRequestWrapper { setAttribute("dataset", dataset); } + public Dataset getUnfilteredDataset() { + return (Dataset) getAttribute("unfilteredDataset"); + } + + public void setUnfilteredDataset(Dataset dataset) { + setAttribute("unfilteredDataset", dataset); + } + //Method that retrieves write model, returns special model in case of write model public OntModel getWriteModel() { //if special write model doesn't exist use get ont model diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtils.java index 04b03aed5..e2c1df90b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtils.java @@ -115,9 +115,16 @@ public class QueryUtils { } public static ResultSet getQueryResults(String queryStr, VitroRequest vreq) { - - Dataset dataset = vreq.getDataset(); - dataset.getLock().enterCriticalSection(Lock.READ); + return getQueryResults(queryStr, vreq.getDataset()); + } + + public static ResultSet getLanguageNeutralQueryResults(String queryStr, VitroRequest vreq) { + return getQueryResults(queryStr, vreq.getUnfilteredDataset()); + } + + /** Already have the dataset, so process the query and return the results. */ + private static ResultSet getQueryResults(String queryStr, Dataset dataset) { + dataset.getLock().enterCriticalSection(Lock.READ); QueryExecution qexec = null; ResultSet results = null; try { @@ -133,6 +140,6 @@ public class QueryUtils { } return results; - } + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java index 4d53fa058..983742ab3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java @@ -131,6 +131,7 @@ public class RequestModelsPrep implements Filter { VitroRequest vreq = new VitroRequest(req); vreq.setUnfilteredRDFService(rawRdfService); + vreq.setUnfilteredDataset(new RDFServiceDataset(rawRdfService)); List langs = getPreferredLanguages(req); RDFService rdfService = addLanguageAwareness(langs, rawRdfService); From 07cf4ad00da5a08e6bce8c3c49a69430a50c9cb6 Mon Sep 17 00:00:00 2001 From: j2blake Date: Mon, 26 Aug 2013 11:49:47 -0400 Subject: [PATCH 21/46] Fix line-ending characters --- utilities/licenser/licenser.rb | 822 +++++++++++++-------------- utilities/licenser/licenser_stats.rb | 190 +++---- 2 files changed, 506 insertions(+), 506 deletions(-) diff --git a/utilities/licenser/licenser.rb b/utilities/licenser/licenser.rb index aa939d201..4bcc4ca77 100644 --- a/utilities/licenser/licenser.rb +++ b/utilities/licenser/licenser.rb @@ -1,411 +1,411 @@ -=begin --------------------------------------------------------------------------------- - -Scan the source directory, checking for expected "magic license tags", - or -Copy the source directory, inserting licensing information into the files. - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -=end -$: << File.dirname(File.expand_path(__FILE__)) -require 'date' -require 'fileutils' -require 'pathname' -require 'property_file_reader' -require 'licenser_stats' - -class Licenser - - MAGIC_STRING = '$This file is distributed under the terms of the license in /doc/license.txt$' - - # ------------------------------------------------------------------------------------ - private - # ------------------------------------------------------------------------------------ - # - # Some paths in the properties file, if they are relative, should be relative to the - # properties file itself. - def relative_to_properties(properties, key) - path = properties[key] - base = File.dirname(properties['properties_file_path']) - - return nil if path == nil - return File.expand_path(path) if Pathname.new(path).absolute? - return File.expand_path(File.join(base, path)) - end - - # Some paths in the properties file, if they are relative, should be relative to the - # source directory. - def relative_to_source(properties, key) - path = properties[key] - base = @source_dir ? @source_dir : '' - - return nil if path == nil - return path if Pathname.new(path).absolute? - return File.expand_path(File.join(base, path)) - end - - # Confirm that the parameters are reasonable. - # - def sanity_checks_on_parameters() - # Check that all necessary properties are here. - raise("Properties file must contain a value for 'scan_only'") if @scan_only_string == nil - raise("Properties file must contain a value for 'source_dir'") if @source_dir == nil - raise("Properties file must contain a value for 'known_exceptions'") if @known_exceptions_file == nil - raise("Properties file must contain a value for 'skip_directories'") if @skip_directories_list == nil - raise("Properties file must contain a value for 'file_matchers'") if @file_match_list == nil - raise("Properties file must contain a value for 'report_level'") if @report_level_string == nil - - if !File.exist?(@source_dir) - raise "Source directory does not exist: #{@source_dir}" - end - - if !File.exist?(@known_exceptions_file) - raise "Known exceptions file does not exist: #{@known_exceptions_file}" - end - - if !@scan_only - raise("Properties file must contain a value for 'target_dir'") if @target_dir == nil - raise("Properties file must contain a value for 'license_file'") if @license_file == nil - - if File.exist?(@target_dir) - raise "Target directory already exists: #{@target_dir}" - end - - target_parent = File.dirname(@target_dir) - if !File.exist?(target_parent) - raise "Path to target directory doesn't exist: #{target_parent}" - end - - if !File.exist?(@license_file) - raise "License file does not exist: #{@license_file}" - end - end - end - - # Prepare the license as an array of lines of text, - # with the current year substituted in for ${year} - # - def prepare_license_text(license_file) - if (license_file == nil) - return [] - end - - year_string = DateTime.now.year.to_s - - text = [] - File.open(license_file) do |file| - file.each do |line| - text << line.gsub('${year}', year_string) - end - end - return text - end - - # The globs in the exceptions file are assumed to be - # relative to the source directory. Make them explicitly so. - # - # Ignore any blank lines or lines that start with a '#' - # - def prepare_exception_globs(exceptions_file, source_dir) - source_path = File.expand_path(source_dir) - globs = [] - File.open(exceptions_file) do |file| - file.each do |line| - glob = line.strip - if (glob.length > 0) && (glob[0..0] != '#') - globs << "#{source_path}/#{glob}".gsub('//', '/') - end - end - end - return globs - end - - # Recursively scan this directory, and copy if we are not scan-only. - # - def scan_dir(source_dir, target_dir) - @stats.enter_directory(source_dir) - - Dir.mkdir(File.expand_path(target_dir, @target_dir)) if !@scan_only - - Dir.foreach(File.join(@source_dir, source_dir)) do |filename| - source_path_relative = File.join(source_dir, filename) - source_path = File.join(@source_dir, source_path_relative) - target_path_relative = File.join(target_dir, filename) - target_path = File.join(@target_dir, target_path_relative) - - # What kind of beast is this? - if filename == '.' || filename == '..' - is_skipped_directory = true - else - if File.directory?(source_path) - if (path_matches_skipped?(source_path_relative)) - is_skipped_directory = true - else - is_directory = true - end - else - if filename_matches_pattern?(filename) - if path_matches_exception?(source_path_relative) - is_exception = true - else - is_match = true - end - else - is_ignored = true - end - end - end - - if is_skipped_directory - # do nothing - elsif is_directory - scan_dir(source_path_relative, target_path_relative) - elsif is_match - if @scan_only - @stats.record_scan_matching(filename) - scan_file(source_path, filename) - else - @stats.record_copy_matching(filename) - copy_file_with_license(source_path, target_path, filename) - end - elsif is_exception - @stats.record_known_exception(filename) - if @scan_only - # do nothing - else - copy_file_without_license(source_path, target_path) - end - else # not a match - if @scan_only - @stats.record_scan_non_matching(filename) - else - @stats.record_copy_non_matching(filename) - copy_file_without_license(source_path, target_path) - end - end - end - end - - # Is this directory one of the skipped? - # - def path_matches_skipped?(relative_path) - @skip_directories.each do |glob| - return true if File.fnmatch(glob, relative_path) - end - return false - end - - # Does this file path match any of the exceptions? - # - def path_matches_exception?(relative_path) - path = File.expand_path(File.join(@source_dir, relative_path)) - @known_exceptions.each do |pattern| - return true if File.fnmatch(pattern, path) - end - return false - end - - # Does this filename match any of the patterns? - # - def filename_matches_pattern?(filename) - @file_matchers.each do |pattern| - return true if File.fnmatch(pattern, filename) - end - return false - end - - # This file would be eligible for licensing if we weren't in scan-only mode. - # - def scan_file(source_path, filename) - found = 0 - File.open(source_path) do |source_file| - source_file.each do |line| - if line.include?(MAGIC_STRING) - found += 1 - end - end - end - - if found == 0 - @stats.record_no_tag(filename, source_path) - elsif found == 1 - @stats.record_tag(filename) - else - raise("File contains #{found} license lines: #{source_path}") - end - end - - # This file matches at least one of the file-matching strings, and does not - # match any exceptions. Replace the magic string with the license text. - # - def copy_file_with_license(source_path, target_path, filename) - found = 0 - File.open(source_path) do |source_file| - File.open(target_path, "w") do |target_file| - source_file.each do |line| - if line.include?(MAGIC_STRING) - found += 1 - insert_license_text(target_file, line) - else - target_file.print line - end - end - end - end - - if found == 0 - @stats.record_no_tag(filename, source_path) - elsif found == 1 - @stats.record_tag(filename) - else - raise("File contains #{found} license lines: #{source_path}") - end - end - - # Figure out the comment characters and write the license text to the file. - # - def insert_license_text(target_file, line) - ends = line.split(MAGIC_STRING) - if ends.size != 2 - raise ("Can't parse this license line: #{line}") - end - - target_file.print "#{ends[0].strip}\n" - - @license_text.each do |text| - target_file.print "#{text.rstrip}\n" - end - - target_file.print "#{ends[1].strip}\n" - end - - # This file either doesn't match any of the file-matching strings, or - # matches an exception - # - def copy_file_without_license(source_path, target_path) - FileUtils.cp(source_path, target_path) - end - - # ------------------------------------------------------------------------------------ - public - # ------------------------------------------------------------------------------------ - - # Setup and get ready to process. - # - # * properties is a map of keys to values, probably parsed from a properties file. - # - def initialize(properties) - @scan_only_string = properties['scan_only'] - @scan_only = 'false' != @scan_only_string - - @file_match_list = properties['file_matchers'] - @skip_directories_list = properties['skip_directories'] - @report_level_string = properties['report_level'] - - # These properties contain paths, and if they are relative paths, they - # should be relative to the properties file itself. - @source_dir = relative_to_properties(properties, 'source_dir') - @target_dir = relative_to_properties(properties, 'target_dir') - - # These properties contain paths, and if they are relative paths, they - # should be relative to the source_directory. - @license_file = relative_to_source(properties, 'license_file') - @known_exceptions_file = relative_to_source(properties, 'known_exceptions') - - sanity_checks_on_parameters() - - @full_report = @report_level_string === 'full' - @short_report = @report_level_string === 'short' - @file_matchers = @file_match_list.strip.split(/,\s*/) - @skip_directories = @skip_directories_list.strip.split(/,\s*/) - @license_text = prepare_license_text(@license_file) - @known_exceptions = prepare_exception_globs(@known_exceptions_file, @source_dir) - - @stats = LicenserStats.new(@source_dir, @file_matchers, @full_report) - end - - # Start the recursive scanning (and copying). - def process() - scan_dir('.', '.') - end - - # Report the summary statistics - def report(properties) - verb = @scan_only ? "scanned" : "copied" - if (@short_report) - subs = 0 - @stats.substitutions.each {|line| subs += line[1] } - known = 0 - @stats.known_exceptions.each {|line| known += line[1] } - missing = 0 - @stats.missing_tags.each {|line| missing += line[1] } - - puts "Licenser: #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." - printf(" Substitutions: %5d\n", subs) - printf(" Known exceptions: %5d\n", known) - printf(" Missing tags: %5d\n", missing) - else - puts "Licenser: run completed at #{DateTime.now.strftime("%H:%M:%S on %b %d, %Y")}" - puts " #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." - puts - puts 'Substitutions' - @stats.substitutions.sort.each do |line| - printf("%5d %s\n", line[1], line[0]) - end - puts - puts 'Known non-licensed files' - @stats.known_exceptions.sort.each do |line| - printf("%5d %s\n", line[1], line[0]) - end - puts - puts 'Missing tags' - @stats.missing_tags.sort.each do |line| - printf("%5d %s\n", line[1], line[0]) - end - puts - puts 'properties:' - properties.each do |key, value| - puts " #{key} = #{value}" - end - end - end - - # Were we successful or not? - def success? - return @stats.missing_tags.empty? - end -end - -# -# -# ------------------------------------------------------------------------------------ -# Standalone calling. -# -# Do this if this program was called from the command line. That is, if the command -# expands to the path of this file. -# ------------------------------------------------------------------------------------ -# - -if File.expand_path($0) == File.expand_path(__FILE__) - if ARGV.length == 0 - raise("No arguments - usage is: ruby licenser.rb ") - end - if !File.file?(ARGV[0]) - raise "File does not exist: '#{ARGV[0]}'." - end - - properties = PropertyFileReader.read(ARGV[0]) - - l = Licenser.new(properties) - l.process - l.report(properties) - - if l.success? - puts "Licenser was successful." - exit 0 - else - puts "Licenser found problems." - exit 1 - end -end +=begin +-------------------------------------------------------------------------------- + +Scan the source directory, checking for expected "magic license tags", + or +Copy the source directory, inserting licensing information into the files. + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +=end +$: << File.dirname(File.expand_path(__FILE__)) +require 'date' +require 'fileutils' +require 'pathname' +require 'property_file_reader' +require 'licenser_stats' + +class Licenser + + MAGIC_STRING = '$This file is distributed under the terms of the license in /doc/license.txt$' + + # ------------------------------------------------------------------------------------ + private + # ------------------------------------------------------------------------------------ + # + # Some paths in the properties file, if they are relative, should be relative to the + # properties file itself. + def relative_to_properties(properties, key) + path = properties[key] + base = File.dirname(properties['properties_file_path']) + + return nil if path == nil + return File.expand_path(path) if Pathname.new(path).absolute? + return File.expand_path(File.join(base, path)) + end + + # Some paths in the properties file, if they are relative, should be relative to the + # source directory. + def relative_to_source(properties, key) + path = properties[key] + base = @source_dir ? @source_dir : '' + + return nil if path == nil + return path if Pathname.new(path).absolute? + return File.expand_path(File.join(base, path)) + end + + # Confirm that the parameters are reasonable. + # + def sanity_checks_on_parameters() + # Check that all necessary properties are here. + raise("Properties file must contain a value for 'scan_only'") if @scan_only_string == nil + raise("Properties file must contain a value for 'source_dir'") if @source_dir == nil + raise("Properties file must contain a value for 'known_exceptions'") if @known_exceptions_file == nil + raise("Properties file must contain a value for 'skip_directories'") if @skip_directories_list == nil + raise("Properties file must contain a value for 'file_matchers'") if @file_match_list == nil + raise("Properties file must contain a value for 'report_level'") if @report_level_string == nil + + if !File.exist?(@source_dir) + raise "Source directory does not exist: #{@source_dir}" + end + + if !File.exist?(@known_exceptions_file) + raise "Known exceptions file does not exist: #{@known_exceptions_file}" + end + + if !@scan_only + raise("Properties file must contain a value for 'target_dir'") if @target_dir == nil + raise("Properties file must contain a value for 'license_file'") if @license_file == nil + + if File.exist?(@target_dir) + raise "Target directory already exists: #{@target_dir}" + end + + target_parent = File.dirname(@target_dir) + if !File.exist?(target_parent) + raise "Path to target directory doesn't exist: #{target_parent}" + end + + if !File.exist?(@license_file) + raise "License file does not exist: #{@license_file}" + end + end + end + + # Prepare the license as an array of lines of text, + # with the current year substituted in for ${year} + # + def prepare_license_text(license_file) + if (license_file == nil) + return [] + end + + year_string = DateTime.now.year.to_s + + text = [] + File.open(license_file) do |file| + file.each do |line| + text << line.gsub('${year}', year_string) + end + end + return text + end + + # The globs in the exceptions file are assumed to be + # relative to the source directory. Make them explicitly so. + # + # Ignore any blank lines or lines that start with a '#' + # + def prepare_exception_globs(exceptions_file, source_dir) + source_path = File.expand_path(source_dir) + globs = [] + File.open(exceptions_file) do |file| + file.each do |line| + glob = line.strip + if (glob.length > 0) && (glob[0..0] != '#') + globs << "#{source_path}/#{glob}".gsub('//', '/') + end + end + end + return globs + end + + # Recursively scan this directory, and copy if we are not scan-only. + # + def scan_dir(source_dir, target_dir) + @stats.enter_directory(source_dir) + + Dir.mkdir(File.expand_path(target_dir, @target_dir)) if !@scan_only + + Dir.foreach(File.join(@source_dir, source_dir)) do |filename| + source_path_relative = File.join(source_dir, filename) + source_path = File.join(@source_dir, source_path_relative) + target_path_relative = File.join(target_dir, filename) + target_path = File.join(@target_dir, target_path_relative) + + # What kind of beast is this? + if filename == '.' || filename == '..' + is_skipped_directory = true + else + if File.directory?(source_path) + if (path_matches_skipped?(source_path_relative)) + is_skipped_directory = true + else + is_directory = true + end + else + if filename_matches_pattern?(filename) + if path_matches_exception?(source_path_relative) + is_exception = true + else + is_match = true + end + else + is_ignored = true + end + end + end + + if is_skipped_directory + # do nothing + elsif is_directory + scan_dir(source_path_relative, target_path_relative) + elsif is_match + if @scan_only + @stats.record_scan_matching(filename) + scan_file(source_path, filename) + else + @stats.record_copy_matching(filename) + copy_file_with_license(source_path, target_path, filename) + end + elsif is_exception + @stats.record_known_exception(filename) + if @scan_only + # do nothing + else + copy_file_without_license(source_path, target_path) + end + else # not a match + if @scan_only + @stats.record_scan_non_matching(filename) + else + @stats.record_copy_non_matching(filename) + copy_file_without_license(source_path, target_path) + end + end + end + end + + # Is this directory one of the skipped? + # + def path_matches_skipped?(relative_path) + @skip_directories.each do |glob| + return true if File.fnmatch(glob, relative_path) + end + return false + end + + # Does this file path match any of the exceptions? + # + def path_matches_exception?(relative_path) + path = File.expand_path(File.join(@source_dir, relative_path)) + @known_exceptions.each do |pattern| + return true if File.fnmatch(pattern, path) + end + return false + end + + # Does this filename match any of the patterns? + # + def filename_matches_pattern?(filename) + @file_matchers.each do |pattern| + return true if File.fnmatch(pattern, filename) + end + return false + end + + # This file would be eligible for licensing if we weren't in scan-only mode. + # + def scan_file(source_path, filename) + found = 0 + File.open(source_path) do |source_file| + source_file.each do |line| + if line.include?(MAGIC_STRING) + found += 1 + end + end + end + + if found == 0 + @stats.record_no_tag(filename, source_path) + elsif found == 1 + @stats.record_tag(filename) + else + raise("File contains #{found} license lines: #{source_path}") + end + end + + # This file matches at least one of the file-matching strings, and does not + # match any exceptions. Replace the magic string with the license text. + # + def copy_file_with_license(source_path, target_path, filename) + found = 0 + File.open(source_path) do |source_file| + File.open(target_path, "w") do |target_file| + source_file.each do |line| + if line.include?(MAGIC_STRING) + found += 1 + insert_license_text(target_file, line) + else + target_file.print line + end + end + end + end + + if found == 0 + @stats.record_no_tag(filename, source_path) + elsif found == 1 + @stats.record_tag(filename) + else + raise("File contains #{found} license lines: #{source_path}") + end + end + + # Figure out the comment characters and write the license text to the file. + # + def insert_license_text(target_file, line) + ends = line.split(MAGIC_STRING) + if ends.size != 2 + raise ("Can't parse this license line: #{line}") + end + + target_file.print "#{ends[0].strip}\n" + + @license_text.each do |text| + target_file.print "#{text.rstrip}\n" + end + + target_file.print "#{ends[1].strip}\n" + end + + # This file either doesn't match any of the file-matching strings, or + # matches an exception + # + def copy_file_without_license(source_path, target_path) + FileUtils.cp(source_path, target_path) + end + + # ------------------------------------------------------------------------------------ + public + # ------------------------------------------------------------------------------------ + + # Setup and get ready to process. + # + # * properties is a map of keys to values, probably parsed from a properties file. + # + def initialize(properties) + @scan_only_string = properties['scan_only'] + @scan_only = 'false' != @scan_only_string + + @file_match_list = properties['file_matchers'] + @skip_directories_list = properties['skip_directories'] + @report_level_string = properties['report_level'] + + # These properties contain paths, and if they are relative paths, they + # should be relative to the properties file itself. + @source_dir = relative_to_properties(properties, 'source_dir') + @target_dir = relative_to_properties(properties, 'target_dir') + + # These properties contain paths, and if they are relative paths, they + # should be relative to the source_directory. + @license_file = relative_to_source(properties, 'license_file') + @known_exceptions_file = relative_to_source(properties, 'known_exceptions') + + sanity_checks_on_parameters() + + @full_report = @report_level_string === 'full' + @short_report = @report_level_string === 'short' + @file_matchers = @file_match_list.strip.split(/,\s*/) + @skip_directories = @skip_directories_list.strip.split(/,\s*/) + @license_text = prepare_license_text(@license_file) + @known_exceptions = prepare_exception_globs(@known_exceptions_file, @source_dir) + + @stats = LicenserStats.new(@source_dir, @file_matchers, @full_report) + end + + # Start the recursive scanning (and copying). + def process() + scan_dir('.', '.') + end + + # Report the summary statistics + def report(properties) + verb = @scan_only ? "scanned" : "copied" + if (@short_report) + subs = 0 + @stats.substitutions.each {|line| subs += line[1] } + known = 0 + @stats.known_exceptions.each {|line| known += line[1] } + missing = 0 + @stats.missing_tags.each {|line| missing += line[1] } + + puts "Licenser: #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." + printf(" Substitutions: %5d\n", subs) + printf(" Known exceptions: %5d\n", known) + printf(" Missing tags: %5d\n", missing) + else + puts "Licenser: run completed at #{DateTime.now.strftime("%H:%M:%S on %b %d, %Y")}" + puts " #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." + puts + puts 'Substitutions' + @stats.substitutions.sort.each do |line| + printf("%5d %s\n", line[1], line[0]) + end + puts + puts 'Known non-licensed files' + @stats.known_exceptions.sort.each do |line| + printf("%5d %s\n", line[1], line[0]) + end + puts + puts 'Missing tags' + @stats.missing_tags.sort.each do |line| + printf("%5d %s\n", line[1], line[0]) + end + puts + puts 'properties:' + properties.each do |key, value| + puts " #{key} = #{value}" + end + end + end + + # Were we successful or not? + def success? + return @stats.missing_tags.empty? + end +end + +# +# +# ------------------------------------------------------------------------------------ +# Standalone calling. +# +# Do this if this program was called from the command line. That is, if the command +# expands to the path of this file. +# ------------------------------------------------------------------------------------ +# + +if File.expand_path($0) == File.expand_path(__FILE__) + if ARGV.length == 0 + raise("No arguments - usage is: ruby licenser.rb ") + end + if !File.file?(ARGV[0]) + raise "File does not exist: '#{ARGV[0]}'." + end + + properties = PropertyFileReader.read(ARGV[0]) + + l = Licenser.new(properties) + l.process + l.report(properties) + + if l.success? + puts "Licenser was successful." + exit 0 + else + puts "Licenser found problems." + exit 1 + end +end diff --git a/utilities/licenser/licenser_stats.rb b/utilities/licenser/licenser_stats.rb index cac01b42a..c2b1a259f 100644 --- a/utilities/licenser/licenser_stats.rb +++ b/utilities/licenser/licenser_stats.rb @@ -1,95 +1,95 @@ -=begin --------------------------------------------------------------------------------- - -Collect the statistics of a licenser run. - --------------------------------------------------------------------------------- -=end - -class LicenserStats - attr_reader :substitutions - attr_reader :missing_tags - attr_reader :known_exceptions - attr_reader :file_count - attr_reader :dir_count - - # ------------------------------------------------------------------------------------ - private - # ------------------------------------------------------------------------------------ - # - def which_match(filename) - @file_matchers.each do |matcher| - return matcher if File.fnmatch(matcher, filename) - end - raise("filename matches no matchers!: #{filename}") - end - - # ------------------------------------------------------------------------------------ - public - # ------------------------------------------------------------------------------------ - - def initialize(root_dir, file_matchers, full) - @root_dir = "#{root_dir}/".gsub('//', '/') - @file_matchers = file_matchers - @full = full - - # keep track of how many substitutions for all file types - @substitutions = Hash.new() - file_matchers.each do |matcher| - @substitutions[matcher] = 0 - end - - # keep track of missing tags, only in file types that have missing tags - @missing_tags = Hash.new(0) - - # keep track of how many known non-licensed files we encounter, and what types. - @known_exceptions = Hash.new(0) - - # keep track of how many files are copied - @file_count = 0 - - #keep track of how many directories are copied - @dir_count = 0 - end - - def enter_directory(path) - @dir_count += 1 - puts "Entering directory: #{path}" if @full - end - - def record_scan_non_matching(filename) - @file_count += 1 - puts " Scan without mods: #{filename}" if @full - end - - def record_copy_non_matching(filename) - @file_count += 1 - puts " Copy without mods: #{filename}" if @full - end - - def record_scan_matching(filename) - @file_count += 1 - puts " Scan with mods: #{filename}" if @full - end - - def record_copy_matching(filename) - @file_count += 1 - puts " Copy with mods: #{filename}" if @full - end - - def record_known_exception(filename) - @file_count += 1 - puts " Known exception: #{filename}" if @full - @known_exceptions[which_match(filename)] += 1 - end - - def record_tag(filename) - puts " Substituted license text into #{filename}" if @full - @substitutions[which_match(filename)] += 1 - end - - def record_no_tag(filename, source_path) - puts "ERROR: Found no license tag in #{source_path.sub(@root_dir, '')}" - @missing_tags[which_match(filename)] += 1 - end -end +=begin +-------------------------------------------------------------------------------- + +Collect the statistics of a licenser run. + +-------------------------------------------------------------------------------- +=end + +class LicenserStats + attr_reader :substitutions + attr_reader :missing_tags + attr_reader :known_exceptions + attr_reader :file_count + attr_reader :dir_count + + # ------------------------------------------------------------------------------------ + private + # ------------------------------------------------------------------------------------ + # + def which_match(filename) + @file_matchers.each do |matcher| + return matcher if File.fnmatch(matcher, filename) + end + raise("filename matches no matchers!: #{filename}") + end + + # ------------------------------------------------------------------------------------ + public + # ------------------------------------------------------------------------------------ + + def initialize(root_dir, file_matchers, full) + @root_dir = "#{root_dir}/".gsub('//', '/') + @file_matchers = file_matchers + @full = full + + # keep track of how many substitutions for all file types + @substitutions = Hash.new() + file_matchers.each do |matcher| + @substitutions[matcher] = 0 + end + + # keep track of missing tags, only in file types that have missing tags + @missing_tags = Hash.new(0) + + # keep track of how many known non-licensed files we encounter, and what types. + @known_exceptions = Hash.new(0) + + # keep track of how many files are copied + @file_count = 0 + + #keep track of how many directories are copied + @dir_count = 0 + end + + def enter_directory(path) + @dir_count += 1 + puts "Entering directory: #{path}" if @full + end + + def record_scan_non_matching(filename) + @file_count += 1 + puts " Scan without mods: #{filename}" if @full + end + + def record_copy_non_matching(filename) + @file_count += 1 + puts " Copy without mods: #{filename}" if @full + end + + def record_scan_matching(filename) + @file_count += 1 + puts " Scan with mods: #{filename}" if @full + end + + def record_copy_matching(filename) + @file_count += 1 + puts " Copy with mods: #{filename}" if @full + end + + def record_known_exception(filename) + @file_count += 1 + puts " Known exception: #{filename}" if @full + @known_exceptions[which_match(filename)] += 1 + end + + def record_tag(filename) + puts " Substituted license text into #{filename}" if @full + @substitutions[which_match(filename)] += 1 + end + + def record_no_tag(filename, source_path) + puts "ERROR: Found no license tag in #{source_path.sub(@root_dir, '')}" + @missing_tags[which_match(filename)] += 1 + end +end From e2b5c7187425dbd436f284b4af3b23d5b7d830dd Mon Sep 17 00:00:00 2001 From: j2blake Date: Mon, 26 Aug 2013 14:56:54 -0400 Subject: [PATCH 22/46] VIVO-4 remove the license substitution code from the license scanner Now, it only scans. --- .gitattributes | 1 - utilities/licenser/licenser.rb | 133 ++------------------- utilities/licenser/licenser_stats.rb | 12 +- webapp/config/licenser/licenser.properties | 72 ++++++----- 4 files changed, 52 insertions(+), 166 deletions(-) diff --git a/.gitattributes b/.gitattributes index 746b59d5d..22a4a68aa 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,7 +4,6 @@ # Explicitly declare text files we want to always be normalized and converted # to native line endings on checkout. -*.properties *.conf text *.config text diff --git a/utilities/licenser/licenser.rb b/utilities/licenser/licenser.rb index 4bcc4ca77..1d507b2d6 100644 --- a/utilities/licenser/licenser.rb +++ b/utilities/licenser/licenser.rb @@ -49,7 +49,6 @@ class Licenser # def sanity_checks_on_parameters() # Check that all necessary properties are here. - raise("Properties file must contain a value for 'scan_only'") if @scan_only_string == nil raise("Properties file must contain a value for 'source_dir'") if @source_dir == nil raise("Properties file must contain a value for 'known_exceptions'") if @known_exceptions_file == nil raise("Properties file must contain a value for 'skip_directories'") if @skip_directories_list == nil @@ -63,43 +62,6 @@ class Licenser if !File.exist?(@known_exceptions_file) raise "Known exceptions file does not exist: #{@known_exceptions_file}" end - - if !@scan_only - raise("Properties file must contain a value for 'target_dir'") if @target_dir == nil - raise("Properties file must contain a value for 'license_file'") if @license_file == nil - - if File.exist?(@target_dir) - raise "Target directory already exists: #{@target_dir}" - end - - target_parent = File.dirname(@target_dir) - if !File.exist?(target_parent) - raise "Path to target directory doesn't exist: #{target_parent}" - end - - if !File.exist?(@license_file) - raise "License file does not exist: #{@license_file}" - end - end - end - - # Prepare the license as an array of lines of text, - # with the current year substituted in for ${year} - # - def prepare_license_text(license_file) - if (license_file == nil) - return [] - end - - year_string = DateTime.now.year.to_s - - text = [] - File.open(license_file) do |file| - file.each do |line| - text << line.gsub('${year}', year_string) - end - end - return text end # The globs in the exceptions file are assumed to be @@ -126,8 +88,6 @@ class Licenser def scan_dir(source_dir, target_dir) @stats.enter_directory(source_dir) - Dir.mkdir(File.expand_path(target_dir, @target_dir)) if !@scan_only - Dir.foreach(File.join(@source_dir, source_dir)) do |filename| source_path_relative = File.join(source_dir, filename) source_path = File.join(@source_dir, source_path_relative) @@ -162,27 +122,12 @@ class Licenser elsif is_directory scan_dir(source_path_relative, target_path_relative) elsif is_match - if @scan_only - @stats.record_scan_matching(filename) - scan_file(source_path, filename) - else - @stats.record_copy_matching(filename) - copy_file_with_license(source_path, target_path, filename) - end + @stats.record_scan_matching(filename) + scan_file(source_path, filename) elsif is_exception @stats.record_known_exception(filename) - if @scan_only - # do nothing - else - copy_file_without_license(source_path, target_path) - end else # not a match - if @scan_only - @stats.record_scan_non_matching(filename) - else - @stats.record_copy_non_matching(filename) - copy_file_without_license(source_path, target_path) - end + @stats.record_scan_non_matching(filename) end end end @@ -215,7 +160,7 @@ class Licenser return false end - # This file would be eligible for licensing if we weren't in scan-only mode. + # This file should contain a license tag. # def scan_file(source_path, filename) found = 0 @@ -236,57 +181,6 @@ class Licenser end end - # This file matches at least one of the file-matching strings, and does not - # match any exceptions. Replace the magic string with the license text. - # - def copy_file_with_license(source_path, target_path, filename) - found = 0 - File.open(source_path) do |source_file| - File.open(target_path, "w") do |target_file| - source_file.each do |line| - if line.include?(MAGIC_STRING) - found += 1 - insert_license_text(target_file, line) - else - target_file.print line - end - end - end - end - - if found == 0 - @stats.record_no_tag(filename, source_path) - elsif found == 1 - @stats.record_tag(filename) - else - raise("File contains #{found} license lines: #{source_path}") - end - end - - # Figure out the comment characters and write the license text to the file. - # - def insert_license_text(target_file, line) - ends = line.split(MAGIC_STRING) - if ends.size != 2 - raise ("Can't parse this license line: #{line}") - end - - target_file.print "#{ends[0].strip}\n" - - @license_text.each do |text| - target_file.print "#{text.rstrip}\n" - end - - target_file.print "#{ends[1].strip}\n" - end - - # This file either doesn't match any of the file-matching strings, or - # matches an exception - # - def copy_file_without_license(source_path, target_path) - FileUtils.cp(source_path, target_path) - end - # ------------------------------------------------------------------------------------ public # ------------------------------------------------------------------------------------ @@ -296,9 +190,6 @@ class Licenser # * properties is a map of keys to values, probably parsed from a properties file. # def initialize(properties) - @scan_only_string = properties['scan_only'] - @scan_only = 'false' != @scan_only_string - @file_match_list = properties['file_matchers'] @skip_directories_list = properties['skip_directories'] @report_level_string = properties['report_level'] @@ -319,7 +210,6 @@ class Licenser @short_report = @report_level_string === 'short' @file_matchers = @file_match_list.strip.split(/,\s*/) @skip_directories = @skip_directories_list.strip.split(/,\s*/) - @license_text = prepare_license_text(@license_file) @known_exceptions = prepare_exception_globs(@known_exceptions_file, @source_dir) @stats = LicenserStats.new(@source_dir, @file_matchers, @full_report) @@ -332,25 +222,24 @@ class Licenser # Report the summary statistics def report(properties) - verb = @scan_only ? "scanned" : "copied" if (@short_report) - subs = 0 - @stats.substitutions.each {|line| subs += line[1] } + tags = 0 + @stats.tagged_files.each {|line| tags += line[1] } known = 0 @stats.known_exceptions.each {|line| known += line[1] } missing = 0 @stats.missing_tags.each {|line| missing += line[1] } - puts "Licenser: #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." - printf(" Substitutions: %5d\n", subs) + puts "Licenser: scanned #{@stats.file_count} files in #{@stats.dir_count} directories." + printf(" Licensed files: %5d\n", tags) printf(" Known exceptions: %5d\n", known) printf(" Missing tags: %5d\n", missing) else puts "Licenser: run completed at #{DateTime.now.strftime("%H:%M:%S on %b %d, %Y")}" - puts " #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." + puts " scanned #{@stats.file_count} files in #{@stats.dir_count} directories." puts - puts 'Substitutions' - @stats.substitutions.sort.each do |line| + puts 'Licensed files' + @stats.tagged_files.sort.each do |line| printf("%5d %s\n", line[1], line[0]) end puts diff --git a/utilities/licenser/licenser_stats.rb b/utilities/licenser/licenser_stats.rb index c2b1a259f..d379b919e 100644 --- a/utilities/licenser/licenser_stats.rb +++ b/utilities/licenser/licenser_stats.rb @@ -7,7 +7,7 @@ Collect the statistics of a licenser run. =end class LicenserStats - attr_reader :substitutions + attr_reader :tagged_files attr_reader :missing_tags attr_reader :known_exceptions attr_reader :file_count @@ -33,10 +33,10 @@ class LicenserStats @file_matchers = file_matchers @full = full - # keep track of how many substitutions for all file types - @substitutions = Hash.new() + # keep track of how many tags are found in all file types + @tagged_files = Hash.new() file_matchers.each do |matcher| - @substitutions[matcher] = 0 + @tagged_files[matcher] = 0 end # keep track of missing tags, only in file types that have missing tags @@ -84,8 +84,8 @@ class LicenserStats end def record_tag(filename) - puts " Substituted license text into #{filename}" if @full - @substitutions[which_match(filename)] += 1 + puts " Found license tag into #{filename}" if @full + @tagged_files[which_match(filename)] += 1 end def record_no_tag(filename, source_path) diff --git a/webapp/config/licenser/licenser.properties b/webapp/config/licenser/licenser.properties index 7d98dd3cd..0fab7f165 100644 --- a/webapp/config/licenser/licenser.properties +++ b/webapp/config/licenser/licenser.properties @@ -1,37 +1,35 @@ -# -------------------------------------------------------------------------- -# Properties for running the licenser utility in Vitro core. -# -------------------------------------------------------------------------- - -# The path to the top level directory to be scanned or copied -# (if relative, then relative to this file) -source_dir = ../../../ - -# The path to the top level directory to copy into (ignored if only scanning) -# (if relative, then relative to this file) -target_dir = - -# A list of filename globs that match the files we want to license, -# delimited by commas with optional white-space. -file_matchers = *.java, *.jsp, *.tld, *.xsl, *.xslt, *.css, *.js, *.ftl, *.xml - -# "globs" that describe paths that we won't follow for scanning OR FOR COPYING. -# (relative to the source_dir) -skip_directories = ./bin, ./.svn, ./**/.svn, ./webapp/.build - -# The path to a file containing filename/path globs that match the files that -# we know should have no license tags in them. -# The file contains one glob per line; blank lines and comments ("#") are ignored. -# (if relative, then relative to the source directory) -known_exceptions = webapp/config/licenser/known_exceptions.txt - -# The path to the text of the license agreement (ignored if only scanning) -# If the agreement contains a ${year} token, the current year will be substituted. -# (if relative, then relative to the source directory) -license_file = doc/license.txt - -# Set to 'full' for a full report, 'short' for a brief statment, or to anything -# else for a medium-length summary. -report_level = short - -# if true, we are just scanning, not copying. -scan_only = true +# -------------------------------------------------------------------------- +# Properties for running the licenser utility in Vitro core. +# -------------------------------------------------------------------------- + +# The path to the top level directory to be scanned or copied +# (if relative, then relative to this file) +source_dir = ../../../ + +# The path to the top level directory to copy into (ignored if only scanning) +# (if relative, then relative to this file) +target_dir = + +# A list of filename globs that match the files we want to license, +# delimited by commas with optional white-space. +file_matchers = *.java, *.jsp, *.tld, *.xsl, *.xslt, *.css, *.js, *.ftl, *.xml + +# "globs" that describe paths that we won't follow for scanning OR FOR COPYING. +# (relative to the source_dir) +skip_directories = ./bin, ./.svn, ./**/.svn, ./webapp/.build + +# The path to a file containing filename/path globs that match the files that +# we know should have no license tags in them. +# The file contains one glob per line; blank lines and comments ("#") are ignored. +# (if relative, then relative to the source directory) +known_exceptions = webapp/config/licenser/known_exceptions.txt + +# The path to the text of the license agreement (ignored if only scanning) +# If the agreement contains a ${year} token, the current year will be substituted. +# (if relative, then relative to the source directory) +license_file = doc/license.txt + +# Set to 'full' for a full report, 'short' for a brief statment, or to anything +# else for a medium-length summary. +#report_level = short +report_level = medium From 2ba94ee16758e7ff66882c42d2a9cc478c94c571 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Mon, 26 Aug 2013 15:44:14 -0400 Subject: [PATCH 23/46] Refactoring how SparqlQueryServlet uses RDFService --- .../webapp/controller/SparqlQueryServlet.java | 249 ++++++++++++------ 1 file changed, 173 insertions(+), 76 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServlet.java index 6cf006637..70c64a2bb 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServlet.java @@ -3,6 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.controller; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.Writer; @@ -37,6 +38,8 @@ import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission; import edu.cornell.mannlib.vitro.webapp.beans.Ontology; import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService.ModelSerializationFormat; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService.ResultFormat; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; import edu.cornell.mannlib.vitro.webapp.utils.SparqlQueryUtils; @@ -44,42 +47,40 @@ import edu.cornell.mannlib.vitro.webapp.utils.SparqlQueryUtils; /** * Services a sparql query. This will return a simple error message and a 501 if - * there is no jena Model. + * there is no Model. * * @author bdc34 * */ public class SparqlQueryServlet extends BaseEditController { private static final Log log = LogFactory.getLog(SparqlQueryServlet.class.getName()); - - protected static HashMapformatSymbols = new HashMap(); - static{ - formatSymbols.put( ResultSetFormat.syntaxXML.getSymbol(), ResultSetFormat.syntaxXML); - formatSymbols.put( ResultSetFormat.syntaxRDF_XML.getSymbol(), ResultSetFormat.syntaxRDF_XML); - formatSymbols.put( ResultSetFormat.syntaxRDF_N3.getSymbol(), ResultSetFormat.syntaxRDF_N3); - formatSymbols.put( ResultSetFormat.syntaxText.getSymbol() , ResultSetFormat.syntaxText); - formatSymbols.put( ResultSetFormat.syntaxJSON.getSymbol() , ResultSetFormat.syntaxJSON); - formatSymbols.put( "vitro:csv", null); - } - - protected static HashMap rdfFormatSymbols = new HashMap(); - static { - rdfFormatSymbols.put( "RDF/XML", "application/rdf+xml" ); - rdfFormatSymbols.put( "RDF/XML-ABBREV", "application/rdf+xml" ); - rdfFormatSymbols.put( "N3", "text/n3" ); - rdfFormatSymbols.put( "N-TRIPLE", "text/plain" ); - rdfFormatSymbols.put( "TTL", "application/x-turtle" ); - } - protected static HashMapmimeTypes = new HashMap(); - static{ - mimeTypes.put( ResultSetFormat.syntaxXML.getSymbol() , "text/xml" ); - mimeTypes.put( ResultSetFormat.syntaxRDF_XML.getSymbol(), "application/rdf+xml" ); - mimeTypes.put( ResultSetFormat.syntaxRDF_N3.getSymbol(), "text/plain" ); - mimeTypes.put( ResultSetFormat.syntaxText.getSymbol() , "text/plain"); - mimeTypes.put( ResultSetFormat.syntaxJSON.getSymbol(), "application/javascript" ); - mimeTypes.put( "vitro:csv", "text/csv"); - } + private final static boolean CONVERT = true; + + /** + * format configurations for SELECT queries. + */ + protected static HashMap rsFormats = new HashMap(); + + private static RSFormatConfig[] rsfs = { + new RSFormatConfig( "RS_XML", !CONVERT, ResultFormat.XML, null, "text/xml"), + new RSFormatConfig( "RS_TEXT", !CONVERT, ResultFormat.TEXT, null, "text/plain"), + new RSFormatConfig( "vitro:csv", !CONVERT, ResultFormat.CSV, null, "text/csv"), + new RSFormatConfig( "RS_JSON", !CONVERT, ResultFormat.JSON, null, "application/javascript") }; + + /** + * format configurations for CONSTRUCT/DESCRIBE queries. + */ + protected static HashMap modelFormats = + new HashMap(); + + private static ModelFormatConfig[] fmts = { + new ModelFormatConfig("RDF/XML", !CONVERT, ModelSerializationFormat.RDFXML, null, "application/rdf+xml" ), + new ModelFormatConfig("RDF/XML-ABBREV", CONVERT, ModelSerializationFormat.N3, "RDF/XML-ABBREV", "application/rdf+xml" ), + new ModelFormatConfig("N3", !CONVERT, ModelSerializationFormat.N3, null, "text/n3" ), + new ModelFormatConfig("N-TRIPLE", !CONVERT, ModelSerializationFormat.NTRIPLE, null, "text/plain" ), + new ModelFormatConfig("TTL", CONVERT, ModelSerializationFormat.N3, "TTL", "application/x-turtle" ), + new ModelFormatConfig("JSON-LD", CONVERT, ModelSerializationFormat.N3, null, "application/x-turtle" ) }; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) @@ -119,9 +120,9 @@ public class SparqlQueryServlet extends BaseEditController { if( queryParam == null || "".equals(queryParam) || resultFormatParam == null || "".equals(resultFormatParam) || - !formatSymbols.containsKey(resultFormatParam) || + !rsFormats.containsKey( resultFormatParam ) || rdfResultFormatParam == null || "".equals(rdfResultFormatParam) || - !rdfFormatSymbols.keySet().contains(rdfResultFormatParam) ) { + !modelFormats.containsKey( rdfResultFormatParam ) ) { doHelp(request,response); return; } @@ -135,9 +136,7 @@ public class SparqlQueryServlet extends BaseEditController { String resultFormatParam, String rdfResultFormatParam, String queryParam, - RDFService rdfService ) throws IOException { - - ResultSetFormat rsf = null; + RDFService rdfService ) throws IOException { /* BJL23 2008-11-06 * modified to support CSV output. * Unfortunately, ARQ doesn't make it easy to @@ -145,58 +144,107 @@ public class SparqlQueryServlet extends BaseEditController { * ResultSetFormatter is hardwired with expected values. * This slightly ugly approach will have to do for now. */ - if ( !("vitro:csv").equals(resultFormatParam) ) { - rsf = formatSymbols.get(resultFormatParam); - } - String mimeType = mimeTypes.get(resultFormatParam); +// if ( !("vitro:csv").equals(resultFormatParam) ) { +// rsf = selectFormatSymbols.get(resultFormatParam); +// } +// String mimeType = rdfFormatToMimeType.get(resultFormatParam); try{ Query query = SparqlQueryUtils.create(queryParam); if( query.isSelectType() ){ - ResultSet results = null; - results = ResultSetFactory.fromJSON(rdfService.sparqlSelectQuery( - queryParam, RDFService.ResultFormat.JSON)); - response.setContentType(mimeType); - if (rsf != null) { - OutputStream out = response.getOutputStream(); - ResultSetFormatter.output(out, results, rsf); - } else { - Writer out = response.getWriter(); - toCsv(out, results); - } - } else { - Model resultModel = null; - if( query.isConstructType() ){ - resultModel = RDFServiceUtils.parseModel( - rdfService.sparqlConstructQuery( - queryParam, - RDFService.ModelSerializationFormat.N3), - RDFService.ModelSerializationFormat.N3); - }else if ( query.isDescribeType() ){ - resultModel = RDFServiceUtils.parseModel( - rdfService.sparqlDescribeQuery( - queryParam, - RDFService.ModelSerializationFormat.N3), - RDFService.ModelSerializationFormat.N3); - }else if(query.isAskType()){ - // Irrespective of the ResultFormatParam, - // this always prints a boolean to the default OutputStream. - String result = (rdfService.sparqlAskQuery(queryParam) == true) - ? "true" - : "false"; - PrintWriter p = response.getWriter(); - p.write(result); - return; - } - response.setContentType(rdfFormatSymbols.get(rdfResultFormatParam)); - OutputStream out = response.getOutputStream(); - resultModel.write(out, rdfResultFormatParam); + doSelectQuery( queryParam, rdfService, resultFormatParam, response); + } else if(query.isAskType()){ + // Irrespective of the ResultFormatParam, + // this always prints a boolean to the default OutputStream. + String result = (rdfService.sparqlAskQuery(queryParam) == true) + ? "true" + : "false"; + PrintWriter p = response.getWriter(); + p.write(result); + return; + } else { + doModelResultQuery( query, rdfService, rdfResultFormatParam, response); } } catch (RDFServiceException e) { throw new RuntimeException(e); } } + /** + * Execute the query and send the result to out. Attempt to + * send the RDFService the same format as the rdfResultFormatParam + * so that the results from the RDFService can be directly piped to the client. + * @param rdfService + * @throws IOException + * @throws RDFServiceException + */ + private void doSelectQuery( String queryParam, + RDFService rdfService, String resultFormatParam, + HttpServletResponse response) throws IOException, RDFServiceException{ + RSFormatConfig config = rsFormats.get( resultFormatParam ); + + if( ! config.converstionFromWireFormat ){ + response.setContentType( config.responseMimeType ); + InputStream results = rdfService.sparqlSelectQuery(queryParam, config.wireFormat ); + pipe( results, response.getOutputStream() ); + }else{ + //always use JSON when conversion is needed. + InputStream results = rdfService.sparqlSelectQuery(queryParam, ResultFormat.JSON ); + + response.setContentType( config.responseMimeType ); + + ResultSet rs = ResultSetFactory.fromJSON( results ); + OutputStream out = response.getOutputStream(); + ResultSetFormatter.output(out, rs, config.jenaResponseFormat); + + // } else { + // Writer out = response.getWriter(); + // toCsv(out, results); + //} + } + } + + /** + * Execute the query and send the result to out. Attempt to + * send the RDFService the same format as the rdfResultFormatParam + * so that the results from the RDFService can be directly piped to the client. + * @param rdfService + * @throws IOException + * @throws RDFServiceException + */ + private void doModelResultQuery( Query query, + RDFService rdfService, String rdfResultFormatParam, + HttpServletResponse response) throws IOException, RDFServiceException{ + + //config drives what formats and conversions to use + ModelFormatConfig config = modelFormats.get( rdfResultFormatParam ); + + InputStream rawResult = null; + if( query.isConstructType() ){ + rawResult= rdfService.sparqlConstructQuery( query.toString(), config.wireFormat ); + }else if ( query.isDescribeType() ){ + rawResult = rdfService.sparqlDescribeQuery( query.toString(), config.wireFormat ); + } + + response.setContentType( config.responseMimeType ); + OutputStream out = response.getOutputStream(); + + if( config.converstionFromWireFormat ){ + Model resultModel = RDFServiceUtils.parseModel( rawResult, config.wireFormat ); + resultModel.write(out, config.jenaResponseFormat ); + }else{ + pipe( rawResult, out ); + } + } + + private void pipe( InputStream in, OutputStream out) throws IOException{ + int size; + byte[] buffer = new byte[4096]; + while( (size = in.read(buffer)) > -1 ) { + out.write(buffer,0,size); + } + } + private void doNoModelInContext(HttpServletResponse res){ try { res.setStatus(HttpServletResponse.SC_NOT_IMPLEMENTED); @@ -299,4 +347,53 @@ public class SparqlQueryServlet extends BaseEditController { rd.forward(req,res); } + +protected static class ModelFormatConfig{ + String valueFromForm; + boolean converstionFromWireFormat; + RDFService.ModelSerializationFormat wireFormat; + String jenaResponseFormat; + String responseMimeType; + public ModelFormatConfig( String valueFromForm, + boolean converstionFromWireFormat, + RDFService.ModelSerializationFormat wireFormat, + String jenaResponseFormat, + String responseMimeType){ + this.valueFromForm = valueFromForm; + this.converstionFromWireFormat = converstionFromWireFormat; + this.wireFormat = wireFormat; + this.jenaResponseFormat = jenaResponseFormat; + this.responseMimeType = responseMimeType; + } +} + + protected static class RSFormatConfig{ + String valueFromForm; + boolean converstionFromWireFormat; + ResultFormat wireFormat; + ResultSetFormat jenaResponseFormat; + String responseMimeType; + public RSFormatConfig( String valueFromForm, + boolean converstionFromWireFormat, + ResultFormat wireFormat, + ResultSetFormat jenaResponseFormat, + String responseMimeType ){ + this.valueFromForm = valueFromForm; + this.converstionFromWireFormat = converstionFromWireFormat; + this.wireFormat = wireFormat; + this.jenaResponseFormat = jenaResponseFormat; + this.responseMimeType = responseMimeType; + } + } + + static{ + /* move the lists of configs into maps for easy lookup */ + for( RSFormatConfig rsfc : rsfs ){ + rsFormats.put( rsfc.valueFromForm, rsfc ); + } + for( ModelFormatConfig mfc : fmts ){ + modelFormats.put( mfc.valueFromForm, mfc); + } + } + } From dcda958d8d5233176137517400155e039e5d74e4 Mon Sep 17 00:00:00 2001 From: j2blake Date: Mon, 26 Aug 2013 17:37:32 -0400 Subject: [PATCH 24/46] =?UTF-8?q?VIVO-29=20Obtain=20revisi=C3=B3n=20info?= =?UTF-8?q?=20from=20Git?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subversion is no longer relevant. --- .../revisioninfo/InfoResponseParser.java | 123 ----- .../revisioninfo/RevisionInfoBuilder.java | 483 +++++++++--------- 2 files changed, 253 insertions(+), 353 deletions(-) delete mode 100644 utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/InfoResponseParser.java diff --git a/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/InfoResponseParser.java b/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/InfoResponseParser.java deleted file mode 100644 index 1f3464046..000000000 --- a/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/InfoResponseParser.java +++ /dev/null @@ -1,123 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.utilities.revisioninfo; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Parse the response that we got from SVN info. - * - * Not thread-safe. - */ -public class InfoResponseParser { - private static final Pattern URL_PATTERN = Pattern.compile("URL: (\\S+)"); - private static final Pattern ROOT_PATTERN = Pattern - .compile("Repository Root: (\\S+)"); - - private static final String TRUNK_PREFIX = "/trunk"; - private static final String TAGS_PREFIX = "/tags/"; - private static final String BRANCHES_PREFIX = "/branches/"; - - private final String infoResponse; - private String path; - - public InfoResponseParser(String infoResponse) { - this.infoResponse = infoResponse; - } - - public String parse() { - try { - path = figurePath(); - - if (isTrunkPath()) { - return "trunk"; - } else if (isTagPath()) { - return "tag " + getTagName(); - } else if (isBranchPath()) { - return "branch " + getBranchName(); - } else { - return null; - } - } catch (Exception e) { - System.err.println(e); - return null; - } - } - - private String figurePath() throws Exception { - if (infoResponse == null) { - throw new Exception("infoResponse is null."); - } - - String url = getUrlFromResponse(); - String root = getRootFromResponse(); - - if (!url.startsWith(root)) { - throw new Exception("url doesn't start with root."); - } - - return url.substring(root.length()); - } - - private String getUrlFromResponse() throws Exception { - return findNonEmptyMatch(URL_PATTERN, 1); - } - - private String getRootFromResponse() throws Exception { - return findNonEmptyMatch(ROOT_PATTERN, 1); - } - - private String findNonEmptyMatch(Pattern pattern, int groupIndex) - throws Exception { - Matcher matcher = pattern.matcher(infoResponse); - if (!matcher.find()) { - throw new Exception("no match with '" + pattern + "'. Is your Subversion client out of date?"); - } - - String value = matcher.group(groupIndex); - if ((value == null) || (value.isEmpty())) { - throw new Exception("match with '" + pattern + "' is empty."); - } - - return value; - } - - private boolean isTrunkPath() { - return path.startsWith(TRUNK_PREFIX); - } - - private boolean isTagPath() { - return path.startsWith(TAGS_PREFIX); - } - - private String getTagName() { - return getFirstLevel(discardPrefix(path, TAGS_PREFIX)); - } - - private boolean isBranchPath() { - return path.startsWith(BRANCHES_PREFIX); - } - - private String getBranchName() { - return getFirstLevel(discardPrefix(path, BRANCHES_PREFIX)); - } - - private String discardPrefix(String string, String prefix) { - if (string.length() < prefix.length()) { - return ""; - } else { - return string.substring(prefix.length()); - } - } - - private String getFirstLevel(String string) { - int slashHere = string.indexOf('/'); - if (slashHere == -1) { - return string; - } else { - return string.substring(0, slashHere); - } - } - -} diff --git a/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/RevisionInfoBuilder.java b/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/RevisionInfoBuilder.java index f533b912e..cf3ea4043 100644 --- a/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/RevisionInfoBuilder.java +++ b/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/RevisionInfoBuilder.java @@ -1,230 +1,253 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.utilities.revisioninfo; - -import java.io.BufferedReader; -import java.io.EOFException; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Writer; -import java.util.Arrays; -import java.util.List; - -import edu.cornell.mannlib.vitro.utilities.revisioninfo.ProcessRunner.ProcessException; - -/** - * Get release and revision information to display on screen. Put this - * information into a single line and append it to the specified file. - * - * Ask Subversion for the information. If Subversion is available, and if this - * is a working directory, then we can build the info from the responses we get - * from "svn info" and "svnversion". - * - * If that doesn't work, read the information from the "revisionInfo" file in - * the product directory. Presumably, that file was created when the source was - * exported from Subversion. - * - * If that doesn't work either, return something like this: - * "productName ~ unknown ~ unknown" - */ -public class RevisionInfoBuilder { - - /** - * Indicates a problem with the command-line arguments. - */ - private static class UsageException extends Exception { - UsageException(String message) { - super(message); - } - } - - /** - * An object that holds the revision information and a message about how we - * obtained it. - */ - private static class Results { - final String message; - final String infoLine; - - Results(String message, String infoLine) { - this.message = message; - this.infoLine = infoLine; - } - - public String toString() { - return message + ": " + infoLine; - } - } - - private static final String SVN_DIRECTORY_NAME = ".svn"; - private static final String[] SVNVERSION_COMMAND = { "svnversion", "." }; - private static final String[] SVN_INFO_COMMAND = { "svn", "info" }; - private static final String INFO_LINE_DELIMITER = " ~ "; - private static final String REVISION_INFO_FILENAME = "revisionInfo"; - - private final String productName; - private final File productDirectory; - private final File resultFile; - - private Results results; - - public RevisionInfoBuilder(String[] args) throws UsageException { - if (args.length != 3) { - throw new UsageException( - "RevisionInfoBuilder requires 3 arguments, not " - + args.length); - } - - productName = args[0]; - productDirectory = new File(args[1]); - resultFile = new File(args[2]); - - if (!productDirectory.isDirectory()) { - throw new UsageException("Directory '" - + productDirectory.getAbsolutePath() + "' does not exist."); - } - - if (!resultFile.getParentFile().exists()) { - throw new UsageException("Result file '" - + resultFile.getAbsolutePath() - + "' does not exist, and we can't create it " - + "because it's parent directory doesn't exist either."); - } - } - - private void buildInfo() { - results = buildInfoFromSubversion(); - if (results == null) { - results = buildInfoFromFile(); - } - if (results == null) { - results = buildDummyInfo(); - } - } - - private Results buildInfoFromSubversion() { - if (!isThisASubversionWorkspace()) { - System.out.println("Not a Subversion workspace"); - return null; - } - - String release = assembleReleaseNameFromSubversion(); - if (release == null) { - System.out.println("Couldn't get release name from Subversion"); - return null; - } - - String revision = obtainRevisionLevelFromSubversion(); - if (revision == null) { - System.out.println("Couldn't get revision level from Subversion"); - return null; - } - - return new Results("Info from Subversion", buildLine(release, revision)); - } - - private boolean isThisASubversionWorkspace() { - File svnDirectory = new File(productDirectory, SVN_DIRECTORY_NAME); - return svnDirectory.isDirectory(); - } - - private String assembleReleaseNameFromSubversion() { - String infoResponse = runSubProcess(SVN_INFO_COMMAND); - return new InfoResponseParser(infoResponse).parse(); - } - - private String obtainRevisionLevelFromSubversion() { - String response = runSubProcess(SVNVERSION_COMMAND); - return (response == null) ? null : response.trim(); - } - - private String runSubProcess(String[] cmdArray) { - List command = Arrays.asList(cmdArray); - try { - ProcessRunner runner = new ProcessRunner(); - runner.setWorkingDirectory(productDirectory); - - runner.run(command); - - int rc = runner.getReturnCode(); - if (rc != 0) { - throw new ProcessRunner.ProcessException("Return code from " - + command + " was " + rc); - } - - String output = runner.getStdOut(); - // System.err.println(command + " response was '" + output + "'"); - return output; - } catch (ProcessException e) { - return null; - } - } - - private Results buildInfoFromFile() { - try { - File revisionInfoFile = new File(productDirectory, - REVISION_INFO_FILENAME); - BufferedReader reader = new BufferedReader(new FileReader( - revisionInfoFile)); - - String release = reader.readLine(); - if (release == null) { - throw new EOFException("No release line in file."); - } - - String revision = reader.readLine(); - if (revision == null) { - throw new EOFException("No revision line in file."); - } - - return new Results("Info from file", buildLine(release, revision)); - } catch (IOException e) { - System.out.println("No information from file: " + e); - return null; - } - } - - private Results buildDummyInfo() { - String line = buildLine(null, null); - return new Results("Using dummy info", line); - } - - private String buildLine(String release, String revision) { - if (release == null) { - release = "unknown"; - } - if (revision == null) { - revision = "unknown"; - } - return productName + INFO_LINE_DELIMITER + release.trim() - + INFO_LINE_DELIMITER + revision.trim(); - } - - private void writeLine() throws IOException { - Writer writer = null; - writer = new FileWriter(resultFile, true); - writer.write(results.infoLine + "\n"); - writer.close(); - - System.out.println(results); - } - - public static void main(String[] args) { - try { - RevisionInfoBuilder builder = new RevisionInfoBuilder(args); - builder.buildInfo(); - builder.writeLine(); - } catch (UsageException e) { - System.err.println(e); - System.err.println("usage: RevisionInfoBuilder [product_name] " - + "[product_directory] [output_file]"); - System.exit(1); - } catch (Exception e) { - e.printStackTrace(); - System.exit(1); - } - } - -} +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.utilities.revisioninfo; + +import java.io.BufferedReader; +import java.io.EOFException; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.util.Arrays; +import java.util.List; + +import edu.cornell.mannlib.vitro.utilities.revisioninfo.ProcessRunner.ProcessException; + +/** + * Get release and revision information to display on screen. Put this + * information into a single line and append it to the specified file. + * + * Ask Git for the information. If Git is available, and if this is a working + * directory, then we can build the info from the responses we get from + * "git describe", "git symbolic-ref" and "git log". + * + * If that doesn't work, read the information from the "revisionInfo" file in + * the product directory. Presumably, that file was created when the source was + * exported from Git. + * + * If that doesn't work either, return something like this: + * "productName ~ unknown ~ unknown" + */ +public class RevisionInfoBuilder { + + /** + * Indicates a problem with the command-line arguments. + */ + private static class UsageException extends Exception { + UsageException(String message) { + super(message); + } + } + + /** + * An object that holds the revision information and a message about how we + * obtained it. + */ + private static class Results { + final String message; + final String infoLine; + + Results(String message, String infoLine) { + this.message = message; + this.infoLine = infoLine; + } + + @Override + public String toString() { + return message + ": " + infoLine; + } + } + + private static final String GIT_DIRECTORY_NAME = ".git"; + private static final String[] GIT_DESCRIBE_COMMAND = { "git", "describe" }; + private static final String[] GIT_SREF_COMMAND = { "git", "symbolic-ref", + "HEAD" }; + private static final String[] GIT_LOG_COMMAND = { "git", "log", + "--pretty=format:%h", "-1" }; + private static final String INFO_LINE_DELIMITER = " ~ "; + private static final String REVISION_INFO_FILENAME = "revisionInfo"; + + private final String productName; + private final File productDirectory; + private final File resultFile; + + private Results results; + + public RevisionInfoBuilder(String[] args) throws UsageException { + if (args.length != 3) { + throw new UsageException( + "RevisionInfoBuilder requires 3 arguments, not " + + args.length); + } + + productName = args[0]; + productDirectory = new File(args[1]); + resultFile = new File(args[2]); + + if (!productDirectory.isDirectory()) { + throw new UsageException("Directory '" + + productDirectory.getAbsolutePath() + "' does not exist."); + } + + if (!resultFile.getParentFile().exists()) { + throw new UsageException("Result file '" + + resultFile.getAbsolutePath() + + "' does not exist, and we can't create it " + + "because it's parent directory doesn't exist either."); + } + } + + private void buildInfo() { + results = buildInfoFromGit(); + if (results == null) { + results = buildInfoFromFile(); + } + if (results == null) { + results = buildDummyInfo(); + } + } + + private Results buildInfoFromGit() { + if (!isThisAGitWorkspace()) { + System.out.println("Not a git workspace"); + return null; + } + + String release = assembleReleaseNameFromGit(); + if (release == null) { + System.out.println("Couldn't get release name from Git"); + } + + String revision = obtainCommitIdFromGit(); + if (revision == null) { + System.out.println("Couldn't get commit ID from Git"); + } + + if ((revision == null) && (release == null)) { + return null; + } + + return new Results("Info from Git", buildLine(release, revision)); + } + + private boolean isThisAGitWorkspace() { + File gitDirectory = new File(productDirectory, GIT_DIRECTORY_NAME); + return gitDirectory.isDirectory(); + } + + private String assembleReleaseNameFromGit() { + String describeResponse = runSubProcess(GIT_DESCRIBE_COMMAND); + String srefResponse = runSubProcess(GIT_SREF_COMMAND); + return parseReleaseName(describeResponse, srefResponse); + } + + private String obtainCommitIdFromGit() { + String logResponse = runSubProcess(GIT_LOG_COMMAND); + return parseLogResponse(logResponse); + } + + private String parseReleaseName(String describeResponse, String srefResponse) { + if (describeResponse != null) { + return describeResponse.trim() + " tag"; + } else if (srefResponse != null) { + return srefResponse.substring(srefResponse.lastIndexOf('/') + 1) + .trim() + " branch"; + } else { + return null; + } + } + + private String parseLogResponse(String logResponse) { + return logResponse; + } + + private String runSubProcess(String[] cmdArray) { + List command = Arrays.asList(cmdArray); + try { + ProcessRunner runner = new ProcessRunner(); + runner.setWorkingDirectory(productDirectory); + + runner.run(command); + + int rc = runner.getReturnCode(); + if (rc != 0) { + throw new ProcessRunner.ProcessException("Return code from " + + command + " was " + rc); + } + + String output = runner.getStdOut(); +// System.err.println(command + " response was '" + output + "'"); + return output; + } catch (ProcessException e) { +// System.out.println(e); + return null; + } + } + + private Results buildInfoFromFile() { + try { + File revisionInfoFile = new File(productDirectory, + REVISION_INFO_FILENAME); + BufferedReader reader = new BufferedReader(new FileReader( + revisionInfoFile)); + + String release = reader.readLine(); + if (release == null) { + throw new EOFException("No release line in file."); + } + + String revision = reader.readLine(); + if (revision == null) { + throw new EOFException("No revision line in file."); + } + + return new Results("Info from file", buildLine(release, revision)); + } catch (IOException e) { + System.out.println("No information from file: " + e); + return null; + } + } + + private Results buildDummyInfo() { + String line = buildLine(null, null); + return new Results("Using dummy info", line); + } + + private String buildLine(String release, String revision) { + if (release == null) { + release = "unknown"; + } + if (revision == null) { + revision = "unknown"; + } + return productName + INFO_LINE_DELIMITER + release.trim() + + INFO_LINE_DELIMITER + revision.trim(); + } + + private void writeLine() throws IOException { + Writer writer = null; + writer = new FileWriter(resultFile, true); + writer.write(results.infoLine + "\n"); + writer.close(); + + System.out.println(results); + } + + public static void main(String[] args) { + try { + RevisionInfoBuilder builder = new RevisionInfoBuilder(args); + builder.buildInfo(); + builder.writeLine(); + } catch (UsageException e) { + System.err.println(e); + System.err.println("usage: RevisionInfoBuilder [product_name] " + + "[product_directory] [output_file]"); + System.exit(1); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + } + +} From 50945d5af1f8011512dcce276a72b3c7b1e22662 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Tue, 27 Aug 2013 15:10:34 -0400 Subject: [PATCH 25/46] Adding JSON-LD to SPARQL form. Adding jsonld-java libraries. VIVO-255 --- webapp/lib/jackson-annotations-2.2.1.jar | Bin 0 -> 33816 bytes webapp/lib/jackson-core-2.2.1.jar | Bin 0 -> 192105 bytes webapp/lib/jackson-databind-2.2.1.jar | Bin 0 -> 864931 bytes webapp/lib/jsonld-java-0.3-SNAPSHOT.jar | Bin 0 -> 112049 bytes webapp/lib/jsonld-java-jena-0.3-SNAPSHOT.jar | Bin 0 -> 7523 bytes .../webapp/controller/SparqlQueryServlet.java | 87 +++++++++++------- .../controller/SparqlQueryServletTest.java | 74 +++++++++++++++ webapp/web/admin/sparqlquery/sparqlForm.jsp | 15 +-- 8 files changed, 128 insertions(+), 48 deletions(-) create mode 100644 webapp/lib/jackson-annotations-2.2.1.jar create mode 100644 webapp/lib/jackson-core-2.2.1.jar create mode 100644 webapp/lib/jackson-databind-2.2.1.jar create mode 100644 webapp/lib/jsonld-java-0.3-SNAPSHOT.jar create mode 100644 webapp/lib/jsonld-java-jena-0.3-SNAPSHOT.jar create mode 100644 webapp/test/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServletTest.java diff --git a/webapp/lib/jackson-annotations-2.2.1.jar b/webapp/lib/jackson-annotations-2.2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..b49a3564e445f513dd11154c643a9ee3c4fc8ab9 GIT binary patch literal 33816 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 z zp)ZFagg$V+3y;bZcD4T@gZ-2>Nh-`%@+3;S>7L@z3h}{gf4aNyz z`2jV&Dq;-g1w(#%XxvnkH1* z<_0!K_(m;pG_o_M?Mou@E&iEC{JoaDng4wKSYMkfDPB{#9q-USz$9A{@ux2sNoGRa z;8~_o_#-*p67Cw@xzrN?ZPAhKjX+MO7kp-!tivp$*>eT)aH-yE9yuO*A==KZxy*>PXm2bx6$6i6;ACSzqvbh2NQJrUZ zhey9Yt#8oRw_ZcuA9$Ui-eB8L>b3sfQ0!N~eX(!YtK;1PUW~Xu)G&AoQ+MTw0CCi4 z7z#-H=|(|^kx=y1<9C^fK(*8rcNK|bI%=>j_I-k!t);T_5Wny9mO}qjJx6Q7hr57GkHH>bQj^5{O%kJ=n1TTw z>;lell%F*whqB}{EI`s z9e_@qE|@!cx=wx_2s~MukzY5q-Lk6Ago(s7cOmraz4<)73nRPCI+4t@8_s>(*HHka zpLWh;s7o(@a*#}ZRR(V)ZW)#W2@#Lh9zr?N!Zu<>3uisKs;^WBm^cNOL2Nyu{a9=1 zlS?CC2i}~Ly${P2-Gz!>IL}G?b&SnPL`|+*@6xp!tVC}o>8S&e`OufAVDe5P39wE& zzbteawP491Mc_nqbk!{&x;)7$rVM^3AlX|X4?mypPa&U&m->rvj1xZ#1$>{=v7kl? z56t!iF`^F>lhN~f{^etJ^z(B^044uUQ+C6IVH+m3|5FO-1LQLoOl!D2v+=e^l|UTd zcnsD~zK#{oajw8|tYEGa4)lOBgS02sj7n~R*s-QYDNk6e7vSI%>DDKGSjyxiW&&!} zmRO4<75V^=)N0w={;&3|n;~%n_~XgVreEtC4?x}05w{0SUFcazZ_|vF7dixb{>l0U z{`LkfKdf5cvQsklqC1FY#%^&P{duz!#WbcE9LdY#7vmppCQ3M`C$zC86P+5$J5hzM z0XI#gOc0X?Xo1}2?al}{QoUJX9~LOLp|$sK0HxIUBN}%?Im(SNaT$)B+d;Bmp9Tmw z$kj{+{IK%Vm&DaE_@j3n;kKz=R}X#Gyio82Rrq*ecMF2;#J>)8+z%0l?aGawS|NTJebVI##*JcU-h2W& znrz>wk7E*Oq5S-!z(Fq?E`u9tGeGMwV3T2;4&W?xI%7~3=wpGmW5@xNPp8^XuYlTN zS{}>HU~tuXI74PYd>lLrCsn4_1l{ynh`J%*!8P`s;!$gn?TTDj!ab;itHZIE&>+MQ zit(UC3VL+pj_g<4iZ-f?QDVbWWiaLk<7P3)0&uhH69d#K1U!Y_YZx2Bjf#NXw=2fXJwgiGt8vc=v=#q{(X>gwZ+`{1OH!7Duvl#5NrO{ zex3iVsNwuSKB<(ow6nA|wE5@ag_LA%d1OVDkX6c(MQkNSg!@pX0IvcdAR>=*Q>#8b z3GQJGJO?h^0)`wyX4-d)LjFDxeOVcndsR{_V;KHEeABH?(k3xs2Fq2h-S%qE?Nb@Q z@An>P10YHMnS*S2LYVh**WCNSV8T#_NzqipRK!%pRESB^)JYn3jT$M8BnCPJSoB;K zs|_!)Z76Fs)=v#rtB$WGt6+8&+r@gBi{|G$qGl9pWp+>QgIfvx$PddV!cA%C5mim4C0nvaPJVsz;Z-WHavejDnUb>p^8v zoNf6gmFRe>nTFi3&g5CMYZZ;5(0~cTDkG{0d@LwqOa_6SftrDTnh5N&PL$biAzf{G zRhJ@~%@$K|$E339`l-e(qxNa1uwy#uXwsR)zUV#@RiY04h%-IXLY)YU2sex`>sdo8 zQjkFC(uz$;VON}OM2O~=6l&WuEm?!l-XhQe@M=qLjM)~erMLQo`7xE*Z?m*S`U#Z9U=({rsJ-=SDsB<_erj(XZnN2EaHY>;@=5Q>EBp$6oKf%eoI+W?{r zYD)Ng+FCTICIJuDretwQNLwKx3OT6b`D>t%5&`YCkcCmcj*@G)&cD}P*6g6Top0M0 zQfOozHot^Vb2FUHW`3EUOl1_Q^LxB=0%!!fcN&m?rf21~?Umid(Y=zto+4oc`#CB; zHX^;MzjCtQIzK|6d^Lceyrx8r`5k)pn(g#DKVp-AhCx&9x5|9Zfc`-CrtS5q1}%P&|?zj3*<>+bS7ZHivg<1@7%p_Or^ggB)KPS4Oj?Rm_3a z&d$QHSDlXQ`snR?`SCxtKJQ^7ohzJK`y%z2%7B22jMgzhN#>EDJn zzemPE3{T-28A%`v%D_Mq&4}nAU?FD`D9IFqB$yG&B7hHC%3jLr)Fe&?8gSHC`DjR% zs@UGvXndGTy*`)_?cm8-SbcC^oIk1&$Y7F~m;7Q>onHz^aI20UDXM@*h|J7nCtUN1 z2#-`ij2>CeeX1c;y;Ki18meap_1J3HUQV0`sohxOS?|b-_H43})Y;BLs$!L;Ghtmh z-o;iMRVpSvABq|;Mr1uEp0nCgQDdwmapnv*q~>H#CMwyUNN3Px7l;!kuOZDNrH_k! z6Dz6@A7Prtw_gAgm9E6vWZ|eBB4%9Pl@`zEu~vv{h+4^z%A`|vqrPS&z-E+?q5#)A1kM_S=Vvt4YVC`C@4+3JdEcHXdKqD~|zacHxmw*9tV zAi!ffWZS2qTo)Aa3h}tgS}R;W^`K6^K(wIFUOR)y*b*w-)8~uo4BqQEd z=)Y$YzgS^W-EFNe^=y^dP)jXaFLm#ZmL(#W%~f7u3`vU`eye6QA8r}>hvsDiodN}4 zZss;csFN^1FAS?6EB}zKR7pgHg9X7V3#xM8CE2*3<|rGoOF&0Na@oL2MfwVnxPXyV zX38pv6QP$VCm$8my@sO<*fHjl0Vz(;5~FCef*(_D#D)JO^IWQkARhdUV)50A74yUx zk>X5MbM0icDR^YuAg(kTazJ@(P*aW{dwg92T+fb((E30snrYo2y;hnQmn}u#Y2% zxo~cqk<`uvmAw=uy%2ThI4gLP74rSM=sct4)xPdzaiIEiuEL=$Z?PiE<(#AZ<}-_f zrG34o)ri#z58N)%yR2=g1tw#>%O1Ra9e1O(?xq;(#l1eta4p~ zBl3rQnEZp>JcC=I5p(AT?43o9&IJtmp4rn?kGFdzLs!!oZ4Zd%Uo|pWQXf=?yEn)5Kxym? zWo>U*USyTU7Z^7*twmUDSGBe`51*vx%}BPTXj0dV9nB+e-Kb*us1Ip9s-p7-XO$f? zFN;N`rgR-JX(iCv#}lzyE6WBTL?Le{5X#^x5yXcrSny&?h*_$Idt%bsaP39YO=YXl zo5k zzV|Nr@$6gk=++c^TWkI5TCH<-SLMOS2)ccI^g4Jpu!Xz}EAA+kpSv<(F_&S5T!E|X z>TF7Fu~DgJg8yz^>DQGu{QW)Ru}F*a>=GeB+uB9jLA&~oz5T}8s)I?k<>z&u9F%G$ zsOwGiP-%nPkZf~JfGK#Qy=e@NpjI)$5-BvTp|`%g5UE9(PbPIvlnJRNsG2HbDN(he zp<3gyx=(2T7Nxe+u|e%tlTrCj{>@aA(G^SACQ1{l8G0tMbL`<4r`hL+<=W5%U136i zNt&`?LQy9l4(W)?@F3x23w9N%l!b{dW~`Kp7+JwR_l$_!z!WOpHD59!p5}QAndb;TDH@H3N55W8S$zKlY*~$Ix+1Vr5 zRU?#QHh(equkZ}%VgKe>J!oQ=CiBrnMK~4EGSEnVg=U z9$_0Bg@*?E9{$iYw9(u$DyDqt6Qx5?kA%!U-2c#}CqXKm(d<@n9^l_!)z1b9u0aAU z=Hn6N0}U`JvSAQ06`|!@QYn;g=e_=xV5YMw~p3NfpG=}tq zoN3cOoreE^l)Yn+t>KcUUAAr8wszUJZQHhO?6Pg!+GX3?WoznmpPn;4UqqkzeyoTU zv10vs;(0Ugyffb`zq&$tU@t$&3VU+!wLi#79#20-ng5bmlKCX`4Cf~K%K?15c)>Tr z<*XITb*o9|NS#~r9G7!Lwp?nb&1?Y-*ClZ1`2!pFXqBb%9LPIEU5?&2!LKIhMJ|3P z&NTLa*5#DZUvz07^uP_j?i(%g0l-I=M-449<-Q?tT!r=NIt%XvR*7Tb8QSPmcZZwt zOGB?YTlD&?%9L;g(vtVRmf5mB#+f-Q&)EWSHl}A&Bq5i^AE@VnxMP)Y>`{Ag-~|K; zemXrIeVfvo9LV}RBTz-_j{h2P-RwzBJGb@0lq@^A!{G-ku09~3|DgJgs~QCJxysmQ zkMm(`>6ZNr|Nh*XvUoCDuCI{KBx>8qX`w}G`7V&p2*3WCSX4ZX=ncJr|2_3$FPn#a;x;|Uu8Tq8L ziRjO>mA&xKe~^Q9NQN=2U`|v#U*1t(k@5of$?tG(bnFK%wK|t5%+EyAi$^nv5DQB zW*<1TE5Ir7Y5YMSxYK-3B6gVGs!J&-`SnNIKE>w{4V9f+eW9t~?>h&mey1_(l!e6$4xv#FMpEbSTMZ z{oP%E*L=ZY5jV$&1%6a=pgz)GTbQE*A}r5d zTbg4TG4?T-Se%1RHu3=UW%-*q_RR=&bRv#1c0`HcepMK!F_sl?akdW0n)J%6qZ9=PYtg1y%T&T?iZRa%W@Mgi7n*#mgb^?9cEZN?l9|9=6=|15-sZ! z_9X}0Jr~ZD2Lw(SgXTe*GymP*yA5lsgZZibGDj~+Ls%J6CP(kc8X>0APo)eL6$p8M z_2ykZU*9_75ktw^XoG`w9aMoe?qL$Ps7V|nv_SYWNYX*XIx_)}$DoXMLB;R+di<^r zIP1g%oJ&idUmQ6vie24ikF#Ehrr?Kzb|I>P_Pra2Z(~%?X){i^$`KLcM9annv#L6G zehI~Ou_=VFoz;!xI{=Aj7fjRzDS3ldHni~@&MvIo9sKo0)_k~ApK=@agOgxo-s@u`(N()N&DpVte^2Ta~Ca=tK=7ar9EX!WQaQTCqjm=`9xq3c~mZ&2=A z744APe0050f}ViS7c$%a>pj^IKG9oR>D`Ss^qu~T8=Wr5ok6V|F;DNApo(534(II9 za%b9=`=#i=pdv9fv5uCL-!P~xT{k`wy+#z?4urTq;4z;~J@cQa>gI2*l&_6nDA{6p z6>yfO>u#}w4HZYBS=>?Z{nNCMD9GRqL?;XCQ4nD>KVx@QW2Wcfj4qyx@Gc6>Teh)Y>1SSi^cNpEI4^uOBYN>CeiFK0 zs2(pXb@+b3r8liNG+%Jr{W}+(T41rmQWK_mp|7$pGndvHLRZwvzcC`rS}5eRb1Rk% zS*0Wb{3Z~+P`_lui%%y#o`H}n@~TQItzie-Rt5enydf<{+_E9-R$|=Ccd}t$HD?#w zxR$k|25lVsAF)BIu1PkioH`D~8%`bS#(RX%kflj5v!EHq2%&nZs7>0ul z!Ohlg^iHr8jY1InBzfJlBQ>f8*s!6jZ8B`Ifn!-aIia}|9}MU`9924moPbzkgvEgW zE~=UTL}+*L8>#g1#u^IDuX^UX!h>6Y{IUv?+z>2lX&zMEAUbWLWwgtmIL0B~F1lN0 zFqF1-CCB_JtQ54}ifS5ee|d^!`vWE=ISiLrr(i78b(#FQT$`D(!TMP3w%j@pgWPIxo)+D zOSio+!zZ9fSlyxz%+;RakiV0-)#Q8gU87Mp=|wvW&%0s>%fM@3P%uEsk{~YR+um~z z-=P2UivB?%%1)9*^!$NoMI!?M(EZO|(Ld}_HWpO_M+*a6=l`^biq&+Kl~+)|;G9mj z4cZ3$b*CW;gDsh0D1L^R_VK5}xxo4%3{hZpccBUgVKVSRm01#sB%}?OJ}|#sTy7Iv zI*{r>1L*s^0`#=Jzfu&Ip;B>r}wHiPR#qvta;`6JbgWFpX9y{9_a0W z-vHUJ)??&*(+mKR8^{u6!#Lhykt@g=x(+4C+l%)ba6=(97=*_SW=F5u2giwB)g550 z;4~j_$gWx(T)1`xB)LZK$<*AToqVRxZXY+gad@O9DM4*3-Sh;)W8g3nV=W5din5?Z z2fKl=G1Sq*IDI78)6|3=;CfORs3&|F!3=L;v0FnlS)bq8*=}wx&9Bc3V}GC#4)f?4 zX(hGRR2J5Ih$*T44iPnA(9bC7m2S6)n8ag7aXqWg)vx2-UoZ-7jU}vQ?vr0!qD{R@ z5T$!`YT=K%IhWOlHWE7lGT{3h?jV9kQP*W=C~)J28?H?qR$zPX0h$l3WBFaZZPj(}cws+nDr(8x7l;QaWx(lD$-p9nx=96PLYMz8~C;sm>$0O-NHBKVm6e&6nm z@U$>t&SZEJ!`nOC!cB~Mul@WzM?0PN_c}akH3zg4j@S5(UPTcE?Dk3g@)wLeiWlW! z5AP99K2UUJ?IBXoG!^ZBm7cTA$j{T0{R^s=JrmT1fI<2K~UmE6}28o z?z$VuxUp*V$8}cSwnX}CHsqy_r3>Vf$Q6|Lf3J~5+7%v7T1Jt1_4p4nMYOXVA8qyX zM5)c8$n?Y(YZp+u=wi!|?61u;=w}L=eMYswOdjcSV z@`nj7*5T3NkeCahJOKcrl1W69IIs`^;tmes=C2`oqTvp2aEShi*$1kwox49R<%q~T zkf|cBj3SVk0~6`@1ciNwo5R0BxL*TqQvozKLK2sZmF5G0lT&e7LXSV|-S2?CN_Bs+ zm%BP-ya9}~*Svhl;P$gB(Z3m|EGt2YS18wYoj{9C9H!jq4SF4FT%?vAChBvcBBQU} zK5lZ*%^kKl=&E{{_H2pu2I3plyYv=8L4cG#1o_rzX;z2 zySg_D!j$2R2}X1$s&=c}J)WX$*xeyn4~{8mnOtmfypmqhL);3U=2SkKWmdjMf{pi+ zSV{?I8SSV`c2233FLDUHxX;Lx_}fnIXf2Yv-Z%7=*0b`oQ)Fj1vWyc;l@Ys5z8}JqfjzehXE@WHb8l#cEx<`TOP=#N;kuadp$l-_`3~k>cY_c+5jzF< zfa1vVUdblI-(udHi<%-p-*w6a)IGLbedPFe2C4x&b;*f5WPvoYh3*Lbs!ZKH=wy1J z+L;+vsZy{G)a(EywKf6K6%%o{9K`(t*f;yYI7MZp_5xsPF*rxJg!IVXq33ahbkJnK7NUaa4T{Z&Xed(5H2Icn!*YS)dOOmV~$96C>g-pK6f;3Rj2IVzaVl zmcq&uv1H{*=eZ^mv-U>rf1MEXMdngL@R9+f7AXCFK}0u&{5325H}}~X3*0nH-{o03 z&HW3>UGu){z2?HC^+>UUI%{Qn7MTVq+l7~9gvaR&z=iF5m<_V6!P97b0lu~lr2aoK$oLburN zkhnGOwz2JDR#zx~qwBr2OP`P2oRPdW4e#NZJ?y81F$>IOF=qgmMI)5Cg-fl=X|G_c z+@24h36Y!fZOlukIbfprp#M|F{e#!n-4hUu|I_kr{^9k}|Nl^NPXCl~DqBieYAD}2 z3agf5SjW5iJ)lOI%vRA^*(3P-%)(e`L%4W#w9aN zaXDvB-?{5fY9B4krf-fj-MwCXz9*YbZr^Vwtvi6x1%{(K((4St^lj-4{UH|IxkjOO zy@!UX!tw%RaM)xb!R@j3gplEp?gnD;#~?$(Fj48PNq*YG19zWaUwk_xA}?*Skm4H- z$WBCPZNB5f1>w=*G+*pqMT zP1|HrqzvGNv2_%@|;+Gm&tEo z2E``biDu>KtW!~8he}QxA(TdGc2aniELWkYlug8V%86L;9HQX31M~vxy5nFR@1y>O zcE1vUqlSCoU;=`-OWIy!iF7}pxs_L1l9bE|faShH-R8Jq?J>aMYKgMQR7_~r@1C!s z>TnQF*;B1xbB|oy^;%NLT|BB_8p}As~wW(gTpE9qBbV5v!?Kj==a-u_#Ew?uZs}9Vi;GM^%yK?ri3S+x4P5u z&l6J}V6^4AX#arbz#oD^eA6Rb=K)cnr_}n$&{bEB?q8OVzNyfLzr(&A8rU}BDXBfz zdHZn9hkv%mhsj&00q#CMxsF`^{7A@HUs)zD`AeeZ8AO6V|Ch~TZ$2X_7v8eEnC{oE{zLPly1vjYChQQ-VHE zq&g&mY>;4^oxHmC;g?yA)gaoHz^%`5IvnF&2K3I;*z0_9H+T19A8~i+8UCpfkg4zF zphIlug_D60p1-@a&2<81BKy_)XePpSk(_1X2DqrojG}l%Rdl5b78ipHuJ@i0*!-5e zatKqJR$lf;o3?ItrT6X3a|27b>KwuLqom)su=$PK@Ga8#)%2*<9^w;jgds zI9D()*)kW)5*jIVOfAkhXPxc*@hiBJZr*8!B#P$>;5*E|&$;*My}x=sECtu22U-nl z#pMWK!1v6yFK7kv;h@|l&jXDfq9GcCF}yMlrZe9qEso&Q}@;v%sGUMwuimV|l*Gh?p3e3V{OJP(tbU@tB8Hd@p~S8AFF z`CWvPC23W`Us7!R?V#x*k^QJhoiEaCp(7y~fhQ3s!*J=7c$%InDcP~3A9G5nfxAKu z6J1om7pj0LBgstY!c`c?Y9pB$U(69y9pnBm2ov+SVCf!)Nj*?g+mr&Dx?(d+B6gzO z*Mj92H=UciVh6!1b4TJ0c(ZWelp4ztf}?P2(#W#rD86$ToA*`c@Tlchk9w;> z_-H?8N!e|7F3g^{IqI~X`m{#zAy>DxHj&d0w~Lw4Ba>WAvk&EYbL@u?+MH-@o)fE= z+H!%lR#0{Tqhc#JGZtJF`|i|Py{LmBSrGR=fHOzAYACL9q|88AyujoVD9lJ{*+z#D zHGbBVx-QFr?M%QbZW+4B4N5YWfk>MaIj#dGx02bswlow&B#S68leO8&YpNd)M69{!M-vOWP>Az9&cd2?f>2O0E!6ce6u9NHx&=B zDt2owDlufz@rFbf)fPzX{YVv5?ob&%nC%VQ5x(M}GK9@Rzc14zlF|#az|JKx!K}a?E*>?GTnU1iAMa`qB2gWf(l|$?w*V%-}rBu#jI%=#@ofsS>Rb+x7k!pGKVgb|Ie}Q<4xn>HXb^iBGw}M0{qBXiw5t$6{uV!q z@fFwPHt!kmRHt9bAKq`E!K=%JU#+lNTE^zMXi(mGYKABh$%%@4q;*aEm>D$M+S(^NvF#l-=bAX;bQkyK-JEydd=lo&2Dh0bwNJRi~it>ka zH{IVB5UB9xGl-Y7W1oKULjtoEM;iGx+R8Ee?;fxJm+vm>{P^wv!Jqy|j-dt(8mj!^ zPlG`G+cD1nPmYl>a5geG`DcnrQL#}%Rzvaqdu$@H2@nDxGOVd((NH$2Rf$$C4uYKp zveCqG?wp==L`Fl_Ic2&a_#LnJMtH@-p=9<}KlLESncLYJ@EdJ!FxTt(F#Ck_WYf&< z%j@%*AHej-a)h{t^bV#kewED3n%_)3Zeh_Quk+`Y*c>ik*&!KkC2@OJrXf!dlpX#g z0jn!8R2c>i4S*eOwoIMAFquW|>Ss_~J?^z1bd2umUbq8#1`@I?oUc#~p=P^wiesjj zO~rhJ&oPPX!~>p`nyP6exXf%FM%Xd8pDmIp(dU9KoXEr0gwa ztV09#X&ilE7XSA+Vp;{iYY1CeGn3)NV!2(1IeenQ3We8jUYhqdyi;b6ucfOxp6T6S zf*_0`k-D>F^_FJTwt|4RxD2SgwT5f7WAXZwS;JMchEkQ5vr8cZIT>g1dOKbNi*7GJ z)S!qpT3>k(gKwFEZrVfpk3AwX3q9=4c=PZ4a7tLxDvR`y=uKY3w$)<2?fW6#l_M`+ z7xBPri!t&hsSJ_56d`mr@@mqS*fCgLM8P|Yv?3CfrDru0}Q_Gll8qDAB9Bk zW^c+?)d^Hzs*@Ep3^KXW?A=vQ)WS!}pgm7fU-weA;r;jC?FHa6Kth)$$9>d8Il`0G z+|@_4uji4mnggW{jj&VASYp~E;m#)I2v!2hjKWSPfc({pMsz=KBOyxlDJW>@QZ_6xJ7=7L_~IbP#@!3gT+x{O z*`$}8+QU2|y8UK^vn~wJpwFu+?*)*bbr6wf@jA^erIbX&Z#kCn(n|f zhEZto3hc{0bo*23t=s+Lxgk`hpnR)*4b;Xo7K)ERAR&`7$9F|KL>)g*hZ3R>%lBb& z#*b(%#82uL-J!igW$Bm+WbO;Ys_$<$0|5BO%sA%(ES)oLJDq4#F=LjHSYwzOx%jgGY z?_}plqU3D+pCYqaMam9a1?8)T*LNuAApxDmArny3K0AyM5Xz%zNJ4w_SOoWn&^kZv zp2*Q`R+Vv)*Z=^6y-HXwWH?vT2~aLULKH%ZP;3-4qJ~o50J)=vhdOYyKx{-+rK}(~$x_T{F z;M7!g*Z9*M9eVzu$bSs_6!xS^3FVJ!MdIyTeWFrg8VHxtsNv4k6CI=bJncGAsi|Zv zuUci*`gTFPW(j#B7eu(i$^FDUyR_f(L0I$VjT%X5W8oX(>Rl}0~}Zrx!kAe%UHM&3LtXUW}= zJ{`84N0`^t>__WrWx9$`m_un@ZI-D_XYk0DCR$EIb=zuf792IKOWnD$Iv^q2^w@kO zKzs@Zo!zSX3NVu*s^e6LI)YHWw<$cvHr8$~D0SsUeiV!^_!xz9so9h_;n5j%5_T3G zao%f=7IqCbAHA!Evq8M6TH6NMfT><#baNZ)w~vIU7QDu9ZJ(vCk-&Rgk!i~%ReJN^ zUxu+T!58<*m<}R|^@Zm}B8j2Xw|>R&rh)uOHvfvZ*&n{1&*onnZzY z&1)YRE#*gWEYDe*N*lPRxdNjYb_`0pCb`E5g6VJCp6EndtugW)e%O1??%0_~h@=Jl z%!0e9sH5Kcf#w>%WaJJ=N*~g)_kVHbYC%>{E><}W!^*gUt@G>Nu~vQF<#t_(uh9x|}?epuq!^=#1iPK!~3rF_=Z|Xe+^TtIuT=KiIPhJB6y8!O&Gajy@ zl+lmz4@;5&*|>$>e@V@S(XB1jE)tW;H-oR96yvHYA4sNqdb}>UDg~2gY1{J}=thjk zHM~aQ*`dxGc{hK9{_nBL+QX**?x*r~0Q|SxG5)De{#$JN&$yHl_e*w=0YRiUtI1X< zVBQe~t*##_+rNOwB%q^gC@_anNnHGL!d0OS3mUF3A0de*{Y zRhEc|LYJjj^;>pf8Nxo{R#5_X2r-q5Ai>QoszSoiLIHl z`F|c_j*^Ysg8YxXTdvljgaLy|r8${V0ZLmV7Bldy+ zg@_x05feK5MRCxchDdk=YMXR_$obsGbMmy!@8|acRu`BCDLz)7J{lMu9X(2==sqxA z5NMFX=7LvWq@R4y5Xdr$3TlLtM}=|HMr9Q9t9*Ie4z*RP7Bdxg!|v=|mD@Q`j#iDo z=`zk{XTgTw{=tXeTqD27B;+Xo6D)QG0{#w0vskl2MQS8gV~v)%%x-d+{p9g&DpSG3 zWoB_2caVep?$UN{l`;#4`r3Am)z`Qkw{*HLb9#$RkLnd4C$wnpA=|RF`2=KRIadl# z1EuDQIk|Bp-^KW>=7`l<(#A8!`!Aa!v`j5#4RcW~rTX|46Umh6VB>(Sz-OVxUj?X^ zjY%pUaVoDI)x8mq&coLywcD1RbdA>;LIN&6heYPZVZs2okJy%uZo@eI|!U2573OEUR^D# zN|e4(&tA98;ShE^3`MWk;W>gGnFxDk!l~ragp&9Kv-Hxr1YeJmH!y1uruq7@ml|oa zMTxZ|a^jE4IJ^Ol(ZK{2B;t7ln$q#UzrgkbNkB1^K`|A55u;qspq7j2x>r1_qI?_i zu8Ay`kLW_DjOxA%m`I?-3-oZ7aqtWvD=B_clyD`z#dqN}egpjLssG2M#G?B7dh*Xx z-}v*P{hxg=(f=^Jlzz$(8-xG6s4~%vPy+%e!Y8BYWds!N;LQ&G%X}&Ni1ar)zJ`Wu z)LAMImS}i=LJ^P)~{e*Dk|E$X&XJq;CYGb-mg z3MbeD6wTZ}-L z8>JtWNkL_XAj zKrOhbB<@|g%O`E%Q@RUCgIUS6i~^(27~1s*KExem&=Urm(HhE5Dj?DZGtTHmw?CKx zn#or`y)KoFEowt5wOxBtliBI@D8=ya*E|<6GbWg0&BBAt=uXQ8E#An@#R|-AGwmc- zPcpR9Ee9V9R2DT%z2TaRch5C*QB^}{TJ^e2p4YqA<0W$Eht`5igUQOlT4omOef!@f zk5K#iV}@uAxyzj^f@2oVuh44;uebuo`o#*>_ECg&MvNlE!RH~19PZAq+JU=gEYV7; zea_I+txTnRbPUy|XSzM@L)<|Yr45jDC+cj2u?kM_>Sne5?Gl}e1&JbUx2&SU%r>^V zJ*6*|PDEjoO9l$+ca!ZKt3^pkAqnb!6U*z6iqUq&Kb8~XjAeLsZMk-Bw55V+CN|_N zB67~a%1Kw3ceWPE9)mU>Ccd>~=NL?vWO}8Sn^~yB%2S52B4Er^HG3VAa`r+Yp~+CV zN>uZLoBcRTW%F-yOB*i=BXU%}q6xpCGZo0&E)!4IjtfQS~1a#c&9%|@x~L`AojWg;zBuI;V$`$2YlyM5-6PIEG6TGs zn)o2mE*QrdEAf_9Am)?Og}_Hb9})NV#qx@ucPBO+m_QqW3(Zok@!Mhn=x3YLy6C(@ zgK0uB4Es2>d@RM;#T#Mz%sRx`8QXwo39Lk(1#v-~gpKfHy*T#WubbxA`nQ z`Eg1ZB=talI>a%Rz;;mtX&Sa-bcQ(bFmbulSwf97KL(mQlI|e&j-Z!ceIg`1ILc1o zh*L`Yoyjj&(fWV~>O-`VLw#SvZPBy0B7G5f0G~S}X}rHj`!ja$aq`pTozH5+2}n2V z76XVr1H?}?cDFs3!*Iz3`ha|9A(`Z4e8qW|fyE*7`}2|Q(T4}Gn(ZDzYQ^)^g1Z=Q zJM8VjehW89cTs^1oLN7kl-5G%=W@7Z@DRum@w$OD+Xn{>5Q2$?a$)3N?(UC4U@8rW z$0zs_Rw*=aVQ>$~A4v{l6%bE%-5Ly|y~Eu)0dtvb zF#OO>aHzYw|0!O?h#76rZkScPlH&F#+AUa~ns}q0Gw<4{OrN%$oWjo{ZYr5|;@aqd zmXrn)HCl5LN)98L|6^Qd_=?2~PCp9sVl{t*oC)W@ zEE}rlU2W_uk?@4g;Gk6*PTzu$c;N*L`eHuB;JNXE^_X$=poHdZE`MUF)d`(>ZV`ui zdoRGHd?~FkgP^b#O|uG(Jeq>a`gVLxm~0>ri?L zGXaN^(vjkGe%TNGMz>V!#?e@jSFKN37l~Yt`byc?DQo+6L3$nuYQ8E6M$PP#ZRL18A)ox5Aa`i>mNqJ(7RIT z@=rS|5c=Py<$vBS<)7_(|GZQ#s#exGOQ>IedrWzAV@Bg*#%-f>!lHN~b-6Lfhh+P< zIff#VVvLg5V@5CP8)rOM)^co&e)|)sfQk#uE0+5cG*i_06NQtm*jQjS9}!a6oC(>G z7R}>d#m%cGtm6+u$@Fq}I%dZZ*Uq$`WMAic{q@+qegA&n0|mg2SEvVaOW7rJmYgS* zP)@W-be3w+N$ga)6o@0?R=E`X!4Ip}gEN8}P+qFck%wUMKS`+fMgndY8uG)HafAyw zx~TUff{KAkx;o?Ypl!{y*Xs4TkZ8&~<6@nujMWZ&%~C5RaYrLLL}2FZW+Z{ zBbBKatz~Q(#Y$b?5v>LqFmh$$;kPQb2zapl;J>bBMy4UDHyQ$LmoDKh7JZpBk~+O{ zBa{cWsdjD6H|cj1HZY~^h)k}=W8gJ10G%i#WQNO3=wGf`uY@Z?PD4d8+j~}1;eCc5 zZ$bnrqxPUvCx%l)xRn(;>!}U&oRE)Md^e|HiagLU#pQ^BAs;qOKZb0b3J{u1Wu?{2 z_j%f)Dg{@B9=VM)U)l3ko3}Kq+F)r^gRS1ZeG_-HwH4G*?fR-x?c7V@{PQCAf1L zi6EVg2`)POu}akEGg8m2EAJ5GulV1iJ!#HM#;lL#=o&S9H~8nc_IOH{((BO%q`=ON zV5>^@Vat^$Nt>$-8Y=SeXVJbcFoRTy!-?&x z&CU@Q#kp=cCXO&p%xA|L7ow`QP5G7Xpmkh8m9Qn@Gt2PK$(UHj(&NF_#WL9pa|Pe@Qk$+ z=AHx{AgY*G_;9NZd;#?*B^K@`JM1Ec=#W~tMi1(YPP9kzuv&_ccX;d?ajgkuUMt!= zXKYMST#xY%mMAMtkZO1gA7O1^Rs_!jTRT=2{tUhwWSAB9+v7z@=7$=l*>o`~%#>kY zzOkxeK78c?UVw%-(T9oG?DZK^{g-XFLnFD#BPjQ`8x(vMw5Mr)%WGgyCS}=0P)~^& zB12%0MlxRd2%r!@m73yC2}sIG{qP?rMWfT{D0TT;m~|W91D>YedhNAKjGTeGPx@Bd zYUPN^GZRM^ap^sGr&-YKt6^00c}#!ue)Z2P#I&w4T-ViH->F{b!(JOf^9i8z?ymez z3*S@w82H3`-Y14RVCRU~*(dyfi`#v6&wkGv!OyX-3b}@IenDxXTrJa2LXciE2^JYQ zxkSqQ^%{*y-H*GfJ?83@PX`#v7u6?1b5PqRfbS&5%~i9b$OipMH1SHkeTV+y5hQrg zNt=64wu_I7+E|tyFtR|`6t;ag`+I5&5l$vQa%NyLRBIL{8*OTte-d7Vvn#!{-uiz;{f$NxK5Fm8z00VYuN9eid_~AKJKuioj}9jEsxV3*iSlk zBTeE6!tv_FDyK;VUJv|iE^@)R=s)`5AMGddGQlgqrus%POHvz?*=NVAUN${(<7$s3 z=^aK%lw6kf0C{)qb1{iOMAzokCY{g3BtG8|EFx@^EZ-o?D@w(IJw-z+ICM?31CrES zTf>}PpiogBkN@aXxMDrL(w9HU7^Em?<^R%wg&jHUXsmOU_tQOfbzuH`ygu8j2=YRq zniyIa9fPv_EuV=Y-Yqff7RiCxY*CPS`x~}dmM#i!G>@FzDi(i&ipZCKDn5i_F`m_pk@(0HKFEdc(>XIXVP+m*lSKjVTvV zyBqC}Vm55_(%}xZgD|^`d5hCSsXGL1h;=e_@zRn$ocsd$y5TP29ey3ozh`o*R>ME+ zmNOnxaOVU9D#r4{iNe`_Pth6eS>F{cea_i`RA7j=J;{?hLcI#bxpiNb=abUX%DCIIKcGseNu$0IQ)$69v1nW(O{VBgtriH4-xr1?r$~#6I@~vv;XQTu?eyj0 z;o}MB@3T532&77@-l)G72pg=}*Q~FbcOgKr=A;SX9w~25g^58XljlJw*Z=S<_#q&E z0EdXg@{v!lp*$2Pe-$k;FYL?zLW=Ds+&FYoB@xEx&orQ_d*+&b4D(Y_dRS2 zdL~qRmeU8^xS>+;>JAx^wHSxGxg@Io>cTgon)Taz=khCrJMF z&)<=V$af2bqcuHO(@#m;L7*+*$T(3{#rP6Sg+A!`2uzIvPC4T!Dn*$q9w0tpHvlM> zQloS!A{xPjWm3;5IJ#luS7^#vWULf*>!be*;PGp%&eiKj)083nzi1i>IUze+XA}4T zdM6`Q%N|(;WAuB2O(x5hz6ez7Hv$5wjMQK;0R)6irePaPdZ?5Zt8LN(i%o+T`^LPd z&@i?;;PqPp{apdyZ(`+s1^i?O9QuQxwA=p4mt7O@<=bB)*O#`5rr6wIx;;)$+&iy1 zcD>)@X`hGlug?HgqxW!C!hWPbc$lnTKlqDdG+WyvvVm!vP4P__2jphrV}FR_-(h=_ zLyY?ZK!x6HBQgz0lw+HvH)|a1t@mOn*W&jXBh$gSNvItAeMr)4j5-0_IO-#%ZtD(d z0AeK7(q#&0hJ!%aUSh=(<5|gvZR{K@69wz4fGLP%Vkzo^vC!sg*eZ(K29(u|E>tNG zv66H3O+;RWkrQ2=7RT&D7J51)q~nU&!-7*Bg8mEyzuA~r7ORXS8g)$E1Lbde(t%g9Ot zOFFKUVw%aX_0ZxmJ6Xw9%5@-pF=;-bj1(6R`!`i^U3J(DfAO47bO$uTS#-@O^be5a z7A=Vb?-EmWIkE!nR7sQc=lV(Mh0EmdJ#dk+Vnpa&Fr8DYeL41Hu~5h%o2$!_gl_5k zfcDcGfgagxyQ$9_Yo>k!o4sD?Q# zcp`n6SONW-kRpcN@Td!iZPOB_UKg&~E6Ks8Uyf8Co%XcV+(mR?RgF-GZ4I}wuLhX? z?j`$(_7Z*|v>sJJd_G9Wg%5W}fRAv;7!~Fj;2jm=iTwEzOD>#!*r+sekVFKx`#Ze! zrYYR)rpo`QeFcUjiH43;LLt$XYGR~0m%6z>zhCywy zjCGtj!*g3P< zg7@(HG8QB-p$3?j_bc8XSH#qUGa*yb%K_kgMwEZt5#%MZI)xRwJA{@81uFOx(XW<% z758*2#b@}fW`^&(Bo?Cmv!|+cRq|bwgtc~FH4Fpp@9nd$ufe^C7PHGlJAJ7vTG_T; zrBA=Eo*74$g^t|`AHRy3pWpJ5Pcb-Vj?b?W+}ZgK_a+gm13SW?T%Ft>wfQ18W_9k9 zY3U6nAExtbC&wQcw(DmcG@4xv3){W)2fo(bk;m1Qtm!9d|M1(9Or@zYfYZ zW?Mv#O4=ld-;s+6fwxB^*+zL(5{-?`ezdvDTWzMWXTcpMDR-~IvHe>Ih%LcJ40R2| zq2)Icw>&Wac|Cf};z|~y_;o+UiNOSwYDb@Q!G#{o7`4;4>D}s8gAAGt@>&K^AuL+z)ROnd4k2;4pQgDOSnrGA+>zv=SXyd zCnfh`n2PF~LSybZlfS17ZY-V@UB+On-c|0%%_s8g0-*dx9%lz-eUNuAP{@)_!JuII zi;^4?!Agf`bkY=)h}mHIQAsF%ap&G0wv;lE^z2KR?iNhE+lsv=Zr(4p|+p#qg35iA&t1m{g37^muU_;1H->_BO!ew*FwI1noZ0*(#($DmG>=u)CEuvH*d;kaf ziQmLQ_$KV)&xStF0Mj$?nUti4?B*eTFbDd{-q1sQ9a+00yniFxGVie|nFi9g4D=Gc ztblxn?(QIcbgtcG9S5Xk-8kNZp#=KL-QYuf5%>EMz05Z5<$LV9BHOalixIxigM6p# z_9A|`1%4+4alfvVLGD-&SV8Lg07|{(NSXcl@Qqa!0_@8Zevdl#GoxS?&WBe@Y6#Kh zsj6wdVi~2maHGo$u!1|rm%Ku11d7)7-JJH50Klvisl0a3f}*K_URcS!zG?zTlE>wWw1RW6qULZ3|c z={J%V)9*b;R%dqx{2Z(f9{Y-GR6IIcg`pJ76RP1xmBA&v)76qtE1ovA6^}aHmC8M^ z<`yByt+LQ8o)@5=vSnMbz?TCh8FH@_Vnqe8<#FelS=7nK{kEM2+@Y;KE2q(zEkl7#O>_w6Rk!!!G)$WcX_b4%@mF!8 zf+v9!$~5qzlk>z1wj;p?t0j!kXb%0jHjFcHRb9G@Mb^|jiD(_DF{tb?4om8`oAMW! zDi8YOuePR=B-N6-sjwd1$V{wp(}sy9B?f@hOc-#Q(4cTaM65v0SesNBI_NOi)P^_M z(&xawLlM-Nv}7umXAJxos|E^`p7PeJTF08_cWf_=Y3rlgEH{);rR|*W zbzm*0hK8}yEZ#s&OF*%*(PX__5G_@a!$zGoSY*ZT<82(;*|85!Kg>ph0ZSPH`f>X> zqAu4|QWB{2nBcg#$2sw>d7n0#@*1X_cAHt5|EYS=?3wwHATD*i}yQS-6`FLs$ARjK={}*ZJ z+}-K7ZTU)4u`0H0+qP}ncB*3Awr%qp+fFLB?R0*9ZjXD${i9Eh(XZjz&)#dT`I&Pe zzPVWUo8k~yFJ1fKfZrrW3*{cqTh`#7Bcha~gW&M>GD&iUum-xk%TLlOX%d+)-%w}I zJ4A=C88kf-u~7FL;_waa`Hu?SRLBsQQ?5x;2UQi}05xnviT0m!4+A^aT9&Aa5oJu; z3s5I*`n&$7=j_QPL66b^^^5v67Z3^Iy!U|Ro4rx$6ju?^;#dP! z;wFFAF;?0XTtBM>sf$TNPEvAvWUYj%+kkO`5U7U5Pcp5qRZW%K-?bI10L&TsA51Ht z8Yx2wU7j*M3>%l|(_ynNOe09&fZ%Waa#~cu%(Xk?5bliY@1luY~)!3nh*SItwi3SQ?14%j>yXpkU&f=RRO^0aa>dI52 zbn_`K<7p7$OrYq*1_RXWT+eRuFahXIA=1hGt!<>c@M(4Y`Rgl)ZFNQ@io+dQs`7$c$8U<3V9T)!sXS701a;qmD`uNpqp|Ndsf{Cs5h-3%kE-J zb~ym?oK*0vS*$K+BrQRgHM$P}>xRL-<6INq_)feAU3A&N|MaGCy5$5qw)&Of=%ifg zmP=LV=eucq$P@5zgt!jG+hB;rU{|bR&6&gzP$9~dSURAiTfrx53+nA`_lbcKYH4k% zjh(jmma?0kTYB?m`k0 zw+wG%L$~3we;VRsBSFXLxlQ4*;A(Q*ndF^Tz55QFDGMl>?^<=X;c;`^X7|U2MWdUy zA4P~f5{FK=x9Ep^Nu_&Gc=tS!JRF+?jL=?&bgO#CHMt%Dv991oYA%M%-p$|5!M|q0 z*gF@x51|5T?|Ehb6DW3-7rJ|`^%xyPG=&cp-p?2f&u#!oDGwT5e<<~MnKml zji~6JYYO?QPWZ{=rC&*zpHwrV*4hyR_fxNywQ=e5qoFigeK@R~Kl<4?^M>eQkqP)y zZvA=gj_u<~urFPwtF3!*-cw)gG&3V?*J?@;D@@mffw2Q%bh6mrKznTNpXZZRx ztL^aLIwZUuI0-=3?to6bM1`^|8o?QaBg->*>O0J#DgaCo6Bsi+=#S)X>mk#XSd zQ3omJNymW&C|s3szGTk2y;n^){M{`xAgi|*29S0{2;nR#oqCmTo;_}F>lVJVwOYGL zpq!_VujUNT?SgGJD(na|ucd$XV1mqKfKe3OfQDqFB%5<}iW`b`X>Ic@1xw(@MhPW4 zy4b9*#zxs>(yq136n*LibD7Q2x<6B_1gr^M^2Lg%ZRD6b2u4&$QE-YLbt$_J;m%C( zN;m6BO2fL11@THN=4E$u z#_Sg9y&~Oyx?aBhIA4I*XKYsp1!oAT%?i4@8NMnw?~bV(zcd1@%Jt&)4j!9?-QR3J zvrFaWm|PPReEDcki=9RVKI3?sY(<%serRy}ACY^c%5C5|JPo@;PVc#N{&7p7+~;A;)E2|ZXxz6#`8Pzptv zib|qDjvW{t`V2xA=_&+0<&ejpk%P(Vc3*n>d32uCgKyhrIA^jfT+%CtVM1So=S_nu zyzJJ(Rm0~-{d$@yv)sg#?ADwKH)}$fLWiArmFIdRRFN8m4asZmrf4pz2S){Ok!W$a zWZi)os^jM2OU@wkyf<(6xw1GblWC`q>;?g9U*^$6|A%bzGR)(?wuD)Xiy`6;XBs~R zGMhtOm`30wN8lymjUniwE;)xfkx{KGjO&rZ3UQlx0=M(1ur^VNQHXT^q~f1-W5#Ym zrR!ShVI)UVU&^4s-w3``gMprq2D-uUh1&QiyNMd{6b*w^ylKQv#_bbHh-q|3BfuJj zNshQ?N8^GTG!aEA<;2vBh7wWEj!%*rq+A|E-bva|V^D2!r~5z}BtD79DbVNs>{v#M zpa#7@(gLC7p|kOPqIg^cR-UvK`ku2Zb$GY43B|ryq&b`_mB0@nrC~)UTkb|>&1my? zP1UPWMYb$=(OaAyvuB>}*Puy&6a-_O0xt#^J^vf(OXdeIwlZ6&BnlTz3(rrSs3`)0 z7*F{+X!gPV$R51};2QZnPhuMira3Qr(=<09cqp=s0I9J~hpF2JhFWlv7hSiMX^mzy zkzl2>^uefs%*RPdN1Lkip<_n7pf#z;{SiFFDY;u$q5|uF*`}3%-4JjCrO9OA)t@QW z!L$VKMX-Cskzt5ClN-^FZ7@lQB25Fe%G83SvLo8j4|9H#b3x<#l3XOVg}(!f(mZ5W z_{I}-hZ5k&P+mAlI%4B$%H2%)B$poxBIQOfI1YG9(f@`tJddW067X@94Bnf#(oOkN z4zux^DK;$6J5VGs>v0;tlA}1ZC7bGnfI4>BfW^$4^?u&*&jpr^k~LIEA1F8_PW9cl zE@W>Ae_PgL&N-S#`EBtIF9G+w6YC-Qz7r*V(2so#_m$1Cz37w-?)%Kun#~S3|2_u& zryBv0u;B^(=35}Xf#UzL!}hxykuh;JGco=LHZ!pK*AO&HMN1CL3^}uDnVNN+W#)u;a6^8x}c$?$Gn~nep^QJCYD;ajf)K+v&kWMcQTRF3shbyJ^}ML~WL8 z<4@;5G6f6m&b8!oy_GZuSi_C2`$p zcy-%p0dvjMGVnnIqQYJg0T6A?&Wx{s1k_=1-uP=b{i+C1FLB2-*pwgL2VLWM5V91#%sw0D7|h2i1lyKFCBQn` zF$)5{#NnwQ;C+ex0LK&1r(15(BTSvcPIUgspU~@kL2!QzQ5HeW;;$OXOR^~WComtM zzJP_2j3?DKMrQtr{yrz~?F3e#Mr*@^N)CczO^<(!IVGU=+7G;;|f_>Px<;3Jw7UbD#$Gb?V- zHZpF1)&3m!&XB__5Ir8yRU&v&EBH@-AfV{G>_4LcmU=Tp1|MY1fe(-*;a*{vBX;Hr zw}knZq1B;tgHm4RRZ3NI0AT2M*i8wzNQdl2H;zBWTCM^)qwKzc`oaJd;FWU+MHxAZkRBc@|#<;pk`fC{0 zqOl8q+!sPUD0aWYi}hxtJw%o|SQ2iJ^!}Tuy5X?OCM5K2A6m<5*UjomFlJ_o_;Gb| zt(r2)POl52djMBsKZ+T+WOg6sZw##mgnw-w_|H!&$ ze!Za2|EBc>VE?1(|NBOhb+Iutas1!%&c80SBsDAR3^fd2*>|5$!(j<*Hodip$9P?J z!xo8+Mw#|PmdPfkQ+BN^m#!I-=)K}gL@t-i>T~eOSttwfTD$;?&B7=~gfJ4}##$8O zA(?!6e$4da;GgdXyQG)m8RRGZPQ1UH=cmMD#gCplk9e*;a*n#5pNHQ5dgJhOkzUyE z0bH^9W3W9hj)i(~p7i+-c-!eV|7a^PhX%0vdh){&lyMP<2syG<8nj{~wBgnfK9QZf z|1x-xaH4p^RpjeVew(*f7gFv;ISGr##fpG?3IrH^5WznMgOkJLgk?oE$qXwh+00s# zrlp^vmYz$M9M;z@)GDn$2 zMek%6fY$wS(PK=S00X6->?Q)1)bosQE(eS%6EgBK#f?M`krq=>}uF zqCvd~IuoQv4dP)%Po_(H-htyJd9v==vuCAKX5zlmttF}vD=9wE58fIIeYIY-1}pfr zBbv36>9bWIr!jF;7m0*mAZfCpIBg})VaLlVr(1rUcz|e94EpN*-qO{rA||z51)my5 zYFH%}5*2^johLneH2361l7k^VFffb0k+*c^U8kI6uSHo8UH1!d81NIbR|YVEr*EeS zH3aX$S&K!0WbC-;M_|it6TxK;6u@o7(E0`EvvKSNoJ>elYh8=#8+loIy=C(sRd;zk zI$FY?Tgx?`L!G+g`#r?pU)@66fkjr>2IBk1oTtr!H*M)X%u5!8N$ZsBHHWxtW#wDP8M9 zS~Yf|PIvs!fS(*yz{pthfTDt$lB|NGbJ#|Y9bD~W7>=F^s`n-OG#+}uZd6tU?eWAa z2pW4y6YxtYPuo<Bm6Sncomi4LJ08~vzRVlzl@>mwqa6A}V`atdA`B@RJy!+viY z!OJm*^~U77#@4(h)VzV>Y%`i^3|9*jNcdZLGF~Y0xcBs)tftUB{Y6RrwmFrYl1mXG zPc2X+bVHjvThIxSF>LW0Hl%iP~$hcCvK&9--W+VLegS@CmGyvb5VAuWl|b&T2j)5O9_qpyxq}P*B+Pw-}o zzQP+vLM6{J{pgzHk@0>`tT78U+6a^<-KY!iEvZiAi;goWiH>D7tw?Hnd%PMegc5Y1 zk89ibTCMcpU{gzE{@E_hJ$|rKprTCsp+=`0;v*K~BOK%#4dfdR*F0 zOps20Wz@+Y(~B6Tj`rpJ!6ek@$Fc$)WD==#BfKmsG9bR}Z%!YP$Wi)t$wQ9@iYBv0+LZ$VvxRA{2kHjVK ztPS&0pumI;K)r6Z-E-)7N3i=jA^S&PPf* z4+VaUdh`GH2Ie2ok$KwPHVEp+4=lw0mj>ov&%KPV@Y zL*+Il7mda97A4I_RTuYpO|n_C>n984uya?RUopg_7NlHvIbK(7N7+u7FH<~EmtoU- zJ|O%YLz$(+s^dD?>;_TDlO*H*0Ni=wSd*KqjEu&MjLci@eArvx4`ZkaGHWVkOe5Js!CVW^Krovr&5Q(z8d{+YHP5E5S zfqzf{MXrp!aMuDQL~xEjlw304}5 zY3h01P0Uq@sblLE+B-Dc`2f;3O)qfMWQ^-aWF{EyArtS-hni<#|`P9;rvn5Bm zZmghhT1t+larz8djD#Ti=)`wTY2$kZ|4Eld*M)RP1B0GEtaRIHce=)!8k=Uc8OqNx z7Jl_=9x`%f1L)V_Mh=^~pn;wuvXGRKLXrTcNr1pEE4j*pVs2mN=??a*}F zB53Ic15u$JGv=Z4&*Zv}1|ZcAc__;(H?U}iE7rr~^%wPfsn#7j>M^y@2ojq1P0(s1 z55s+_?LF9d#kLeZjJ|<7)H`Z@b`(87dQ9Gv?>Zt+ltudzcNrzdNHho~f{3L^AjRvY z;}7EPgNoE?H5THIX;!gu#D`v6o`$5F>6yR~eMoS^KGh}U^7j|6vkvv{ifQWL>a87+ zAd2$`@~Dz4ucF7aRnfp6B8~jlI7iB5BpdyMxN$I;JX163s@3@tyo1g5|56NLA_j;S z+a`qccrcBrN1bW_&*kO;Rj5O$j{66)R2u$NsWCm9NZwgo7j3X%TsQ5?B63*N%Fk~> zXdq$rl;VD9R8!xgGM znc#?CwiZ3uhE$8KlgX7xxG_khS+9r{!05lI8GHah*tf7ff?$k1QLOT@8z+ZiX&cgH z32##**R6V4aduOEh3V$CsTkvtlzAkor7Do8UhMYK78f-u>YHK&3qEu#mtko)p=qD{ zlkb6|W7B)8LizAnCXMwlc}p2gLCe~{L|HSb?@=|cdt5padoGN7VhLst6&)7hZa&aI zd`zc*j>dFq66ph5fNNZtfpGvEc?S!l8`%h*5l6fkZM)HT*A_5*2bA4IHWMMV5^m;z zq$|odME^&P;ssM%sW+U9q0c#6z@f=FEellp?%00y`7HwaROcqCXp7U*GGFZL| z&xWUS!K@j1xn4s`8ya_j>%<1roq`5XF$SpZ3*IQty%KvfV6jkbC!Eq4S1nexWOd zz!NO?RE)3zEi3#+oeO>BW&>(d?9ryFxL3?v#9+CHxyJk}dG1KS|Emw#M|n zFkz|3fAc~XyQ+Hut^P17)M`A!IclqV#hAgjJ|rt=t;YXQE}~22^joO8%GCMP=BxV8 zq!kgAn7p`07Z&_V7i-PtA5&AmW!%~**^eIX9TRxkd104>g<+81fBA#YJ-cBm=t%wV{SQ?^&kL zA(PiV6(PSrPIjJTLwd|P-%&{^m0W&0-S;M3GNoiN~m4F4*J+fEB2kLGX$jz zbG6iCe?h&b^|U~tv_OLg2O`CUDsxk4v*XX%ix(ORx8C@V^h)&y*o8}bs~PXe>)P?%^RRolCd}KErV22zX-<@bXV|lqXD;)andqGQLG2Ow7ae_EoF;N=s2@ zQMof8#>y;ZV%L+}&(_hgo~IPaQwLH)mH8k{q8P9~Orxai8Y&cX<>L?T&CbGSz*pmM2I@_j(V0G zN<}Xf7)yZ}N0i?7MO7!R9ps20kYqlKqZY?FD&a||!&rl?DhDWPXVP&@Ykm@*8q9I9 zl-q}?sV-8(I$3nNKlR)XXGIQmrAAdi9h0p@uEVHt1Wg#G!0Rklqq&zf(4y{QtlB@L zZOk+>4jv5kY2Jum5d^n2)*N7vyPvbqu_b){Ej^JUnIb&Jpoz!<82BMWY+)En+B`cj z$=vtUVv!%h$k+^OYqp4vy6|$BYOYz$bw_VqFp|5*y-wpXMl;(!TLv#1rpH?V?7${B z&QlwKBaXy{0eDOGf7&Cg!-5_N@I1$^l~&|WOBw?0nuqUA^t_Y;j=k6Bh8t9(hx0+Y*eo2-b566CSbRW@4pYLv=G~+u* zt_K(7 zCQa_a9o0c6i`KwGpHzd(oVU4h;1ou{nh8;oL zFZ_L?te7Mi>K&xwc)2i2-UGEALS6xuLld|d0b1zf772^F7Ggdof=Z^Udgw4iv3!-g4BbIJR0FU>B3RlMkGp=$O+Q4 zu1>-<9pS%n^e4$`eWA`I*wvfNn37)atB60r|Cp5M zK%eB_?l4J&8-0DoQGoH*#Khb18P*>pW~mXw@&4u@9Ow?1CVBJGuDF>z|m{nD;f!MS1GJSQt5q@p4PvK)M-kVV5l75wREY4^x zkZ&>>2R>>B`fr2Th7W{_zS5uCqWZUQGP#aEt1pu87M&w5P0ZB1aoe}#gUggWi%y$? z?fzz_9~ZF5mpG)UcpW~3mU}LQVxguz(wZ$wxhYkl_{t7flN-ngnEjj2r>i)PL=gl2 z)XbCyxh(%$^h%Er;w{;suD9ELr(=2f0|S%rA-gh+8)}~>T^4LGa6ZSp=GQ9O^vDss zUT^juP`;!Wf!_f(0CVX?yFe?`nus8yBCs;M(AFFHzdzDH!iih9&#>XQaWC|H)c7A( zYJQIyl}yZROulL4f3%ZtmP^gi;@imgUkXa1jnce2^6*zmv5bXLnVf!6ZDnX+GbWG= z3UVcAljbIP=B9&pT|#jRA{()F{N?WQb;5Dvl7iX$58u)(o+r}WL_?ohC)@A6VjE6h zPlY*OZ`Y8$z_@1iz`^0;7%&FD=)-lf1P!T!DB6?Tn7)W~)e*y3hE2p1_4I5(Z6xt( zff^`>&Ee(YTrj6OlT(MJPZ*T2)|&t*!6H8R=mI?sXF&(QxSzNJ6z?=M4GIl9-W|+3MnA|*=kvtJHdc3RBX$aP zGpxATz8GNFnLe*CQZ3>!AUa{V<;M{1sH^|x?jUBtT$apL`boptBoo5Xk z=TClW?SG+Mjh;21K>SdM-BuOA6MM~XV0iTRuLJT9ewNT8?YW! zryO%P@%${AL&Q2uPjZR)qAZyM6tGIEs&&N%I1QASmaQRgm{6&+^1~o?oMaP1u&@)B z?tv0F?y9Nz^n1(+e^*j%JMH#h+5(USh+5G~zdGsI0p`CK(dY8eP>e^Obje|x0h_L^ zB*PW5OuwAd^=9&Yuk+!wLsFSJJUzw>syFFN!Ms$QcuOdt+zSo=c)YgC&ESDWCH+cJ zC2AzK8I7Ku=SF^I`w^Y8<(I^3cx>^4gJ_r6nLLA0&p|vAt+0!+FCj;|5OrhW5Bi;m z(IK9!dm)5@!5c$tN=%OnvRoQT&Zg-bgA6E`!y-=-E`n}~xL5OTw7{UGTzC-CC_rCs zm0^kBFBuyQdqS7xPu5fvuJVs3Cl^!JDs0f}Bd%6-_V-q9deB zF1a?!EFSi>%ujR7e=m!eIKx#@jU6m6oElu9R)Bh`Ed0*N&&7OUfs`4Z2~vNH{4=EI z8h2rGX_U%~(3knwEdSBb!7EO&OUzQ-^l;>Gt_$l!@KY^ZJ9odU&G1GWVIgQK^u5mU zs)#u*SOjf;OijWl3*S#}$V@7%ZLI6`gf51o9;!+zo^p6WdBdWecpV#KKn3nX)PKK6 zVD^fzD#ZTe_kaJm|J<%X#GjggZx_M*cTnelcHJtOeD8Izw($Hvf9`(`4OBJcu~m?H zV$$*q%+Z%12!s)hfSG=28!b1wtSwpc0PXVW`NmaUf$&+ zYN0e95*?a6w0%7TJ58xi(0@)Tkb zuZLW!T5Ohcad%CUHB)!g1KLm`qYLAIE;ku~Y;;&q7se0+>d5W*C}Ug5aAi-KF3C7I z*A*o?erFr6my;RBDNs^YmC1Ajob=}&+@DFDHM>Tv)_MxTC^g_-$iYFhT3QBlW+ku0 z;|jRR*tjM5qj-bR%%-8*-jyo!F^c*OjdGJOh>G5u+r6r~%D5TH?^c|c4f!V2=~-W{ zV?do}c*7FOp7f$v)YXfGrHTYM;V|Zqo_ro8|4#f7wI|WVu((_@4C{s`b1}s+nu@_i z3*I>JCyj9R^)eAvf?aXcGkEO+#>tBs1^y%h!00n(%2c;Jph@GSTseT-{hs-o9&z@q z2_k`}Y}zz}U&e|Ov5b|c0#GdDqDQTJ5ttNOp-ep(1~sG{X%rQna4;MgUQsKl??TSH zF;hYk@9AyLK1V-NC_9i3o2RawGV8p{Fs`B<)kG=V4+Xkh`c2-Jwc@gssz;kp+78H2 zmLHs&ZWL~#qO|O?qI|Dg1a&KKg?6KA6&uurtb>0lH;=3MV9(7*v6;X$JO6ol6vtj5 zhq^OSkT_K+_?idnF;s6n#JG}-s-65JqGGqTi7I!b--r={n%6gsk!xZi!F3g(q8sxt z=4tSqe$gg8I91I-l>?d`U52>HJhX*9i{+hjpq&E6@l%&)j zyr{nWnd>w;%x+@5Dov#S#Z<#FQ;NWt!?AKljZ9nk$Jj>*0q_;!7kPa%N(UU^Bbe_R ziaW$TIY=`)Vg$&u{Uk%^ui>);FfcX{-ayaBh~h7Kd9&69BNj0U2SziAxHEWZf;SX$ zL?!f8-93Gtn<#A59{QJKfZEBpeYjOpin88HdoZZbwA>{RKEgUhf6w;J+`zx%Z{4oA>ES zX`MI)2ijG&^tHU6LF(~!4RsYx_?YOwLb}(Jp6LMj;s{8jc{wJ#k*xOOUiINe#J*}Mq~Md z9zVx%`tF{7!@fbBzD3c0OZVKezXWi8o6aZ%9)dO*?&MpH-)K6t6`({|YufEjj46(+odvGB*xZihv;r1_Lgq$&Qqu_L{CKhYIoh&q%!y8k@lQ;g3b0vI&ti&WQ_| z3s&OIPP1qJLvNsfH#2TD^|*LL{s-(Q^*-H8G$(l4!evB|Ft>`B0J*==c|eRLJevPcX+cqjSjKA9t-{cblV(e$!3krjH#v^ z7SgGtO7FKo73TE@RWC<+g996IZAU#DjE7F zkkw8PZ&S|=YB;Pt4$1Nm>vnEaHF`2@rcJh$nr(}G)~CwqO47RqQCcZJF7le(35*wME&|iLG}_tw z18O3lNU`1Q?{+bGW|R2MgVa%V)Y)_a3Pyuz5VC=fs#S;x@PPx4OUmESs+S4o@C(h~ zd{{?dBML;o8NveaiGPW3`}5G>9Z?TzH=o*DL!1v6zfz0fVanL)o)Ru*>?F#;YAF)b z0aEV7oins%yWYPdExu;gN?;>~H;Bh-R*pSvYML}Kad<}Q(=7;%Aq!^ z4ACIRdzw(BuVqCEE2Cv8++4r0!r6(Uj621XY{CrC8WQ*PZB*lIwyZZ#KYLm^{otqJ zWLl0N{39Wq(3W+iqECG+wFp^*UP-l#dYiuMmn=5n_hR zMN#6My;FhKG4tT+z1V14oDdghszKg@TNlC6eBesy^Y|eW0WQxRW6>wY>)e~WCJ;|C?h4?) z>AhMA+Nbxl+gmD52piT{9gDn;quCv^+`i%b_X~)?26jHzltUcKdLm3ph)aYgR;3(G z{%fx@jHjm+e+9cD*Ts`(YyIhyT1vROk{}kYAiRY9pv%z2PVJz*&NkqlNF zaC>>N1+d}kvB67SBIgKT4AF_+v-%_opEptm3cPU&<^BEGVuyNS`+6MUO!gDe=F3q) z7yX8nfk|94;e!n($`!b)r?&mm`;p26$rh<;%kNqXX?H0eV6t5$?a2In?UJ6r49jo8 zWJ|G*6*t|!z`3-4Qgr3nyUC7Ck;kQA{Pbp!SFz{Pa-+f76`G*g8^c4btd;Os(!~WVzw=b_7Kp(pGm*l9v zr-xy3z$%JvFSpkd!>zr8C`zqX%952(cpy%B_}U~zll)7lo#vOFw*POSu(5rab02t4 z=qgcl292ST4x;n@Qu1daKK@X}D{dc}J-8>rldPMO`1xvI*V9p0v^W;Dip@$rG}5j} zpJ)KjeUni_P3xWks7$mJ?kJuFWaDkcnkdOMq2w#2<&BUvfRL_!*}d;Gbot0i`-|c1 z4ffCiRO|-z?4GQ0twp0?S%0Ub@dJZ)8;3W>cdBHF?z!3{NA8c_+^$;VGfR^%AnEU} z&U^Gd{4>vIXwR0tO-0;_Qwbv9txVjmebYzMIfe*HiAT3Df_mdu;USBGC zQ>MOlRpyBR0YyQ9s!3%a`l6B7oxG`uX+|=4EkC+SXsM1@ z&znz21~`ICu@d^_UZ&GD&-CAqWW223r__H2TmOcG9#al@TdM$AS+uPNORg=N)~bVT zS$Yx=!=4w7FN$_R*d>!Q8&!{WKhqWwoOI0N_J3T zTcAjr+?tzc*0vTlmbM6DO$8K$xRa$p4a+9|%sHuRF%fB8B>Bx|^MKeZO=F=xt(3Jd8ERr+Qt0 z1~*b=VGETm%7ocxDKB&L9E)* zm{`e%X~7??8_`_Wt-#|p>Ur)|i?z5|=wvK^EdXW?DX>we_FSwhwX#)91&hHIv&B1q zU~>SQ;q{}z(|gd;@~j+_SWXfKtwUT&InlyGx40hGUogjYVhHWim@#4ju zeck;19riQ9o*M-_x>#`e2_FgvGQk*!zcgT$pzKJ)byc^c#i?^I8+UlI6>aSr^Mr65 z+024UnSL1?cY@rAQy)A~kf@++DQ{pcLpuhw@X;Sf5tsSQ_LF|zfW>bCjkU0_xTh>o z>r!634ZVVt>Fcp4GC1SMihJzw>}}9HO9kaR?(+}bM`Wckk6|8o1@yYzTw;#4=-;k< z>L2 zd-K!|7VN0omCIdeu|{YVmC>3o!++%PDG=%Mk0qk4=eY+iO4E5RUL+{qH0|`A2PG?W zcVwPsctL>d4f4~QObCe^P-E)h4`=L^zf2#(Uw~ajE`;|bS zvnW`SO9449F$R6gJ{1_W2b212jgpU@uv0Y1)Rqy_cAbZal4u-t`+f(&GgY z^ohhFqMD^01)Sa*Ooenp`$@!Z9L+129(JdSY2*o%l}Qb6(7r}-cf05dp}NU0Vtq4C z5wNKF0DNv~c1YV}36XG|5_Q(8xw%sxlADwzFe||$K9=se!a;kW)fGvrBLJQDIc)p83R@U{drfWdbUuPshX~2u;N!mAafj+3cJ<*T5&2ypZ~M z1poFSn{J~fQNqO1t~U5F@Me+WC@jpYPQ2*J|(C~oqdTJF>JvBb9b||XM{|S7%q0g z&ihV@fr{gk=q+Pj=TCkrs`ZVJMvRlYu-;Dz4wUFw9^XDdw?Oz*b-7+@xy5-?aNZ!ydeP zFl!|mq}VlzH>}hNM)X`4ln(~eLt)=HY zjfYWZe_%zyN30@Y>XcN`A8eI!P4zsm4{TNNi)=&o$R#%@2h+6#?)>(V~KEz zvTLCrS*#qYx|p%Y8uje4LfK9LtqW`NYB&95Dqcanwtr`EI42YSo8$O|h!>yo68Y{w zJwjEwYgbw1o+RNF_56V4%h2t|+ZpEj9$ob8g}SIkoyWIL|2YEuisT#0r*ukJ*gd(Z z=K%LRVf49UqMvWy@jU_bp04XhX6;%Q=)om?t@@Uj&d!^;PfQzb#!VDPZ)OV6gaj0Q z$hTQ9B{F2fjUxxk&07hK@hi)3Vj0<(6WMreWmhPb7dV}^>p6rQ*;#m5nVdyKT*U8@SntM9(`@}7G3E$GIOxPotABKYR zQWy`S7+_S?s}}1=vDd0*nkOkbheB`eiprbj>UD~b7p)ABb?KPy*``GZF~Y-(gW@Jq zVkf=0OP522Ks$({B0SOpBI;r2#!=iOR6eUK5gQi9oHc0f4kV*p6zQxAH84#Im?c6g zld9@vo5wv@391PR9JrAjd@gj!Zb+ zWhed3Uf8dh%kW&&R5^RIUayt$96c)T;Tc*A?&+a6%UMzRVAYoA?cK71hZR@@F|wJ+ zkM^$}?ah`_9MStH=2O41rsiP6BlOHDpf| z4OT}!+`*j5wJJ+3v|*EoiS2tA>{Bv2YGi*AcFw+1F?DK_o6Z=F*rvXaPbKnH_F~oY z+YWH9M&P!Iz(e9Srrm8ka{8{=P6Zl>9%gJ-X1A0h8G-bI6y(`P_^z`2&kc#8Ri2BG z-!gOMw~{INf0vpqzmq8F1U;Nhl4bY=CO zJoi9||5MbE>xp@!Z9kF`VR+{g;jhFq1c(3gL73Zh- zQ84gUUq@J48k^}gHQCYQ&i1$aH}4O5kwrluG{;){1R~ao0}-T@#@0#$SwLqn6=`*P z>y*69TFuAGS<~~(&3>=PXn}euTR`uL)0GOb&@JT-H>oN-&*}p}CwM_NfS}_P)c1H8 z9(}IpmI=&A#uXHxJP$uOWIlsn8Q}(eE8T1~CW3+}1IwUp!=ae1{`BzFwzjU0&FP$# zp6Gx~#fuHqv~lE>>8NGes35o+93_FpR%>nq$%bL-9Ex>qzq}cH z5x1=MBr;P)MUoU{;xn;mFC_#T0aL-;;>F$K#oSVHOWH^k?QA)^;J`Uz^XCc*c0R4K)EQCtNAi^qViDzNh`$$$BK({1T z$a_rI1rJ#92H%q)WFjUTnj=ob7^jwSqIM!~2=k7C+^3JaGlp&r2CWx)^|*}H=@a56 z)EZW594)pFUmGEw^d7Y6*HE99$rLz4bZ6X7>BvV#5DX z-6*@O91g!7IW9Oqe(?W)9khQPvnCB_@5IHVuN;s4j5KeFV82iU(q9DP=!k;2_yMs*fe!RHIvFqQRfq~gr%d-Xg2Any;a*>7$-0LFV5bnOSEW9 z)?I1awr$(CZQERFuC#62wr$(CeREg6RGpV|+Wif4wmy1{5%C2|n#YpA9mlN=+BZZE z#H$&YZps@Q_G>f>J43(zVGznlXtX8+BcmaX|DTZhKOj3Qw>)Uoy<4!}dc%0^w?Y_y z5Bn+WeiPS9eR9a3%6&87_@z&CrKmNLz=#ku0`^sUEtU>iHcm!bApVvR94>X{gcxC@ zY`}zDn30$q*%B%gOhRc)DvVBvyXH{C`4To_@$@YO=oi#Gh~mUeuhG-uZ_WJnUWBML zaKrnW9_*^RJKAQkv?S^q{R)D<1I@iK06sM9OIg+u!%h5THRYY-?lv#UG@6+1tr9&+rx`%dfY zZlq0vn6A=deru*QP+|jPC_(A*4Xh^GP{+3TtLKIUszfye*h}f{TpLZVoI-UVW;5PO zHa=aq<1iKyG^5R+MtSzmR0g_ZLDRZZdK8APX0lT8YFI!z?Vym`hJ2Nq2#f9U2D~mH zd}_B)%gp2i@HeoeE0+GTuUi9(ipLmEQYfE{363)O+3@2jQs-pzC2c-f6?Cu=v{_-a zbqx)js?o+el@zmOOCb4m=IrQUL3W07X6xi;?AOClSTm>81F#M%V)%9KMQs);)Y}-l zsjxEc>RQf}2d7p6h(>j<^AN#lT$n&(`k}y5&Q|q-S?^S`g~r|`yfUX;Zh6BTB7k#M zN0X}2UzttpZe1J@NE-t>G&=tHBQ8%Ktq~9Idu?_VNj}rj{LIL6t*8#wNsBW_&Tb%F zjk~V23Mxq$;zNYdtF6l@kz_S<{dcqP?a7w3JR~LU(uy)m`Qg{C%kT&GDV}qP7tvr% zDh6Yl7>F6eLBKLL)X9g;;La`sO|7y+Pv%OuRwzFaJEg18 z#g-{ev3^y6%y~b=wrY0_0B+!~?6xP|DtB6+vO_l@p8~x-5U*~Z(eyUTA5B|x#;rq)uXdl|R?mY);x9#U@08#FT7nn! zz`K=I;6oP&5B#$*mgLO8C2!>>+Y}=0mIMp9zC-2dWhrFFzOl9u%6lrp@}&AYD8JDL zu$_>=*GTmo^)NC;7qrp4M*Q81yFxD4|L9?-W!UvbLCS^!5>1BZ!j~EMZDbBnYK#@f zXVoh!zC!)JwgTX(j1fS|*556y;Dnd12FKi*b!H5VqlOVP2WwNB9LP~JP3*OeN1Ril zZs`S0q_tV;Zitz3vK2OA$hN3jPO1khE-p|iakp5`tXRkq!jw0QtktjSJ2Ks zO3{yFs3_+v(jGa~&d@N@V$u}GW8K)-saYU;fJ;sPQajB+`*_Ne9T4D?v-o-puhow; zkG8~8Go#Cnp~aH2rd(nL_&hR4i4${-x(**`;}DtRp3_$NUReCaiBS{TEA3=igqq{q z=3&=}>t|-2vKB$v9}QPkI~c##^nF!Tip}1XOdF6iMLQHY4We*~M4>0Q)7#qWTaSk6 zJN!Rl438Bvj}@&QDNt#LjAo|l!=*YABbiXcPNR*uxiU*}uD0Eyt-i~D%qmD}mPHjb zDI{F9sCK}TDcCBHUCzY8l@zCxkD~@m>W#H=5AKb0;zFvpF3bckE^RmYbN-i*F<|RsOI3Qv&V-hAwKfdl~ES8W~GDV&+7hD{y z2D==H=q_wi$V`-UoRoA1-jm;9v>7O;3w)e~*L)31%$U?z#FU)0jHcS#sW`ke)3MI! z*rV`3dkyrv}s{Hh?1jLZnGFowo~)97?TZc4@zN* zsDybaU(32d{UV_1U@zW0y8IcSstrB^G2E#Ru$XRTQVD4Y{>sHw%j2~XEUvVYEsn(U zdKOX~&XMBe^SY+GtB*LPov>P)p&MKZaoZg^KhMXd)&kST~*Md!m(nif@VKp^C` zjOg(X-tf?7&UQz>mP+7Q50uSp&_#6-E2QME!`tUcQNTE$*|yswUGvO55T!QdLIL z!EuD1HO^RUt8@JVLukfkr?ng^DBvhFc=gh@#Rf-c$95S&cfaA1_pl%+lT8M}s*c&w z>9xxV?Pi3xp4#vE=e|bbB?Oz9KJYJEhLhB9NL|`u4d%o^`dnz)z}@{i|8djU#};zt z2%4a0$*B*&823m;>+BCLHBaG43cDv1B>J`fWr6o$OJ3Z^|o$4IIbX_>jA@MAHd~M!fL25cLZASfY!Th{Cks|R@<`%{N4I#%f1+&%hY z2V$=itnU7S;s)Z^h^d|PMLY0r)wK~muXE(r6J`&XTzmKhxG_tkGpf{IsZo_?97t}+ zH!YF(v5VC&!Z|QsXUv2ZN?*~G_(X|2cqvp6E!VLzT47{836;r3SC^r8K>jz2=pAM= z2=6xVCe%F$=bhcRxWk(9a-h_7WD<868idQV?!p;wZFQaa$Mv3dOURpdEt9gh=^H@1 zQ*kVUQsRQOBu9T}yM9eGF$UFm=N7Lna+yl8UAlBSQ*I zffbW&;We@MW|i7E`S@PTnUPNf>Pdf7abfOs=PS^2P@>X~IX3p48_W?j?Wqhq|1x z*!1~#k>8o8a(^N)ICQe(OuFREvQ|o$_JzuD_oBNr>HPMmBiK06tzGFImo@1H=HT>K zEH*0}4Sy!wxY1C4rlvKZE;EXhv5t)P;U5X&^Z}=Pcmk>q*ohy_qn0KBD~>~IVAna0 zjgTDgBOD(n`V6Qbf=f4NTvp^|odYp1fT|1b42y-+Q4S+U*&|IKlbh3cMMpV6a%Q+L z;BXK7bWc4tqDwO3qv-`G?@dsSI4fs?e=W+Hpc0`goC)dzfmBAQULzG^E~jLq@#ve$6k zg0ule`!9RBXj1*CUg_li=J-YaV&wM7lVN2G1)1pM&4sA!sZrFY9%#(NVGomg=kO`4 zX4^A)MiGvDt6VJ(w}s$3Ak>U!GK^u{PD4OmirvN$?@Un_`E2+VXPr)%4QJhq(;B-K zC{fLZLqiE^Q)Us}hG>hX*bE6Qo|Y?{^mA$IhKN8_zK$cEDbZZ&MaFJ5_9_PS1hri*j) ziqc4_1!9UEQD@aen5@{&13U~x5x?##GOLHqH=9(#Euxe;E)zqp8+21dJD z#+^OqPg=0O7YBqdbhL$xc6+W$!ga#GxJ+3MsY&quB0}m*oIzBYU=BqkzJDs(s4Jhf zhxGrz1e$ZFU$Zt4E1j`nfUX|K)ROjyX@ouMPaWf&fz!NryyS`6&Z_O!R>p?dH#Wc{ z9))=afzCGO$417k4&NP9C;G0awWcN9u2RVU#iD(O+IVAgedp44-8M0UGlJ*}HDL}= zv7WPp%9}HsyP8fI?iI16NYl9K=NW#>nb+6}M#a_Pc4OgF+;#o@A6-oU(U9nUH((3D zteWEAP7AjG2Mzh3D+)0aTa*7{c1zgUTmQFoOj4b2LsG&1w#7_k%}O@30HLr8Vg>;O z&kqm>hX9sR%4j6db>Qp@q8O9TOw$*Lsdp)`;<@JFMa^w?)NXyk{vp5XNFWGiCX-?7 z`AFUQxSRTV>FN0fwMX=Y9$;SyRlBVwJo&iAr7hKwjEnRUKT!PF@sCi$#Z4oQis8_n zCFF$xV}M1vtj0s6*y!~S6DA~P1Yn?U_w~xT?=VwT`XewQn-gGN{81s!Mv7E-?`z?i zazYEtOv<%lQ~YnWV@I|TnaoI%#Dv80J;8-WITZ(81s07;6iJ0h&>4K zlr>G-CKf3Q8%T7G5zQ8%K*0dXio+*Ifno}X#(~*Rp1(1f2*{bH=#Z!Wq?&P`8%>8a zPsT4J=_m&+HOdXgu^P$D*Hd)c6_v_Aly-L0YJ)45hV6 zmvC9xNQf3DWdnl;L$Bsw{jnGPE5~91gpEsdwit#L+0Rw3J^N@CFqD&vXJxlwboQkB zD0H|!xsnInY*Z6lxxZl=iPEyS)% zN*z$m*=jfgjN*t*BFpBSfq}w+4i1X4%c{Ne;;#9tbZBIKZ#XQ6hH?kXcU>LV=pK)x|Gbcsbuh^vn8p@2U`i( zw5u1)0UL0%4YUrs$Y9y90Lu6Tr|mcsO{5<#o?6dD-jadMVuDdwt_;YGDIs$uBXA0| zv0;~BXe`47PbepFdS!nj(;druJ8(|lA8)|bG{*AEd2y^$1)J3$K*=gD14@IT4}s!l zhD#5vkggq~Wb}7W5TBKtSe}5d!j8PSxBR$b8G=(F`F4=ATd-`uLN5M2}>os<{=;m7GiwGKFyBJ^G|Q#_oCyJ#auH`C-sj%3jDL>#uV^twS+( z;tA}y^|;_)vx#^ah!vAjw>?EeH||aWbXy_4+wyL9h9E$446EheVAexe>>?IJJbg`} zR`3hSgK;R(JQk49pgF$z;W-x9XsSvS;k&=LYjoTF8+l_q{)X?b$Xb8J4kaRoc#u8F zMi(_$1ManN=e`&u(Of_O4+74Y^*F}(@0`T^bq@SrIwb$=QujY|@;`3A|HaGCQr%F( zazXxPRYOD-*E$W3tPOMy2;#;{eHbj(F1TE053rJA_%gV z81xGhKu8fG7Vf0nZ^94hUsMzBy#Cqv0*QkzKpha!h9L@2MiCW`iD)G)HmYyO9cCvr zW}z^%19lJ+pl`_4675r+O&U*sd*$(&W34>;^!ApW>25Md-Pc%P+;^(SEJkO0Tno~u zjWX#_>pXD+F%c-r>-s9~8 zO1li){G>+nX%n2jR+~lIVhS^6T$|?fhHy&uI9CiXqu?`APk5i?mitVuGq3IBUu@b; zX@cJR#rZF|8j-V4Ogx{I{zyN1biyXV6BoV;Ow8li?w6+3p7G_=vG1-~gM?E3tC^a_ zSYte2{|Lz{HEzqccirU>?qFz{K&Va|tXDEsZE-Rc=o>N*R-zEOsWy=inc2kXURT$( z*FSn_2efPaBF&?*^Qx z{cUCH2St3tC3|b=(wYTcOPUA%qPmnoh@kN$MSY5YD9{BCB*~eM%!%nt?KwDCIOze2 z90%O9yDi+#qM0u&=b4XVa%(x;b1FSx zUOE7b&P{1s&ue4YFh9vt%^^%w?TnJS0Owo#hnNcriW8$A3^tC-djpFrl!%kT!3fUT z8e>&)`_J_|Ixzk9moRJkUMwb|c9I}_9Z`CnD4!jHSY0244DipMPx5?3e8MFjB)-Ht zmqUF1we*K6?MH9ylZ&jQ&sa&Cb;>7w%$8y8%4STqfvw1xW>K*wXRN$A-ae+@E1_9Z zX-9Pd`v{}+GTpU<1iLbn^A)-2Y?XmC+(;kC#bl>;q0PXws@M$;2T zU}q}>JCWDZi%-a9;e=bmf9Auz;ZZR)CU@VcMR^7^JrSU9V_=Q~#HJ`|6~wrd3bg9* z3nKg@k?e%6>}>($Zcj;gKF;6eQVJqSjFB^v{EHj*j!}{Sul3J2A*^(jJ~wKcitv}R zG*y0HSfEnfD9&2Vt~T|3b!E`i&MbChWAbI|7e?sj6=Z+iD9H)oeRn|wySDA4$u|pN zH~uxie|Q>Og0CTIkiCIQY$+SfvxHhGAe#bI$0HNb<}BQ3+^WH8DA0!5NW9+aeKw?; zsi$dZKX%dT4G3c=jdPOIF6A^Q>v!5-)?NK*CHtLbJf=BjZrpUUOa6X6Y~1{T-E;h7 zFle6+HP4hO0sZ_-s4HbM#KhQDc{Ne|#-vO=EfEV3t0qM01r zW;v#AXr*Vu$zZHsIfi^wZASy16CKK5_P#8sNfu)Ej&Pp8=e#HJ-G_cTq-t#dp>9POO1X=jXes8j%25t-{`Dl zaJ{CWm;gv|#uh4xK48x;0Qx{#&mptw7^TikuCtv^cO-LslW_76P;x1AH}sLpS=2W8 z5smT=`K#k$7!Rx1F!`_m)X5xUfVR^>uNQ)8Ekcz3s&12<0;W}JS2f$Bu%VmBres$( z>n8uVO>jrTM=iKJgWS5TQ+6Kxqhn^-Me-7jhiK9Bl!|U?d6ZIFn5KZT-UlOF{DZMG zuH3}@R-cg z-q)_eU1!xACPp-|>7pb9@cf^;E=G29Hd zYO8V$u4+MAUDq(2fBuIp^*=)V_|mG{6+a>STm2mJv$w1mX?O=3&{7HzWup(}@SC9|&==Ndqc9;Jnom~@i#amMbJzoV zl^<5Bg4ZCIIo`aVc{7zg`8s%l;fK&d6s8^~(3cpj4?{t)fWWAP9EBW(P&a~4A32Fy z@QgC(uw>`C(!BB7?7Gm`9@fd2S93Yu;4Wll#?{IGp)`}behxZ22W$Vs|u3Ac<%`CNgxoiMOars_H#WmgXU z5VKKzL*mgW)BRkRSuGgkX--0v4~j{>#3b0fHGUK~p)+5eGI+ti^lSLRA4Ey@aPm2{ z!EE?+>+49RLm~B7;QyV3MY$|D;rjiAhri|zp8toV@V^s3|LM3k{*PpkH*j?NAHI(S z9lLq?-+nDHbdY6^OgpFUJS$fDmiDtpL8Ja=LwRy2ng>HPck&ShRn3LuGq!up-|}x$ zyk4!Ie`>=geh4zC4XMmOCvQAFCmv@UU+)JG2!1ZshxQ0i8qx=f$(<93HRP?7d+CV* zi5H5t;u^}i6zZn4EEi2!TwR=hi#YoDy?)&vL3W_o%O}$U$gjvS!Ow}@TTBBq5n7&_ZI$+Hbyj z6z*z48Qh3E8YZEkao}nnpRr1u18$x8j$dExVO|1i0tx~WLo%C+41r3NwnidDl+KdG zEvL9IFD^{AA+k05kTq682Jq#rL@8Ag8Yzxy<2;r0+_`yAJ3<#dAB4R?{|5}!NneUKYvRQltn z8{2gH39CM7N4`lFNzw};Ljhf|G$6bf6tgIZ!m9VmFHWIm!>h}cI&-`k9j>#m#Rg^4b>Y_88;fIsLI-HrVt>|~(4{cYNl4f|#8m@CIlb$*e-s@g%3 zZOgqwh_u|Q+7VIOR{Q-{L#EoMMeB|*TFlx8!Nl4YeX73I`~4%qJCNb4!vnG>`B^2d zx6%ISmxD{2Eg@=}6Z};NXcr!%7!2;D*+X_S$HyG1n|>#b58SwJzR=zQSXIo2fWBUN zD0KaiZ5|M8bWQsv?i?%CyHC}J$10t@q_~bOE38fqFgFe~F&)zZD@?UL4ZAR%W2m&v zmhJ^0cJ;ecs;NOO_A9Kk%}#ZJky)yn!7YwgtW?|4I-MIho1Z)@*N5vms+YqZZLV-| zZ7CTYZNIMjuFuYxm#&?F4|i!epoW}2Prr=6yZZvPxci1QJwB_E!?sJSKf5Z*TuVa*q6G9PYT$=X5c>Ans6 z^S2))40ALo&B9IMF0riKiw^Gb>RK7An*f#_Yl96=@fNR-Sq5TU{f}M2#~*NJC`^ zL&KdU($>!G6+uN4Y8`D3%lpJ0jyzEpt`<3T*q9RO7C}}QCQyrXUoebBmkpp1wVx5M zjv}-`E@(p^5D6E_9KDe>1h8rdt3zdwMLJ+%5I{mg_|vC)_TaHGp~ZuPvkePemA7?a zaoJ_2&In?l!eaGCKH?*>hL4ILvdyHTx!13~yQhmz`I{qcIEgH00F8Wix zZz?C&yV32cVs!^8cQ6jyQ`0)Pb4^nX6H~ZE4TE!`O7qk*Uu_h_5-Ez3Lif_>w)kPi zUD0`jo3pbre`;Z)Q3HgsP`kNM*ExM*BiJh$&_S@PclM<6Za&tmYS$~Z^?`A%4cyTj-t7gE1;V^K~@4_~;+y{}F!Q%S%| zUk8ufhLCU$ctz7~a_}(DB7hxbV{ZNA=Kdt}I0o%0gtyAY{F)h*p;}pjQeZ%zvM@MC z%*$+AUDC9mwQk@{1btz5LDZp+JOv|4_>YUUs6?qMd#Ldz7;(x4-9?UwhTl2S=>ZkK zy9B;%szpV2r@q$_=V094&c=!9ZX?%ABXVY;TUHD#?=%%Y386|-bmpnC#ogQg&I4+E z^zICC*W$cE@~uXlgqW%+3jo#cPgQdSv1ki_Q9AhoumN)#2l_Tx-u~ZhLjepW;$gAF z*)nO@vsFl>V=#nj|C1!v1$I^W{K{_FFKNWpR-H2_)}u|ytnW>&qhDl}i`-0x?ET=D zi7y{S!HoC8DUtUv*Sh-LP-@t==rTd+dwc8g9O?*EH;?7BcsB1(Ye@-f<#Tfjb4|sa z8iJHK_KDZV*CmGd_-}h?i$i`!LAVf*y=J@#c@B$XnAV>Ffw5*)fAne&NW0B2wG=E2rjmP12S)RsrlZ|m) zrwnOJ09}8>B$~yr<=h6mH4u0+$QKaW%B-|+*k_W3*8WGMSUsh4rL_fA_wu9a+ogV$ zrDQE@O|(yqLWNDuEelA-(YH!PXZIhwA~vBb;DRkwT!bC|e1kjeZ4WMG}RH{d-MhpK;-}etJ2?!7mqyYzM3xgHL z+1tTRC#1*)X;T3&gqfy3H^Xw6Z;+k!UA)^e(&9B?64Lcurq@kSz1|eoS2FLS@H18h zASLTt7H=aY6>a4Kw)E1va7~5yjN&<9d=A^wlECr$84jGm?10(=Ue9ks?n4S2Jx^R|HPntRT zN~8;$eQ1YbnM@I96f-9W*e($;xHbNaa3>Iq@SywYXV-Z86x{GOM~s|@(dv^n?{7aV zTZ^U4h>-U8wImiLop09$9R(d#1`o%f!;tm*GnAtzkZREwIlOBN>ql4TR&Jc?qV~VF z;SXuVOQ|8TD5QT)tSa2nN}3vdG{~UbfMf29-Nl{LQwKvr&IFYz(4o9`qww?@QY122*mdWvmic zH-}H{W8%70$!L#Icj|t^5)hf|YujX#HrE=Y*&nSA!m!7mH3g^2R#okbX0(O}Kbjt! zu)@|EU@&<>CVZkMFWG#$a-ngxu8v_{A-1d!+U&b#oElbd_WAUjtY?LRSF;2)0t9#S ztO3C#lnh9rP9fbQLRiTa!C{)0%&`MiSnvDd7BG8h za+!bg+KzTlFRNyp8q^~j#=(%u6FfUHMV1od?mqqWDtpRv7lw!0?8of;$#C}%<)j7_ z*faOfj%^Pot7NOHW%L9CCxcY4?W~{c3Hed$h}AMTQCmT*4i@a&I@+UHZG7^gUZUzD z4P64nZx>9v|BD(s*oVMEJ+RMkM?^wkwE7&ja)L~-QGw!sR}-6H%z*)sWX0|SyhVm{ zQ)zK_zC{O|>i9PpSc++XaQILUP9_GRxwtXCUU+dTwFI zh{6N5cbMrw%$y0@N;vs|ToVeN+fv$CUhb+ZBx55ZG?jTCv6gi7NnMeuGa^`UBc-5a zP!!{1=ttO>`f1-q9hBj(aedog=fORLZvu=1nfZo`fvRuAo{(>)woQ z$7B-uPP=e;L!6GBy?sVjr4O?gOCiW(yfvA2BlQ+1I%!<(l ztyChXx8|NUqS`bQ@{VpKtlQIZK+L@sg5&_6){7|z)4%z>DrNU=_B?%FaY9q9fM2#; z)YxnCItQ3i(zVr4-D{Fbi`?qCihek&)B?cq&k$D2FOxfHPs}LYpNHs%Ak$+j*QQQ{ z)n=bZQI*=Hf<7s7Ogph*$6JqEY)_J%ocJ;W@@p#iT_DT~=B{W+t#c7e{eT2;Z4iw6 zMCh0=ZP7()>>R-mA#rjciiTouY!eSZXXjM!xL~m-{0qK}45GGX?t+oxe4IgCQ&&qz zM?pz1rGTom&yN&`jtAI=40A9pZdRtYyAy^ABiN#{FZgR*F?u7{z#&>9XINi3b&M+b zXrclv)OcR*<`L1H^)Bvpm6TUNF)R+DQ~O#+3!Rl?B=wu^&JAnXk@^Adj>3zxUL?oi zjw8V{wr|n*O=f?D$t>Q5Z*0EbSQ)Q9#<|fke${hUiF9A^@J9tjysRUD@$NcfCG#WsP=E=T^@!`yB!l zIS{VzKO9aVnyMj_3&3qfRVyY*(#O9;2ASFH*eB-se>O5iv#|Rf#*G}#)Jq(Z!GmMa zjs7vo^XxHRFaa?Wci*(3gHTzu3Z7|R2i!~IydH*#Mnpatm8V_#Mq55HO`L&C?6Ea` zSxq`~cHis~d0S+Of=PnXIPhC)2QlQqd zHogiu^P2YWg!(tCOO06Dg=SBwczI`=Y?I1(J7jXsX4|X_6Y`fPt8H#N`EJ)58 zXoUOdyBYPkb=?xTfE2i61;iq*aw9gqR5v&=)Q=`pNkg zf9o<1(k)g%!2U7g;T~doezakk*U|EbiO$#!4ex))EgkKL4R;g{F0 zM|w`EFAW(ka%-6h0#7i7Pt^GV2$ap{~G)-f+k+pdOJ;m-%B=CbGwsX`D zhi@lu+M2RD4Qn?deIV}tiZcgk$GtQAkM|2>@h^0qlwMU;+zla|tJh)n zm>X@Cp6aO$h7LEu{q`7dvo5|~R!q3Bccmj&pmA+!3w zxn+Wh9v5PHzr>rzrR?XV;^PZa9#Jxb4qTcT&gNXaq1++mMQK~|ES`=>W=32ZUZIw^ z{Yp}6Xu~M_WH~FIVHkiXs&klsq*S zr}FaEIML0M)j&J;9_!M|GB$GL?xZ>es(n_`@uP{A8O>2M1J>l9eH{X(a_?N|Ba;|ljP}SAWttV%z_)SlpHLve7NobQ2D{4hof$=NVIHVVSC$djV!(l@ z0$ViB#HQZEO*o&6aNgtkUwy4V4iAb)>4d-kwb~Mm!h_Lez7cke3wi8<4^$>JH6mW6 zpFhsPf;;lWUjJm1I;_P7xna+#m3TcIhWs%Tbed#JZD)nkb0WiXE+e8;Rbie?SJKiG zK*lhCoGzQ=B4rDb!RV6aL%cu3sjSBFxv!qBq8}5K8gV|au_n~lOxNnXVtQI6pd}8) zZngK#6Eb(40iLzgwLW9;@!kmp4XT{=QDxgwrMM>f zsaRgf7gan2EqdX3HSxE_jn7w3vs(ij*b0n1I##S)VR))ru|<2uZW;bQ05R?WD##o| z;eWk>cuUM6cZ1I7=nb%W{`Bl>c}9Z<-R$ltf8#YJ2MAmJL2i3sdIoAQ^1{@`~! zdGYInLw4g#D(BK!1H(+>(O&~&@bc>^dxJ~T(9f%nUrq(CqsO_V2Lk0sfex@74Z$Q2 z(!_k@`CQqgOUM?N8}i{R?GTzM^*pgq{{F+4F4Vw3tLJ$#O$OetrTMfyl*IMA;L)ErEmjcJv&xP3Myfgs1~v~7HuqOn z2cT7l0E20T6(sB@$nqb>5CB;y7SFW~`}D7gwfEKJ0; zzZK+(T?exGFz6*xM4yV&FK}cT9Kf{i=On!Hj1OemC1yt=?bnb8H5)KyM=S1o8|;V@ z_KS3WG~&k&8hb^8j>`3$Jb5A2bdqj#OdIU{f(>W{n{NpS1~JDk=w%2s)N5*8{Pr)!0!4lwM#{vd||)lzKCq-?RnbncIvOX9>cc#vNUi4BCWB63@D;TTC2Eb-!NMb9e# zEa{!DU|PuvI)vEMfp%CInz$rc-vV>6=Obu|d4IX!(ooL?wKNY$ChvAld|}Na`iE#@SOB!xw^RLa@<|?CKnjc@gj&Dx1{4t z_IFCXu!8wCo-@pMAb>9*NEGD~R!}&q-`ww8Xra4g9ZsHK)RMW12_V=)+1RDD7~$Pj znt4_XOp2guqwkatgbfi}8_M5N0GYhv)D88=TzO74)lg7bMC4A`68bM@ym~~Y@vZ1( z;GRzGWEU8tYkY_?xAd~Ndv{`=P9ZhXmhnMkYhB0R^q6&XZEnBy}_vvDSP;>kfFUd_UP6F+*#BT z`WU|8_sr7$L3jiLva|U`Bx$Nlg(fK!MUgO$S(q}_^W=_4b9U4}(wqoM?H^(;(koA7(2KAVMit|^ah=qD<0-MMa!W>B5hii zkzNNTwBxsMG9MXZCeIwmJmPNEuXR<-8x9rC(`iS;;?W1Mc&P4LK14wGHZXM>yOi8C;ui zjs*)yL|>7jm06xGBUpQuj&hE~Ufm^6IO#`%hAwO=U6IUqEkbO&^;=iY7bme?^|ul} zEC0o7<#RB1Tr6+9-Q#G&DW|AoCuiu>KbhEoHAxM&m*r4PMBNEqoo`*l;*3}A+Lyw5 zNQ7(3lXD#6mKM?AB*&-fZPGYquN9Wmj@sxm4IUlWDAK z8NhCf;vTuG2e}C#xeiEnVsYN$sz-T==e+cRtOBL%0@)LN1Gw%5+Jo@|d)>v{(tkr_ z4~y-2cw=u5knP^QGJE^a^tQZWKkh#uYj^uWyb^L`r7!^L4H3MeQTMOd6Lcs4dY$*^CUJ@qQK%q_IS-BZZg&8HNx<>l!bo#qpTuwucV z>P$5Ef|qpZV~OZZ=cd!JZNhfh4ltIR`VrRS3qboLGazRgqC=y$#nRm4 zt04>elLsgmGABkd&kr=3Q$*vDoNx5m%nQG-S~N!YeU z9vA{KOl%eZhlCa>v5%-g*&I=}FUp{^Dc#;Fv>2JS&s--(joK0}>d;X=B0`Tp`o zCA47-Fn~Gh-_)!;=vx=W76}2@K}#nWlA-0bNmDoQWZWy5b5qd_Qog-+mvp$X#H8b7g4NPs&u#9=n) z$pir|a3l7ZY4IP3Szky7hVfU}0qg|anl%5%b9f%qkYB^{Y=PgYLM<9=t;DszQwLOZ zuy>zAoSQ4ws2zPQUrMZ72oewvBkB#(Js$i$9^yS7!aW|+eGdHnU!ay(FoGWnX_Op+ zsMpNcZ$!+Y70!NFdANWKc-Ffia%(4wP$(lRJdh1cAgwLQpjw`r>wY5xEq7&Wu$?Wi zjR)|JJ~uIg4<3ULz5Zvg{%5iNXR`ihv;O2*giweL-BiiSvN(9|c;Kk`b-HFp&1mjgRA2U&Co7g_W*mAM>i9J^V#Hb!T43Y)_# z_ngyAod~ds#6J-6IEsbB;wka^v5C+^MaZKGiWF1QfpdzS|58BvsmCBnBr$3gF@Yd`d}1UH;G{uD3ZX9E6Gh_n$8O`MTIY=$^&KvH2po)Es5~F01SlcE`#@kw%k<_ z%HWO5zzvJ`c|#q7)r~6!p2hbjK{m3U`>%4x1|7rYxD3fm#$`N1OlTBF$zW!f0WF%K zI4o2c*(BN1xxZF*;13$%b|4_GrN7vdxHm+QBcM-+L1`SrG1I~ML}anMf#S{It3C-$ z3nFy7?4(H27jzqOWG9`;--FCzcm)a|ZrGW5CMDWa0aeNd_Zz)h7?^)~NgS<%!EsW^ z=QR&4LYB8r_2k<1k3Nj7n)K}XgxvWRFFv6|t9Od)4h4%92bpL1k`C1jiJ^+|s0%okAAe%D!Yx@0bSOA$g@Phh4RnBNC?o(adNSNp)^6s>%a(bDS{&;8iv0A zv@w}e>p=vafLDvO-56rqiXOxyAdkRvWWeaTnKUtvwSgEyrP@9BbHvk*dQ!F~K=UhO zj^?S&tMJs82|JKew=xvUsa;TTx489Ud&XKX%F8Be*z1Slb}Z0lSfKfUg))+5T99Ie zKCzYw6YSjt0Eii9Nvhps!KOJ*%=S&OAe(R{g6(R;w$(s|Y_25m&Q2G?m*BNUZLN}u z?ik(2d7;OiFdeoJXYyk@G4EpF&KIh;2tkx1P7&$U&j%)+>GcFX&4s;p;445yHHkk+ z{+u+0AvM5Un%1U&6AHb{m+RSXPH9#d%~)Q^w_vu2*JTFZ5ehMR?Si%>FmEWI%CqCb z9TEG;1&DY?VD~n_)A5L{e;{)BrR*7>q0BF<>qKRq=1X6zu~7iFHeJ?zb7it7PMx0YU-w zv))#>&>7@ei9Q0RK*Q4z#?OyOdgMus8S0>-G1oQzE=C*G@1A#ssv_NPHQPF%cN{KH#u|3lkNptoj!d?7|Kla=`d86gpLE<#3R%i4>f(u&PBb66QNdGz9|HJ5&UE8F(kVt z8(J36IA@=?bI4TcvFy8&Cuw-&ZcuyTubpH(iUAz-?p{2g zI#{$BS8}*w(`*SIw}#ASk4uZLv3JQCUXK!flc*WHVW`45wGGaD*X`2sN#0XeNDg=_ z8$L>)Co3b#Ea6deZo#vI@tn@=78$NMe3(QT>9*tlMq-JBKWG#&+^^Pa-%VX2Xq)K- zarr|iGhz>c!6JdwXP6Mp3&`LDaZXZFNDqH&YEC64Ea+a!Z*11GJr&vTbA_jYWV}|6 z;T$D`V{8_r)TR<~-WB1$L~?@+|C}<;YSD z3H**l{#Im^$c_0_9jfNV4*t*?N~jJZdGe--Z|t(Vw%ogpVbSkEv>4&;6?no+xXGSk zx(HN!(%=b#8g<#@-xPg%;CqVjYcL={$vE2N6aa4r2C-oJ|5DDYrs6>y%(z`PfvNER zS_ZG1buz%0$+JEq*tND}R^Y4@fwd4pA_mk0l(nV?GrF+nQeL1%u36$;aEO&k=~O7dFsaWHwzOA^xlU4)h8a6P@SCxys)7VDaogP8IgqjLI;a+bPd@t z#Qi$Qqixbz8=Q$2l8vlBP)8=T`gM^iEtP{g>nU@}XK~>=* z%tKo`mO}Q^?ht6rd8qxjO{MaIOr8e<-@v$W3o&A+QqT`RbZ98 z6Qyyqy2s&()AO6(7t-X7pTOP5P3tFnPYFNx_4tjDhuw$G@7FJvMXz}iyzo|GUo*#l zOao}XMaO-BYdUE#$?&nR2FG6m87wE zunea+W5eO|L^X&y2h(!ZBx2E3PK={>k;$5&6?h&8`D|Mtu+hd=QD~s$kSr_ms4ha7 zbL39V)`Y;KAs>y}HJ)!qbf8gzR86cv@`+;RI{XZ6qZ)6{&-jDoW3HnKSjoJK#21I{ zb6FOwC79^*fp3?}X7g-kOC}~6{_viLeNE(4=7Y7C!Zk(jg#e8NIb!X9hz~R}y9~ll z7AXVvuLos`2~~wiVvT#v=a(AO7*pg;s&B-dj*?m33~9?B0zvdp4ZWGZAFa|EqqJ89)mk;nw- zBUvUC(6wO~)9k+#>U4?%Gq_k>3)4c>6~e<|lTTs?^!c*9Ac#mf=KaJ zk8NhrPKW0lu~x1g3-cNg)hcHQ#4~3_%nl2##AH&>7-RlEclsEB7e;~f5z)<$MS>FP z=i?ldo~)kU;I$3zZstGw>t}aaD6iqv&_(g|H`@XXn==P1R+?Um%=Vatw-$$BC=Ql)D4c2KSdR8P^O%m6TI-k*R zte=Roz$E$#;}&PQF^!4f*`!*d2xl%1I$~+Pi4gZaQLPF+7~-U;ErC5Y(9r0X^Bz)@ zMl+io$C(|+ESd;uzM#;S)b*?H+v?|UOiDduFk{MkyQ_d-)#bNcbr%-4b0{U6EOYLG zg~`10z$VePS1NarGO^i8VpK*%_$Ii^mlX+i! zFQ%~i>I-rx?B?na$~`{vyF1FjP72U>D$F*p_$75(sa=ruh{o9wNz^4%=t-@6} zgU|j#)vCzuyP);H{vVa*upu92y^>Svl}3CAweuj|;e~Y>$1|1tUg#uM;d}wBns0(A z&0|pVyf8tSmBOM329m<9~Ieo@}qMSvdwYN?_g}8DmSeW)nF< zW_w=Jss@4GBco;`1_9F}70P9=gcfww-3)t-Gi!}9lEM(V*8twgIHQ>Bzly=G@!o)# z3(+iNdae|cs>AAL*`VMq6xE1ocB+eyYAj1a*{nO_WKX3eIDc89S3>K{R7#BxO4Rqr zzGK6}?u`UEe<`BZ?=zcZ(n0=|$FJf(^*nYUXG?b$ML5e`m2aS z7!D`&%)C57AzEPGvC)vG($6g$yl9nL<9t3G*?D6Yh4BELdWhqB(X?tjksuwE(YdWn zRjF?!d{_$=1)B_RD0XUc;R(Q=`D4%g!Yx@<5q=cfPt;;AO^gL<`ig>5%GSi|Gg0pm zTEklsAuIh4zZl+x!y2hT?Q{@QIphAa$(yV%S)Y`za=Bs{r5jw+9GzoDJ&R5@BKDki z_jlsNnP-v|CA0vx5g4lG4^;ArwRv9g$>zG@w(ugD4`G^pkYQ%-lYujg#?7-YokQ>{+z||3xBj1^m{$$yLcQ2h(qbXe`scY5iK{%8t%GODzI zxIRc36{9>m_}E6&4K*6HC>qg{GbNZfB^Wg&m^mdFHnsNcFh}k%N9xev+o1sr{ah4< z3Tfa!<`GpfkZWVaH969`!BlOoR%1KQkpz2KL_-<#ovA7?IQ-HXzmWILq2Nk3H3zj_ zmOccwBU}vePBvk%0%3AIzS2NU)c;GgW;Ia%{maocs&aut0Pk_kALVxK!G0uJ(6Y#o zcqUQEz~|)4tUL!7S$8x03*=%ua>}t|>>;y8I_bjh_F4Ono{YA^VZ2k%rPhUC8U!AK zxXLnCb1UJUjoALQb{ZF7+x(RT+L0|P)`D-={z$Khy{;lN9{WxeucKGY`-`pjNi9Q9M13)(%$3^w>G!1P1(Rz@Ci1K1U7R0jTm)=IeJ|qjoj~MGQNuS2!zU2K zCjrAJ62m70=8+I<({i|65Wb{zQmpwIO0Aq3tH2Nd;1bf0qbPL?5X3@F|41cDoW#!r zPiej(9^}5@DhjS`RXdn;JuVN5b(-8XPx&y-$E8L)A-fvFIF|eU>CUYpHar^3GX%a7 zouxSZkZ)XDwr_M>*=fmM+kas5KT4sNO=P1TujVzl{8uRiQT^AleK?%c0O&hBwZNBz zip?$iZ~lkj!2X{ItKwgXbKC$8->A}8E)?YrD!NW|%W|@A-eVvR!|N9&Wnn7Tr>wqR z;wI5IG_JCbfRlN$Ex0@2zv6ckk8*h9IB$e|TZl;;gla1&gGEYDCDqOE9Q()$v%Cq2 zSI}sp6iDwufuh)mtUDMe5=hf_DkK>J>eOK{Pxyl3J4*AwkfV5$DZoTFv&x@aN%S^C zP_56gr>$iF(+?Q@DQ3N*ilZ@$>Gyq3xf-cn%U zNra|D_9ts!$<8hFkE`fZZuNd}^1PR$m;7yB0BdFn8PW-v%>7z^lo>G)))=50He~IS zld-K_cSj`)2{ic*AD|}x^~q&UVz9QGL1=qq^0i;dp5p$PukC{yz*_H5nY7vCk4l~= z`4x=A`|ISg?{dO>kzYS-4FGt_=)7N`j*m}Hj8_Q7u}4CgFBa|Kih-%bQk*O96}N{= zvYuxVs|ZNfVVtwBHO}F}PqDfArOl7JV0E))XAhZG%@{md-|yJIAMj-v)TCe=NIH(} zKbO*Ls)Jm1E$b;}8{$!~e))GlNU5IdF?9j$V;+j8PEoC%Gp)F?zk8XFVRoX=dRbem zAUmeE?#3y=9g@oye;et{L_n++W^$IPKdNr@QuYj~O{Epf!%EXQwE?lUe!NMk6_0G8 zVcT>$<}unGTd4Z1Yq382F}7j!GyCUcqjA2EEKpQd;Zb)X@3ZR-iZbcHDf%*k~d26-Op3F2Pv%mhcQ_#rhuz7 zvTl~>drq^Tf#wBv9?u>0jtNan&>Xs$hnTTx{>KadnP2$y=X*~WM)Ay;pimIXYdO~_ z_?{+ufiz5J8Cy9|5OKDy#3=o~?g^0K6HmQ$iql~cCA5m8HOOxy`1<8BcM{vP%BP>4kP5L?5;JrFWN! zHR?n}Gh-+KJIkpt7M^xK90DaEzzFLrB2A{TG+cNnA~iN*6ArG&2`Ck>Tn#U#z5zGs z*Srb$qRmOi+11NBF#*7A$ zMmg!W&BRIp+bY4z&EA~8heMU0bTQJDKCZwUr+&Fc;;>&FF3UP8<6-Hj+HX3qs6w&N z-v>piJw#FOqdBM`$Q=dhH*uog$nGD<3ey@{G;ee8D%S!`?6<;+{dP4eMd0b9>)^UJ z!rp*=a^Mth3cXn16K6M^+yc8iRrLcFoPd3E_1CS7{QX|}F`4e?q0L7|Y!e3-&>s9= z{gMt`ynV0&&H!$FCl^-kjV%jy?o>w?+UmCGiv~xRW--0)Mf&uu3WB1F<{zlsi+p`< z@{b;0w!Ooe0)XFL!!sX;FRot46`i7*k}n)~_Fq=tAUEvYBJKN_*50OQ9q>IIYqQgz zF>9THN~eyI*(UhhtzM^0B~6)-$5zI*ml z2;A$EzI@@1yZMK$cva{b`QV$8Y554=_+&GD9!R+TH}~UK1*#zg1r@IXJ*NQ%&XKA8 z^k`RflWhazC#!8+IR04Qoo_51-g`_x_He#Obk1xqij3T~Jx)4? zKagzu!a{9!ck=hcZ;Oe&_F|AB9u~6)kcc`5-A260)2VK0RQ7#tF{znFS6FzdvY9+C+j^xl*i4k z{{8;nq0g!OW}uk6yKwYl0>KCs}1tpUH>+ubnX z#)v(E$dR+MPLwhAZyC=_k?w$0lGGU8f|gYg`wk z@9Wtc_2xfE&TbdWRazrQKJrSL1q2+x!rhDTRC8SNl$jc&H;2^w>pPC~)#MmqSH{F^ zEt4SCVJ4K2B#zH~`|-zdWE+B&7)dEAUc(*BHvd_RFtW^a@1Lxgk3%>!%2h6cNXk6R zky~3BV@1f9N^y_1<%I?oCGDX;CH2s;2rmIJsc`o%kRlazEYk=YjzTro*HaN7T(v4xO8@1xvo;=>0Iq4b zPe-d;Uh@pkkm^q1p@d;uJcE?5VeH-Hr1+mCD*qPMXTOf5%A4!PH`t@=2+iD9;_(vq ziX2-P>bALl6U$0iZV{Q)_C+DyuIR|k75{n1st1x9QE&;WY_5sDcRXq73kiMXD^FYS z@%mx<862oH)Z(8YDV5Q8S&15)p(D>P=TkJx0esFStL5fYpc`?MtnTh0rA*O7MRZqv z7p{lQEM5AzdAPI%N#6$)+vreij`J^vCUfa&e5IDCI=4dPuJuk*>7qhU)U@_4ksaut zfZ$tR)>(wHgRMCgCK|@p%$!ZO3&jbiA&^LQCdaUZY{(x+43*A_!BlA`l8=e)^BBAx zz~fKgKhfb|CK?922#i~ljZyp@+Y4~CUGcP72+`~l!O!Vu*7qcuY`VlUD3(6K3hU!$ zdL@l(y(F1@3m|gRB5~S^^IQ+XzmyZZZ7NKPlq(0h$mkO>9mUgzy0%<4$m0@d;vqbV zRvPEZ)H84Dj!*aE=U=L9BD+@sXMqZZS2s%z`ZFOOdTa{!E?d|>$5zM}Ih%}Xd|QqSnC-*!T;H8HPftZM||F)*ytaahH< zPA(SkH(XDo)~jt$i}x$mobUb#BSU`~%K8Be5@($dzF|wBmcw;v_u?y`F!Ce9q#{m< zcz*f!Wb0z^;%<;x7BjM*Gs#6J^MI4s(bJ#j1&xj4O}Gs@cd(FX^U@eql+Q`V%8K^y z=v7asAwTjsj*Z2ZWvStPt<pt|VU~n7eep?smP-se zA_M!FN;R>zCx64!qL(NQEcuP#$!`JD9 z3bCbeo~05!Jm~X0=eO`obqm)hLthDSEUbatd zSa5XZD>57Rm=Rd9Wbeqv$7mg?ZLqeCX_MbDJ}4Faje=L7?1gTlPf?7kX;+pIgWz+2 z)dep$xc}BZS;4S+sQ377s3g)bjPGz)iJC=rTOTT2CK;*1#HthRgeZIk5b_vS|9uui z>AXaF6mVq%Rm8*8tOFuvD{}Cab4fEWe-ZZ%V@{adi@D>hEx6ySS0)Ho;aZ@gMg;v5 zH6iWXX=AEp6QBOn9O4Zye#}3AbJ4|&s2(?vA5%VMzN}9qrgi|jw_L)|59p-Y;cX~S zctnT0pl#e;{{{Y`-g=VFS1}qx%yEE`%>8#1Dyn2SNDR6&gO}03iV3(WIKbvhBQY)D zK|5S(lGstC0|IEXt;FL>*l-3FHKMbh>+LIve;1f_J6SbqNU~} zM_xs}qfZoOv7;c>)zxw3SZ7ZUZI6Am2=V6p&ag<$HU>Q0iwSUiRZ9ml=E2d&m3z!9aE1$M^B8(S-IEiH)%PCUPld4z$ z=b=!b49xIzR%Il1OjaamfYxg;_}a>fWHcdBi_l{m$%rU;nj|urr^yjlt5aymt;Wf> zd&zca0wQ8SEwIRM=Xui($pr?~#JL?hW0fy}<3NGK_iu4Z=oC{iP?3E_DQ}Shp)MU* zAmRie#jq;*@AF}525e);7Ge_SUh}7+83{I3G{=nYfViTe=QRgX?#DJ`(ly5ON^Gt$ zG99ob8CWmi{_%=Lb+ocw{{A@d1lm1mL5R0oZ#!76UgC}Ph1%R zA{z5{0RtK7l?o}>Y(W%|-kC;8i{ocZH=S2qYMriaIOyZA%wIgMyf_%s?4B{Ca4WpIE_M+e%t;=U#cU+uQp=$j#KI!rzV9eyr^9pxiU zcyXHLXZ>?$X7VmH!kO%glHPL2fjf53p^a)^S(&mDFUPLOi=;H5UO#^o@ujS`}QV2oSX=J&Cn+q{s(%gLVJ~7u@Al;+0ooCcU)kjslc#|c%N)V($o=0S=iHvja8{i9wmHX>RU^wj&DIxZ z@>vEEHF&JMO!-TL3{myh}db~lr_V4wqgp@cGCuI7@$s{hwG(cQOPMjacmk}UL=&4HZSR2qe#Z!A}$c3zl zjf~c!ao-)dVnn*y!t0#xbIQtXR5M7CygX`OQ~kB3nvz#P1WN~-ru5Q*=?ToUpZc*ig>;H z(twp?sbztmr*x^OBTDy4N?aUZJ1e543Hh4T5HpIXVaaut#iKCRpWoWvhv=MfsS{b>9u>@jTo3b&6H z**8|$#gW@td-B<%w-)`4QE~QZ+n>NdhMbo)Z1mW443+!t9e4Rwefg3TG``4+-W7Xk>+}501K_0-kVHJ{06b&45!Ll}$RvFlVPQvn<7vB~2iI(&cecx71#Q$=f z*4>`=WNB!0(BDP6f^7E@@zYm?`Ok+~rk@P4pM;UWf)N?{pH9G^IE;USQt&T31p(P) z=3&ggsN^&m0PLss2mUe)F^X`j!QKnM z`Tc75xe<(ba4{GxI0&%!6x2TIBP1nKS_?_=3AxBJ+bg+@F~twPLKdKZ!fid%OjGi_ zHw9_xSvuptd|$q5A|8M!1xP`#hC>XA__Gom^#ti{^((XDl!P18;Pk36Nd5vvlYf)k zv15g+=+ml;^wFak*ui2&T#OiQQjzahRI!5E3k0uUuxuSVm%Vv+o3{#qjeG0akrp3) z5<%p*#_}pGy)OK;G`#&~fo$rYOMwo*i{>v9wgg20p?HW^40|8ZTtt1L^TFpRB>q`G zEU`F(ZlCum<+4-e;a8T)&v9k!mww4tQM(?~ZBb%9OUaR6;b^2i5cT*?xl2NaxWuay zJ3+dqYu}^7yAnL6rN)kEJ7)B}vO)3_REw^eZ+clH41ieXo}+vucT0tPmL2m{&60~Xy>oRw3DOUoQZ0N_I=VcZYrEaK_c zTFOR718@oZOtQ1II=ut9pA;J_KBtfkgH%uXCH%`&zhX_T{vpsk(K7#5eib_Iku@~p z2dmyI&Q9MX;{FS(>M5Z0$4|ZcpxwNdVe^YYzAFU2{({{+v`z1;w1`-2osZrjoOM@! zD4qo2xPgAT;lV&`jO*biZFZx`4S>3U;;Mj*oo(0Ad{IUQy5kXD}Ls#I_X+cq?f!CALlO+Wof~<0S z_TP_fU;6EOC2V57e<|Oz)MvA_=@(|`+K zcFN6QYs1i%bjQzv=`1lmLyA+_SwRy$;@YC(srgzddGZsIAq?Dz6M^0^p%_vuLtP>& z+&^SSOLd@&?~esc=1#NT$5(W333S4MUKPf!HY;P*ziMBY$$xY zlr5pv6ccgR!s848!QH#6+bRY%?TXd%vw66y{>pRl@*;(P4-(6=HG04nU#M@W8kM1T$UF7 z7Yy>KY+LSQ!=LEIfkGEind`;b zLkD}Jt8RNB(AK10qOJ7&=(}$N45%wj2$j3ccGe=F2l8mRr1#J0VgHhWjX2!Z*`$nh zn23ScxjsOWFxE?`zlJLuCYGV?kdky|7r4fQ+R>0tZUoQ!lPNgUFAS3{)23%Q5s=QL zmBqpovpwN!HcVtW5Km5~e^E8RC6D3UR$M?>tHf3>o&stuo4I5a^xKA!R)4W=@yCj)0yEKQzKOq8K$jZi)SmoE1 zj%&g&ynoK^iXh3ouqd5N)%zgG(SFTgB_! zid$SG^#^DU3%4s`o}wlVajO77NMcN$hHsJn(M`$EIZN#2VHZ7!sJWUdf{!^}A_7V3 ziCvKEndG_o*B#Vqel?of)#b2N6ZbA{<$$#%JPbO@V(~QELiExrHy7tz0R=&ELUbvXWaMouzSJ)vEWu`+ z0Qnz7=XJp%Q!&m2*5tGh$m&)NBf;9@S-j8e2P@>#O7|?t4KqtL9>RF%R|k^LEn&)| zun~QfI!>aRdIY};jpJv?#FAa3)!0~MhkMk_zlj6jnz7h@-{%Vy#zXF9%wlE2c6bhc zQ<}sU)dpGf(?Cxv5eCbfvw)N3WXj-iBNr*<0){xsKr$j5?3iq^0m{cJ80Gv-q7(>u zD#24$qBLIQI3|%NNpM0quaIbRFot#`NCH6}Ta+_+>a_rnWHUP_u9>o|g`D>ar2SZr%V$Dq z=#t$Fy4z;zaNiko$iiK5Lx7ht#|)@Ri*2wZ7vqgmvqbb6VcVspC%@Z|_LF2L_E>5S z3+IsBRa>_sb{-T6rdru79G$5gy1(dWs}0`2o*lY&`2Ejxbow|aIr8piPsr&CpsMGo11FX+5OmsJ#%mz#?2Gn4amr!HidyT+4o(-CG9<=u1(>Oou-( z3vXnd0*+h|>1{DYWO}UI)A)B5 zTT4$84-+d6PU~WU;9q1pUWz@bIl$@jW_*@JgcITZ4l>z~IFs!efO`uPjCe{q*~=9(o>E@9p#t6q>@eL9O}v+q2ezL)O7w` zP4=gSF+c`VT3*nZNy0l&dyIOeZ87x89*&jQ+^gknVPv!y zJBoW^tCg?4LS`i-16r&)vu&;e0h=HAkUsK zkNOjq#K>Y=B}pI2NCO_7lw-p+;{u)Fp)#(Wnp-QB`J*0_rh7wzXY{^s@E`5Uzx5Ng za@^v6ZZ`5+wTQRDb%u%ZPJL%C^MMs*vYkH1!;)d~p& zT-C{iHIGU!Kfls}Mp4^Lx%pbB;=G9~*NdxiJWT2oYOb%48>TU>nVC2iOSIJt=H}t| z>aMp5?uw*=$DtT^6cN{~1i$x<)A;bb%E_?jeB?ENzmx?-aGqV0N+q-k6~%)1zKq+j zE>sjDRG3qj99h_8S%+tdIgS8mkDTl(UP~zM<5;;?yg5R&t411yO3Q!4ndDkymCLh8-NvXlolOabqb;jNKT?v0Q8soXfvmuQ~<) zlDQ_`k-nh!i2T&kDczeD(TKuXYBKmmH8qm#)_#hE&0R1&8fPyKWO-XiV60rUk$2NelI zgB5XL`bW;ccf>Or8|1paS)2Y)LU**z@JiUaor5TM+GC(xvGiwnwQ_&)m}jWw5d2}r zw&?j|`dvJOUbs7j7faLU#-V-HKY&m+w6OS`%qn2sR#ZxXM!eZ0@UxjGWmH{aZ6B!i z+;^bS+F~ZgF&S({%(i`bbnMkj!sy!cWd&?IS;$-+C$O_=dH=KqC--(NT3>NM+6Xqj zJq_IO3$9R;ER;2mvnvK``HtxQK&`g_ONrU*jths`V5WTh5_}X^$V3KydrMqB?PO7W z3s!qkmDd#RwY%FWoXIWFctcMqHQctlqyMemIq-DM{qHwvx48{^71dt581}ykT2Hmv z%e3Mhr*W36`yTKcqeLyjrs;5h^w%lM4zZ6E$s-!~Sq`bNd(_Ib+}BtGD5pNeK1|#p?O`bE zps)#qp!l-Auevu~1*qMQ_B7WVWCOOntlGo@*2~gKHU%t7#4!@f1X)Ef5<&Y?i79dM z8b6Wi5t~H$VKr?NoeH>MSL(_r(^Q>O-HGmPOLnyFi45i~Hc=}HzFV^^K<-gcwZcPh zvG`ZHDLwYW3$w@jfEY|R6<_QlS;>+UB4fR*!||K31A<5f|0`Y3t+zwbUIHm@J^VK zQvz+@Qc~puH~dn516No>Z_OZ&hDB!*`DPL&3V~5FN)w{s2AJA9bDG7J0v+7|?=w4w zMWR2Fx)CmQ>O7x<+LI18m#v6ib>%?iGLhZlf=TK^^o9+ir;2WvW}U`N%*|!&LM(bc zi_jw9Wl;m9piYT$eGIwW3S~__azDlyIjc&mR+4RIzt0&+r9z*2Vx}RDPd(hv?AAax zaRkPnkG(HET;HQF-p z4*6I&NbW_Ha8FFUc46H5t8<3KZ(g<3tBqdfXNK-Z1o+9pK8l*!rS26_{YMzd z@4J%bWabrO$=lVw=TXs9w&o9#mV3(8cnmL1S>G$OOR?LY& z-;lP$3NU)fMm|}qFzfZ#<{HYBSIiU|W6d!Lx5T}b)pBnAxW~4-4qt=a*?rJ#XZovi z{4)S_hLKD4 z6C00AS?wwQ_K>V}MySW+ELSW44Vk`P31d!3qT-&AX{Mtqc{#O7@+C5VWYJxV8_g6! zTi$-ci9Xwdbge$%SF zpPTLi>^fs)TGsiY+3(+qaNbPob^{(#mObIZ8)xBGlH3jejs^ljhaI#VU1QOC8?S54 z&0A&P;P9#(Wa%sg4GXRkW|J9y874F~kw$(hNeGqNW|j~u>4=i;g>~yx#RI&xZ~kim z0p4_NEyx9T9FKRd^7HI0x|4k-g2=XakXqH2J0Rb$4%6^k?!GL3g+H89g5d6D&xQrG$SCHIv_7;XSjtCsF*ErHEidKxF zxhHCz@F+s;S}kQ_o;k93>Ldh3dH52|(r0!Qd3m*qUGL_a=FhYi;s36T3zr`%nD8Z9 zc^8u;&ZOC8>loYMyVkQLN4S(wBP~_7sAm4d?h|<8;`0;Bg^Sy^(fjlZHP-gBqdgd6LD=AQ89?mm~IOQGUg~xIdRUPsuvzp;x?;sup zLt2aDnBtV^u-Y(xZ;Us-p{>c!z?aJAj&3;KeU@u!k3t@4z*lXLfh7yysfBETB4sK& z84rZ*j=3<@VKtKZ${7Bxny>l=FX7u(rzi=9J?BitpK6kd({@+`!N^C-_8dEyUu6Tx z`5et}|%+Bm{n)UtXmIatIn(xi`L*E{;F^duFkH2_sxiU>aBnj|D|qU55|W)XZmPa%_!MnWqrAQJlzqn~eCA@6?G$t-KkSb0sPD0~ zmRP`?i8P=CJZ;eY6?^|q+rQ~@1G=U%cu!W+2+-ZgM;_G&`MhY+x}Pw-1VURBg~}`1 zZ>KfIs2hv>K^oh-?!26aeuvjS_vP5s8ip(WEOdC+$0BL%f;i-+FGM5#xSel*4E6a% z=RLQZnF#m8yjiB@e~^?Mf8M+|iG7FIKYAG&YjG;>*r*ab3Clz95PrWy{b0NQs^{be z9R47QA76%SJ;#|Cf9*y?86973L2fp9r;?2nb|KFF>Wti`+HxgU-Eu8N4=MeOJ8bAO ztMB{P6zm^lnhoVWnbx~bFuOl_ep@1An-d`CkC*=JLQwdDDfH$QJ!hD2bLPa_m273(T7OrJC*gdCJqgnNrE4O`7?JZ1(p3wr$p;|(C873a}?mL7rFnD zx@Hy;afUG(YD(sa4qExsu2b|r9$sxBegX$w#vPt!+U5pb6b_iK%{ny=2*=*?y1)Y# zlFm={WGXT>@CL2(o+`T?yUYuX0=Ei-vXN_J>cShE2PhGC=MD!$aqlcdDVldozo#bRn8j?_=WIGY^V0Tay;rA?*D{*c%ar=}1hm#VToB z$C|-H62wMQjLh+$COR9|3IPWly0wVKsm6*8ZBVS*|{@p>Gvyi$m zsL(_+sUS{M>3GY%VP$8)|C!A|ypboKbiI_1x5yybAG66p6kn`cWM&;ZGCGB>coI`X zO5>C4mRiq4aAm`vO+#kYui@hbh!;I-m}pG+{~xop44*nUfrW!2-=|r>^=Z}%{5N#) z|IF5^x;mR1+yB4FdizhZ9%t|apCDw0H%n>7M|9EdmxG%NlN<+i6K;^GwpBXwJ(OH? zY|TtYgM25rdcKdq^d8dZk5_Lz z!9!uw4UrpW6$gajEH`8ih{94s97V~n>2NbG(QMo(Rb){%Tu~Y8^?+77TbVHak67RQ zoFzcdv->I5cYccXr~eV_l?Xn?dQveP{zK=`^o$c1Q=Y@isTzJ#iQ@4zER|4s-Q}F`nJ~Z#YZ!z2RXMzArG|F#A(S>U!sHcPuEPun+w;oPZNiQiP>0q+aUr-*4&KFM_qy z77Nck{AK)ZF_0*-^ABE4XGE$~yU*S2A1%rMh!`sN2YA{S9Jr-UJf5aSxLK;@WD2T5BFTMj#v zL<5Pbiid-8vdeEY)t;Qj}!pS4^sOn?tg{r1^Q zPMAVutP6$+zzKi=aRl!|cE<>OlwWSCjCU^uWC z&UUd}A04Im+Olzh-sxd^p1quZ6B4AK!^Ut=Ghm z$sOd?O9^Ddo>T=NSi`-AYA5098@u&Q`0viijq*Ok8(Sq8&i8`IAJG>s_s~@jc@bRi z{rPlcSF@cukF4)8wYiS>s>nG#oi}Tis~f^RFT5U?u$oT^7oXuzxdH>7P3wzre!VxZ zjR70iUq7~X<6}1nAKL?jwOHUjMkR!uud#u`F3$gY4F7~&#Ijh#URzZrCI399+~prm zFq7HhPrl$#bQNQJw3&%dFqbCvvzrwtq{#r|j4u%=n(#*Kyc-^rTxGd#QwCr&i!i$F z)9F7}(KjmWwmSG6?6gvf$?n^Fh#hz1s`4BS%P=c?>w?IRaH^&j!%T_sJusZ=o z#2`4$(On;ZF`}-;fKZO`>Y%4#48>4q_+Fl2ljSxCncgByQtLvF$i!(qs?0>ztY|6| z>77Rhfd{sL3um5T&Y}nqDKIgdYsQQzvqweGjZ0d!SYg{7KqGCyJLn4+{;oU0R60vLbXOT zOmzlXOOG}krDv6G%P<_Y+H_Q~7V6090Okon?Ep^4dP&8;pY*)iRM1eDubQI}7m!qB zflQUgyTA9!Ew9uj8wyy)LC|Ir($R6HDi&Q{pU>yHk6AevE> zob?TL6+ZYFO4kpq%Vht-UT36T(ss)@;s3hLITw?&yUDl*{ywp-jXN#a)Zh4Gx zx+kiu(B}3ulIIuUk1=nvnyI{sU=uM|-~n`v#Vs9qzgzwbj6ie0VRl(nV?Y*YftdRI z>e|MJ+?t9&{j7$?BM_wd`3P}g#RX*zmDPi&^U|6{%L3)1upA+^puA@JfW>9?4S~AV z%c}+~D=R;^`L zuBompFRQ9t8>pjhJf$ld%PMjj7cUOfA;gw8)SMZp&ab8pYpVhc0fKTKf+i}_bTOZ& zT*+X}Y^V#AEl2PcEGt`CHlVU*Kz>{C=uov_&(eItR$S>Kk)07JUsGOHwy28w*Rm_C zD;vfl+;u|Wx&LB9c0*uw!|41D$2?iw{cdc{&&ki9mo^(g;f{#T1(nr-qQ>Qm0(B)0 zFvgNVkd*$^wBJC?`cS*{ljZ@QNlaa!Do|D*aL^p6KuAmtA*Z;pp$$7}M7pS%4b)j- zS*<%=D{pmqpthlsco-p?=I)@grm?P^o+c0kqN}R1>Lu>TJlCq4vWh~Q41%1RM%)o! z$|WT=Q_5BbCNvb#bQ%ansrmfOQ(9hCQy&ohiuyd~(sq+(nWCXfh_I1k($p)fmyFh> zCx|tvju5g5^-eKD-_&F4cF-KbEOiGMj4=2&2K9$Uc8v7?BF@4vbwBpjQ|Is{|RT5Lx{>6I=if{lC;d| zwD~#YLkPN))Q0zx`x|;W9)}3U_oOa8rDHE$dYZ}CHV#7G|2)L}9L9)QP3RC0FMY2xCXni`VBYWIn^o#?sG2w5?;Wp(vIHAk&<={d%r zD6MmfNvtwc=jZ0nJ9!dxE?r4rEnZVpLkgpUV44@Gt6?O?I6Y4yo#N_*{@nF%={wj( z8y!=Bg*jO5bIs8@CXf;m%?kq+m5s~8I`OCG&p*j-NGXaw81Z2}#Mf8VtU5JfZv9Ry z0bzYcM}kE&%0KBDrE}$zuI&|L<<*y$)dniUh9o-Y|CWBblrAl+uBZyks&1@rEUOCZ zDbbv z?eZiH8gne0I!|f+nU%G{dYwbK2&}Fpr4^`fMKAcE4Hxc%ME5~{^-9tJ6^^u#5wB|y z#GiN4BH<}rUe-{))K$8jJ20GLzMV+l*VfcExZ}Ciy&c)v+041emUmQ>;&?)~K*gMy z>=`Jf*?2+T9^Jr6UZ*Fa{X@0@%JWGvPYOWt7Os$$5=D_2whdzpJ{4iAL)4;yJ3Qj zK1{N)2d3EA8N1ln6%%djiM?#;1?+B1FH(ZNF^T*LTY5=)*_K|BUbUsyu)8k3ZcA@S zZ`zoJ!wH&@7hfE5L`h>ra!^iVWmQF>jwZm3#)P^2{n@Z%J=+@(xL9$|CmkZRuSc#hqWJOYhmzpQZP0=>zFQ zUHXeHeS|}F>0?{^MEca0{w{rH<6InW;|NNme@LI((ihT~D;-Ct~w8L%fXTTi`_De}68BH6NV#^A_ zE~~O;%erjXIFb=|k8Bcu+Oj2kY@CFXnSnmHWt+37;&fY%;%qbyCqLDeV{nlz$I5ZG z9FIe6xf2dUNDAuKlv+~nO#2W^r1Z1p1iXpyAS6*jD!O(_1u+?%PtZ&aDb-}6QpjectYiyf%NabaOiubsUy|P!!cLh}gH%{U9aY53@d{fWz;)EcWmWam zbRcJx>c*-nTOP#dS;BL>m=bxgOb`#1hv@P!Th3x?9JJ-(L?n3xQ}J|0;Tc$J;|9j# zNSVrJ5N_qsJdtcJ8zYa^<#Dz=UY=mfIh^DYpW~%?nT=;MA}Vp2ja9hZmM7w7Th5aw z**KUHJ(=psQ>0H3y1A}n%39$&I(%G3E>@tzmh%~Hr%Vi#S1vEBN~x`>BthW{i))-3 zB>aSfipnLG4YoX0P9uYwx4O2bngxoS4+{DlNNSGTVwzlF<5^f^V*@tY=w-FY41z0= zG}SqHu8k{kl`R+Y({t#Kva4;Z=N4;lEtj2V<6U?+LZ4BQ97DkfU;FjyM}yZ1n%Z&^ z1Ee_j#mp}^;!R}#XtH6Xr+(#AZCr=v+wyc$T6i{%FVA3X^>05&MNK2c6PYU-YlwH4 zkJzgS>q(c1UM2D@gzEMU1C?xbQiK6=*sV>#QhBaVgxN(k)tS5&SW#A2 z;p*gmRHxr4l5>vTQo=0iq(B*&tU&(>1qH=(N{fn%N{eO{=FP~@ z%4TnRd%>-A1w19STKI$+DGs<9DP?T`Gg6#o#f+4GEZzO+DulWpQ==b?bU$KvB{RQ> zoDn5mT+Gb;YW8Cr$agT)+wK!Of(v2X{|FaCP6#9+Qz@wfGe-)Ja0D)8c_qaRDfN|0 zsxt)DU5+EeQ&(9Y)Nc#rGFx6Gm)m$H+pC*#kuH<;2js;F-5p3fL;@3!np{or&8n^= zgSDi(a%~_CzPNsoTxjEUtk<@4vW*gX32r7QxXqg4punFfnOYr&+caS+NdJuE@`jYKS2-^3L%-h zYZLl_aJ|V8t!NC;{A~G5nJmU~mZiaAT)Q-|I@2LE_j&y0csr~AJFyAD=lZ!RvFX%*T}VG@!Qv0URgmAQ?MEtdsYrBIH}{LUY=#k4GhN66U0u-_^u;g zn9Rfpnz4&Bz^Ta2HregpGe)05M3`R*>_p8l_bc^eSLTS}J6f6xdgDTMmMo<}!dW8j zeG(xtY3!2;Lr)CUv8!CXX+WXez!NlTY^baf>-A35;{*!4NOAI82^=_?&R)f-4RxV= z5t^#2>MA)#qfja*-wlw<$>|m$$f@suAiBma_3q6@pv&xOpJ9V&6K?;{ckx;J` zplM~bwE-S5^Q2a^T{tPMPvUj0<3BbUYJ#W?H;iitEi?^Nn2Pe6+BLkGaO_fleg{PY z307%kjf+3>`%fCxq$^LdDrw)!`Wb90} z=ew(e!JVOCZBJP}R}#96v_w6begtoafjh61EehZM$?QOYPox@bcO}VP8MA0Ag`~|$ z(ipmO-qo&aEDt`;?NBfMCKE+tCh#`gvD$j*i5I{-)bZ5YijGzve{(;-Ve5@o*cxg= zJvcjmysIrp?^F)4LvV|;U1@x9>vVD>c|XK{%v7=Ai*wHMU#E5pcFxi!arST6esk=K zr?Eazf2y+#LSzlgIpZ+rw<}0W%{>v*bZNKx7(U~Q-!!)q8@c1HF*zG|jmt~c)CTHj z^9+b@C*|iAOe`&$P?#5XdVy?hNlgRml&E%AnLB8!a!f&P4YklKt6lPTb48@EvR*8n z2P()ZC@iZx)0OO8;W`Ku)`_*~Atz?!<0vdMuV`ZFgc&m?%q8Ve8QRaZxHu^69>RTO8t$q;qOVc%JR-wmXV0x;{elS*2lHv!0nH6K0eIr)E33 z;EXIsEtSleMTqw}nMo50X6A(+70oIrAeJd7XQv^MyOelH;5DRnhyB{d&T;V7HLS>6Ydfl{lno z+mp2^7q%BGr}9>8+%cQ3q*)xicIt3LR(0{57+7B0ux3Ja#pDnbX9kuy+aj@TlntIn zFzN#JVlwRQ{f6Dt1ZQ(Aas;0n;=AE}LEeOkaT&Ob=l;H83Tz9i+YCR9@9xx$g zoi?^f>2nw zxH3?8stDH~G56aLm zbR{)Y0;}7p1d`Xl65$*+@Ux&_>g_1-V8kK{Azc%A$57< zEKQfEUFV9`gS!a9cf(M) zhp2cjjDeky1NXs1*acHy4-~)yMAc@21QVndn23iVJq!;D4#i;(a5$WRW6VFwQ-99I zc#s5}VJzQmhT%cbjdq|LF6cVn3%HZ^L!v*4AZ?-onHf;PPF?!8!`vWx+#&P>0)2$0 zvB^a3OvX*}Cg>fBo1|m#!V@r)7xFl*cPMRWngJ|nPl66l5$Mkndmkj$ehxC=PcRam zhpF%a)p-f#z$>r-UWE#H4bFwv;R1LQE`hh<3V4SQ`W_+keb@&dz{BvNKw})}W(!O~ zMQMQ|By`&C(3wSOba-VxaSC%#s>2Yy>C&wkh~QEFJwR|IZv=}UHA8nllJxElO}#S_ z0^lDs_0NgIUl4`Af`0HXF}w=0PgB|rIilT=l8~K!(1ZH6HWCR4xdrJ5A(jVWbazW{ zhLpC!y3;TKKT>Z$kwW;HdOS>+`vnrA1$siO7*qyQOyR;a5=Xg1mbp-}T=v`py@)62 zPTokIA@owS0K88#oU+T$RhpsiuJ&?Ey3|6O#4`#yV>Ic`Sm=fEVq68JZn_v)qhVrk zG!2~{8v2Yd1pnI5xDWb8j_adwlW5#z8n-)*n?mFEI>ESO!p4OF&7}Vr$_#i8;+ZwNkxUHS3j>;<6PF%H+D`J3^e7p#0qJrQ z7s<^q$WJCNlQX+I#`)k~&SZw{!Zt9cLOjiBD(E;324WEm$6^?Vr;;|D4%2W3%)^;b zjwP@RXG0^-fwedn&cg+8F`f=r;2CfYmcvcB7`9-gKubIr1CKzOPFRZh8Df+eJ(62; zaiYsDx4T?=hJ&utBGEM=0$pkJ8_7QxPlTnN9fLY_rwi(VonhvoFKIi#T7q>2!P)?$ zaV6y7DwvF`3D$F9Ca!}8c!7XJ2X&woqZ<*E&kIfdN_X-F&g3UWPJTqh8x)m~sw^UGVoW58C*fpwmPcuP=E&Pz zfxH8TICoih3Kcv2InszhD>A~dumr=%_)(4_X@=3xY_t7-!guyw7~TY_g`p;6saiVM zA4fMC%`iULY{KILye8=BjM9w&%_;O#nwvolCiTox4;sbC#K1iIn7p}!-xEUW3DDi;i>pnxrDShC;8n)=z>o}5UNCG&t*k)_I6n(JYh+sK?X!!+SVkP~3c zQ^*T2hQvYZxmmhbk4@Rp`fj>cZ-#;_!)x3MJ*ceLR?wOxpP$M}n-n?^w5Hbky^2@e z0bZ}>RTgGx8JV(|46}!Z^%_~`NsSmjR1^=OI0Klm+G?+{?sxRE&1=LS-2(lcc_$Oi ziZ(%Kuc@!iGBdr(g$jDj^(9SMz@w=yII%~!!qSr;s+b&5ZmtEH{Zxn9r#Hil_?baQ zFM0f!QIDSWKR{OLKsMTe%{T{Hd;}wSwUF8(+dY-iH$ld?z{I!70sMfN{zH=Ek0>_$D~!O8VLbi~^6(QV zz)ztVKZCjW4>$uqhcf&ZEXA*(2ETz-_-~T$LvSws7cRpe;VS$YZYPKGUi<}iQNZ#r z9))KlgjXdA-jo#hQc~eRk^%pfOgJKW&?DIxCqWZgJiFm%0gqKLkxL)dx*Gs){v(yLgmQKO@q<;9cl!`A(Y51Dt$9JU+{7lNke@gxF zCux8rNdqNS8Z5;~L#58rXemj`meQm#(hzB^lqKazBm&9aAqKi0vlnFFE(Qf`DDJJuq}3s5j|Z(ckxSu@>WTJEXxjcZu))u;LKfq zUo%t{aw*xB<;_q{Bh01&L}g#>s4YB;_?lpIAInw(J4`ZF?6nta8F9OO_k#HMcj3qY zWYX^g*KYH5kb52MUWd5Xq3(5?|y%-{bVFrr*o- zYoH&8A!i9E$?*~I*#j$znqcZ4sH00RK~vAr#5a%(HtvCyRM_7izskw2rd*0YevOk` zOSyQ)&{=e2^3B;ryei@V9kNu1Ae(Ma2US`GF;Y1sNCEIki=l^934NqxkSbL}hExMX zq(;bCxC70i>?LaB5P1f+AJMmi5xO6SA*(jVY*=|Z?xx(GH&7sEE`QrIb7279He z;Bo0{cviXwzL3_#*V4`KqqLC(_Ewao+b~+%j9zIAc9XVZinI;;Nw;H$bSDm$nsB&u z7YXj&m@D0fA4`A4ze~IDb7>C=$(v9>x~w5sCsHm1OCFWJ!-p(b5xAob;5` zReG8P^cks#^tN=0^p2D&y(jgT-X~%GKnP(fcoVD^=tR0Dr&H%ngO!*Tc3?|k#)k z)V&UKuUYPOxO*MpUProD=BZm;o_f>esjpm~I_&b)`z}xIb9w4bA(HevoqlID!#R#< zt_UfIuxIBw&+43K?YNJMS31QG|51Lmn_uJR*ScLY6Sm!+Ep9^$I0@qD_HUp`pMXdD zlo;?c*d=`qPfK6GOVU^HSLvU`IN!p*r9-6Yzk^ok2h^nhVvO_?c9wp|9=+X7Suu~;I_Yi?-KBEwyNvq@>4 zN28F1U)Q!w7|ou&+yfN3C%I$2+O0y&!}(4h(p_X9IF`7yy?wCQKFkTmA|VSgCMjeg z2oQSw8!SXpq=iW8$U=y2lOiodQb!iTnL)@xBsmr$>7*>gm{8{)e-c@UIXox{=Q-&Q zQPcoMnFoX~Z;&g)?%8&zaC2Gg)$3k$2-hxleQI)=$?4e&r}(|9aNM|e>gf*%?QG2j z%Fax$HbnG5O%@K>LLM}j7i!ql`h-6zeIH!d7UR9aGA<7!<`_hbF&Gl$A;cWRAX&~L zz(+t|c_jGdQP5u=P0W%F!{o7$Cy#?dc|0tTbD>P01WV+}utJ^!tL3S1fjkW^mkZ!Z zxd=AM#c->9D%>v5fcxc{uvadDee!AWq&yd%ljp%#@&fp`TnazS3!zmmLzDxk%S$j? zUW)N@C8o${Vwzlq!{p^SLaxTKaxLb`E3ieB$m^ie(jGi8p0)giH?w!(^#U#%>h$9{FTo1uH5lVihe{cd0ESzC!ONQ|A_d?&X;XEmV>sk$_xoM#e!$i4Z@Jq2Q&+n`>uUFASGyl*2XhdQ!U%Spdo0a@~ukS$*Y6XdI5ihK>^%j-#= zHo$E8I+!Eh0H@10LWO)21W5m!DQ|*R@-1+_d@EcgZ-J}jZ8%WAo!D;&X3KZr7`X{2 z%6Ab9-h&15y~Kw1V~M;A=gYfsk-P`X3v6;Z zqXo1`4-j!-Xu%d*q$t9v|ix=3Mh^gCrkQ{Od zK;lvG%$ zqzklk0=)%>5fb#I#KVBG<9Us@JwD2Ck&BPF+;zv5A$%+d;iJ&OM+V^|V-H-)v1&71 zwlm{Iz-Js6c;8M3_)8t&FC*Z6ZG0sb5|tqY{7?dZ7y+L}zz-+jM-cF2UzO1Wd^Sv0 z#z2uWmVh1)Z_eDTEji4qTB*Vo-By${0;Aa(?k#9RSV zcsL#>a*IPLC#+NuRsw{T#e|h5gq5X)l}boc&V+$V6%19XVYE^M)0J8{O<4hFD)q2j zX@u*QRdBPi25wc(a<@4R5g^X81giSVa>OF-l2Bl{he~<**Kj2KszQ0JFE(>4=n4^z zS5TFWkdu*op^UMavrb~Ekj%%xZS0qf+`-C}lN2NQBu0U6k7(N!bj2$jcs} zY=a@n?Jz~T14@)TVZL%NvFc7(tn7knWjCx)9)z`IK`$WqFH;_Y4a#G1oANm9QJ#PU z%9HS<@-#f7JOi&P2jOqZbMUqD0{p1F2(8L1f`Cb2AAtlNm*RMAfn-e4tRv71u~YA; zI8THNP>IW2S{hW!EVi|cPQ0mc{U)&~*C&a=Oy(8Q>pDbemg-ewN8Sz=T?TH4K6D`* z#?gh4$c2Q({{HkNuS%UT7L(EsY!e$3#5gw;$YauzE|k!#ZkTnULea!I?U5WldW7cx z0OFMop_}p-=%xG>Mkr)JmA?^AKY=C6KZwCUheqWKSfzXg>y&>IPX7fLD__I4$~VOH z{}K3#CLZqD0=+T86LT1%BQSJka7zp&Qu!>9H@0CY%E6EpJ8);nVUJ{F@o*2^*bK?M zo)>>pGu#~Rz7u=rwe`qq@A{2m8|wt!g*V^Q`b-nZVMal$Gbl$0FGs;k+M~BB!2nf; z!Kwz?st!4-1qG@HW~eq)s8LX-M#H&k44kjV!4+yetXDh1^=cOvH>S4*5>bkYiA&^F z=61NL!sV_5xt`P%?>=5n5v81^C&%`us6~)8c|(}w$2#~jl`OqUKz$4!jZJ1y{mHIi z_N3UdLrzI%LA~3nade#=zp)uM$yr9Skl1AAwXcrX>Lk<<%^_3tlfD(k{crt{M3e}K ziY_#c3&?TsHJ2U+a_n%WC& zwKpWF{h+U!3TbK@WT@#dLCt_dH4{!%2f$2qAk0+7h-|B2rJY8R;r7!Ry`9N)haws zt;S2#6>h8(Pnr&~OYeBg(?X&f(>W!kb3*qXT|ChdMyncYTrvKISe2v#M^UV@#aS=D zja8ZvYc6zb3A-?xg_bMa16ztRj?r~WrdR2|2|hpONp_}>%J+MfSYx$sU6yj33hREY z!jxaD5K9E!OS;-eq1v`xBI@!`k-iVM@1m=ZZf`DL#nb6JR?Hn5kXoiSt?;yZ8@!-yf!EZn@SeJz7-t83 zuHFIvrU>gN^=>$--h-OD6Jyl-$zJ>slhxhWSA768)dz8q>YRA%0=6B06zI_K^|0nTH>X>PPb+RM<~zk#>?g0Lsg2CbC};%rF|sBHz^6VAJ=G^j zS3CtH)MsFv`Ye(6Ad&YuSg8I9&QxE3Rq9J*QC^1Y)K^F^yb4>?*We!Y4QN*1A`-t1 zZ>aAOY2Ss9)b~gyybnL9A40487b5FN?&>zVpc&{HEdECjtv)Epl1im4$+JjG3spX) z=$u*9x08G@B+0T*Zic%$c36}Q65@^IsR#y-aT+jT@80F!lPGX&My^-s7`w;mMQzuM z`a65k+V!IS&R+C(z3ALaGUvz^xmEVVJ$#y&Z`lPd_A1#;M;{DP{||h)NBs;G^&ceY zUqdJL8%R+PL6-U*j8VUbiRuqzEq;VE)Wfh?{RPfeTi^oq2wbing&WDG+@Z;^Q&Zq6 zO@-$*4PMi9_)s(9E6s*OS`-=@DQ+zWJ8QAnON+;WT4x-ob-_F>5sS5MI79OZuIS7Q z7aGfRVhaqwsNv#&LIis>V51who-axPCLU{F{qgrU!_MOb1|fAP#KL7EXm{X6>kA&O zAH-{^&{a!^Of3V3Xqhlv8{nRN>9|E<6}Wd z96j#gY#TE@#jBuNF{s)Mh|*?4f>r`uv^mgSn+s{$0vMo`LzWhRY;7^*XiK0-tAttF zGMJ;C3G=k&ut=+h6fb`iX(T@3GNm%!h&%iweEa`;ZW5)Nxu!4d6h1npY%XzMXv+kjoQ8*q?zGiGTU zF>!B&u^;^8i|xk?$9v!baXy+|um^WhcCQGVc#XNa87lX~zQPP&|Ba$xKQGi0 z;}^+UiY(5Dc{L(?JcSGtZwmK`T!vG;N~WMuW~QJ~5z)v!`J)#5vQ#DfSXl?855-_& zTnb5I+oG?g)@!}mX6SLEA(#;|SukBri1t&?s~y7%m-8lz_D6`-c7a!W0D5Q-LSOA+ z@N194KmUx+1;Z-QpUW4V@8?aJ)6V_;N!P(k7 zaEbOVT&=wa*J~fZcI`uAhrhtR+FxP6_6aFh3!tW*}FyH@09s7BRNb_Wh8f?sJ?itAk?`N`l zEoAkMkkva1!^t3K>j-0Y2`1<=Ow@JA*DWa4JupL$hEhES0(v~u=w4{hlVGjh9oFeR z;9@-mHt4-zlinL{)BC_yy)QKB{a~M-3XkdO@Uor(uj&2a9en_Ns1JlM^uh40J_Nqg zhr)mLEHw4uXzQcUtB*yWJ`TI<JBM6&Ade-}-P_pZK0q03%6Bj!N=J zd5wg)s4iVP>mBGgiNA~HTI)IP@;M(B)+pM1xG3`=sF}Ok8*f5+8@k1NAo@};^-74+ zmqCoa96IaOVrmAz(i9UMP$66I3>Wk*7E>8J2N_~GGC_}wQWBMepd~7yA;pN!$ZB%C zk;QufdLwxBl_dMCpp(89y6I;@PyOt+(K{VG`g!i?4erU~VJBf3)kKOJY_^OF&mmEb z@Urwjkh^yQ#OoIkf-i`lxrB!(>d{V8SL+qY z3$v7DlDBT@NlHckER`=LfXNlw>eaOl{cEKd_m;0NE*gO8mDG4w#? z2dVtvCwlO$^FXHu8b65fd(CEeRGFJ)W_f55o`qgzM^Mb&+1T!EYz(egNzz2=5lO-D-}fv4ssYOAsO2N(fS?W)yY}V?}k+UJ{Y9m4?{`)jn#L7q#uCW^~d2J{R!BmKLySD)9|SNEF9Di!b|!K z@Rt4}ysy6mpXo1?Dti^a*I$Ff`WvY0Z(@}G7OAnfNsYaOef4)SP5(0v)8EI@`iD40 z{|grBAK`5MucX30#wGgSaGCxIuGBxpb^2#`mHq`@r+qXea*+zSy52O6aKg(}d8vaaDrO&mU+n7hn6buijh7D0h6vP?P(AkKEu0|ZB81Zn5kpP1YFN`oc z!&svWOfkB`sYW8qF}lGSh7T4SNwCC7fn`Qds5g4SN~1TNW%PmbjZ*{)dxO#foyk!2 zbPNUAh^1^S_zeeWf&O^xmcj*iq3a&iyYA71AVPF;?7|4{YdJd%)10EnlO=7q6*o`P;(94khReQjuEvYnnK$G_zIapal2eB2Fyqwj=RAw=(HK44;G621F_#~4QR&Vp{n zaOiG~fIh}3@EfCv-q|qJ7z-1PaWKso52qOupw!5LfRPJJjXa|BWLRTNfwPUN@CRcW zTx1l%UB;KR91Fsr$;ca6+yl0#a9~q_aFJmDbGRokvu?Sj> z3RI27Xc$W|+E|8NjpdkZtiawz9i|)gm}#uU5yom9Z>$l#RKe%vJs{ldq85J1oGd-D zR&V!s*-~^|@FMoWTPeN|7DITk!HXo}wFw`+bh2i>Juym5-08e5KC9a1;h*&gK1m>(Z)59 zU|dTKu^xIF8%X%CgLLD17-ZZ?3g9MUh?`-mv5^$OCYWj526K(gu)x>~i;Qi=96R7r z<4(AW;JMbg8*VV}ft!t;aGP--Y&HG}cNn{fN%p|~#)Gim*awdp55p72BZ9E~A?gV0 zSEj~M3iJ?rGM$|Fp#9ISAT|W%q3-pDUTvYYdRr+ zCTq?tagudAA7~Ap9@q|p64j1k(kJ{AsMCSl>=O|F+CYlk2>`f5;(?txxyq&xsb0^<{qjK70odbSp^Nb? z^fLYfeU0xR!}y*w=?{=){0P~`&oJ3IOl1BAW*A3dzR?QRCcs%H!nvjlmzgSDX&SJ> zG~ou*hW%zV957?xpxFstG85ocvom~Xc7e~#MEIxagKx}a_}=V+l9_^r*%M>UUKnro zL7&+dyPK)l$4tX?GXn>j12D@Rh-1w`INltJ)66WKX^wCOuTv{@5ehMAnT0}(Ce7-@ z^uu6DMz1KL8|`CtkaG6ifqXtWn$s5YnK38$GAH9S2PC1!s89+kbWT3!$ns$dquZnP za=gOTXGh#<@n(M6d2Ab2-BS<=p%pmx-9O`)B3-7te>B7AZL4s^#YxHATAyia?s15s z>~6P$Cl;*-Zi6_woX&?*6h5X;m3VdTiw%5&Wj}nmF?^8S?e&^@2B>Bkq?+Y0*bG3n zxfmvzl`z{}26N0RSZppQX0L{`%@uHwSqE2{^>CBf=pHZRw`?#j*6hPaO~^Csh7oAF z60dU6(#Jh%V))bJziNhmMtnQPTnoB+)-kQGc3VFWsz7QT^Gy0a_*YRIW`YM+n%om6 zVcbf_yd5G$t*A^s*fe8KQ|o~c3x4geU>D}XZ=Cm{T~2I6m-xhtxeiS867ZRqLU;3W z7-(JrBh4#ef_W98?HZV7UJFI$dRSp@a1Wl5CvEC@O~Mh1N$_WgJg?J#DjI*=1U_GEl#}^S6GZ!B%`N=N zmS#BA)VeVQ{&&ZDFJr>vA?U|K3_*Vz#G9L;A9a#xZY81H2E)wTiD@W=Ht!(eyAz7d zCYWX31q;l(VUc+cEHUqcW#;_?8!=?$C^+kdTD;9_DgqblL%8^}i;LR-LtHe&_tMS? zUGpG;yO+Qv2i)98;O-}IA0}`gA#fiha33RZ4-mMI6Sz+hxK9$e&k(o=$w)kRG9YgV zf-FsRK*m)Ow!Q-eJZdWp4c6K&K5*0SSQVk-E`f^eVP~p#x-UrxA8RT&M=(urj;Qm? zXxYGf)XvfL6t|q`n%e|@9fb98kl58hZ=5j3gB|pN|5s-1EZnwU(EfD&?8H@|~s^GA5n{0W{l55r%~ z7WmXW0$*7Yv{*96SqgTsR7|!s>|q($*D^7~vT(5F!I74Y@V_4{+j;2k~b^o#Cg=|cA&mmt6 z&e>x|$!a&=Sm*k+m%0M6%oT_g^z*ZTbYyX+hJ=q1GqO$Kc00n-&k>yzexdCZmYpOK z?#1%;H4g8RM0hvaL3tbU7DFP<2+T!H=Ð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к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 literal 0 HcmV?d00001 diff --git a/webapp/lib/jackson-databind-2.2.1.jar b/webapp/lib/jackson-databind-2.2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..1b018e0037529d31c1c32301a58c2aa925621ce4 GIT binary patch literal 864931 zcmb@uV|1q3)-D`ZY}>X|v2EM7Z6_7m6{}*~w(V4Gqf$Akw|np1yU#egd%xe8F`gtp z);-5s^SY+j{m4lIgFpiO`Uy?U7x9oT`3;j1FYb&b0Q?`k(7C{0W`PPGJoIqK0 zy|PzRwW8UxFEwB5sJu$0B{l-9d(91bpI|?8hBq&LX$pqZglP-2yj@6gdA^vH|bRyae_^)&qJ-pJH!&BV-lcv1q-CCTDBbdP7YgEA`= z7lMocZ<*VVL08V=mRQ)F&cR`I%7$D%tLaVhp2KB+Q zb;s{o$MXjxrXhk333;$G5#{`bFTE&~98OfXEppCqm(DimRqkq8)%RAq+^QpWP1vzl zw#WuDmi->ooqi&GG0s2)_T<4OzU=I0qHp|8?C9-|dln#7PmdLjHfacHRLQ<}129R$ zqLJRs0uwXTs^hkb6zf#!=7E)?lHoG~f`b!v!P&uHd3uZ8=LOlHTW~5Tr_UZY%#@XO z)#n*u+~Ft(az1|-26BC3REv5%hud<+zEl*{BtNl`us-Dh$q0aTwiXd+I)8zXI}4Nv z47WA0M(nh|&pv|EjxS4i`GGwDN+~Z_i8@--nJf=Xv-q%05igt*CsbU%Ij}i;ZtKJ{U^U`vO z4N1*#~|Fqlxdj;(8D@^nqos1patgZgTTGan*t%bg! zrK7FQAD#*N(+=?dpU)WSJLwyk+Zg@f;ov_#O!?Oj>)Y7aI_W!^|Jx=4|0IX#ujLq; znEqiSe?A4tUkflYb~JYQgNXmdS$-2?Zf*BR5dJKO;_q(7(dj>__HU@f*v;@ioab)| zaQY7d{sy?_Hck$YZ*4SMt_v> zXH)tcy!p?D^f&bSOTb?!gY2&l@=MCU8_}Ps_cyfh7x4ZK3C>RDfAk05f1*F)$3gy? zpM7lE#oW;NU-SkC__b$&BJVK_KmdT3j}OORADrL7(aAyI&`IfonhM5_wpK324zz|= z`i_oKay=4#eDGQ3vm%BKpt6vVn;LMm^M;Z5C~yiW^=@0l8PyCcFd5eJyggMj3EMqz zSNZ)b9ta4l-0f_y2NPH>yj`2T0D1r$@LbE#dQ^U}0+z%{^<>~WRlcFyG0ueWpOH%Y z7ruQ7O1mkslb}>)^#0aQQbk$H7<9NvyhtMHZXN7S4wZcS)VUZzvVIe`ekL{FE2c9{ zW>ctQSfP*xlOnBs#o-zm@|KhZz9ur?ni@G*(ik$dI0C*?k)5WNDft+XwbhY<*TykQ zkq^Vej1Zmj?bQ}H_Y_gBM|rR^U#owS*AMKiniKbHB&pSmbqsoVMyRb{l@dNkP(^UF zOmicj=>~}l0*u%5-WnOS>J7q3i9B56@rg`wuZp;0@7VP`X{3kK`6Bs{-$JxN`7cVH#8crd zIeJTDV4zJF_uDafVc&yBpRD*{=eHZyKEg59Y797nb!`7+#a_2tsMEJ%dRIq{zFCrb zJ&sxEx+#1e#YbbWQYD!k5lbr&>HNXvFSD?xov3gI(%N9H3ikj4g2|;?jSj=ywS=m| z;qtt=x4w!5qK{*3MJ*E~ZKaR(1oSUm|8m{M=VXLVKmY&_U;qHT|DCQsytvS>sBNxq zW$t18o3gW%G-Z+ak$He=BoRPCT1s*WR=Qd1lN%`_!>@a!ngp4QIV~S% z)qK<8eggO=UQ5x{FIro?Rx_DCWZX`;(lT}VygxwzK)4lmQ-MApharK#(xRaNMXqtK zP*x}|xKv0_rEaToc(@ZY2+|$VVFM$YfXwn1KnG>YWt&eE|iK@?4mM+cT zr`}eWlqy?nHaE(R&F7QQj#>;RG1EG-H$1r>SczkDkvNP{1$cA@W~TW%6T6C%$PCIv z%f`Ab)&~y-xh_Q5zl5-)7Xd*4h4!iOR*S^0&a*?lHm9E?#!po+I)b0UITkk=%Q?Cf zvyTA^7{s#&=r5%O8bM;iv!f4Qc&;nRa`I%c&+YX;vnew!()N3`!8d{XLqyOZ4Mv#R zNY?Zhayy#8Mvo}0_qwQ^P+4nH5>_kR1rJ%C5xKgL7;MlAzc=76aJw^=DC*-{KrEGh zC%QMe;@L1@Q8Hle93>t%Z_(PE{^G>*IPj!24I!m{H0b^l+Fik%JJPY_o>yTy0@J`F zu3LoOIc@}fMqu|SmIicf*F?}o{F>6VfbOox`OJQ*-pBdYALR1AtLY^^%K0>6Jf&>> z4*c7vlZ)(!+XxYu!LVkDmSmtkpr?fjZmzSZ+bxqxgEx@C$qV z-3fdEeOi_pvidlO-deVLS5rKKsXe4zDSgSQ8%p()iguJp_P=x3wUJ53SMkR|ju z5#8AB=96P$p|^PdBJ{85Kefu=um0gU>_15T`M)N#jJ~zGjp^@>LqS^-h#$GbaJ9(W zOr0N2UPug~9=;R9Kgd6?{0LPD&VHlF*vdu3#kBCvlKT$$MSg~bKNuSCV*HK$aGf*d z`Q_&mh#%E*(^s>eN>EQ|MxsOpQ#me9TUfiGMxpO(O^Ep=z4&WLodQUqL1u5lTDr{K zILlS&7`UCEW^unhqM93beeLO#qjMpf7sO5P@8KiwG8JH6m!)JY$T~e{zkAAxCC;{m zw+3p(X4AKuj!HrR^o5T*lGIU_z+x6C59`@k$7iQmrVZg?BlfOs)=A*n9&H|pMIzUA z&TQ0lKD9nv@jjbJFCbgGHgHM7B1{lnpG6cCmE0i#sc(IZ*0hbYc+OFtn88YzKPx4c z)2ZEde{l+ihOB#DeFJ=i4$KcGno3VXrx%N>m?qOV*Z5>au2D!1in_8|l@g4-Q5>XE zZ1Do2fX%As=w-$4lesJBXT1#g1o$t&ennS4tq6GS55Pn|02BVN0h5!JkQHz?w=yzz zAXd@0a{h-OlGpr&-Os`K3Fk3MwsSCkIE`rmTX_s(Z3dKxP16nep+)s&oUyJ2L80HE z!+;3zNbtY(IvnTlI=p$l{|Tsvm%&PnTuW|15Xg)QqseHs(i;)19FoZv@9#_G#Cw_LwEIEo?xR_=!=R;G_I z5Fu#e=*i5~_goZdWYmP>ZX#|nKS3p$3uf1ah+`PlGZ^O*RRs>P{vE$sSV@_v5B#=2 z@cZv0$RF_gJ%T8#{ZEc`K44bSxLJXQOd+fb9Y(hsIFD6trm#vL23IRx?0jlMG*Wa@ z^}PM*Nq)CKz&aQIiGC%k?r=Oa>+Epp^%DSgcM%{c@FKJtn_eLQOY#^vh7py7z8$GM zy1_91(w87B?R=j*P1MJ*>gG1rh40)p5|y7#1V0HlM`Mg9CEc(r^{O5&AH>Zo-HMLm z-xA&#(sVbv8OKH-^k*c`u4}HbTsMtg%up#f3hqrN?nrI2N#~Z05Fg?>s>0v2t%SJ7Y>aW}SuIbhcoN zsA18=5qw^HbGEjl*{v1KQ_tzRo{=srR9_v%aKJzi;dmV_LSZ65@zEl3$&gqAJrDF@ zL|ammUg~`_8inlQy%tX~{P8}4AL>Dc=mKgXC~72&Ai^PEk%cjfI{##;mg78wzj6gZ zPyhhY|JqU&|B)#Wi`y7lIXiyz9DYN*LUBuWP7a;h^>opOs!N|;NKR;luM|JbB&fPu zjNUobDUg~cwGvt3%qF3dXz;1&X+J^s^B44}5Yat6;~zHa$Uw5KtQ^IMo0n}{ExMO) z&!=Oq0Jm<5enD1<98zP$!_5gobQh4R%F`(Y;?hFviuA;8GW;4>?E(5dkH*yW{ZKD5 zxfb-qtS#SJv7(1C=A|dCeJ5D3VA^`Bi!^n#*O;*U&%3_0t@@jHn7L`Ku>jW{Txn12 zuS1RdIW!D0>o0d2woX!c-b|&tgB8{*d+3xMeHN7PszhUhMCp)93Z~?7*QjJ1PFMr& zP$1?#o%*c6;$zk-T@xN+CC!@kk4<|jr z^4w_x(%JWT+cIfoy0Rlv-5c9k&~IXs(Q3~Ax(=Pr!x3RJ5LRo|a{g^Jt$@&WF@;ml zBG`%qrs`PpA%y5<+LzWrMM=qCICJ_-gfLfZO~2gJWiRF6mE3^yx|tvzm@+hk7!>*- zzTo5Y8)HB9(w>n6eFo=TWW}n#HE4ZYp>O>_wcA5zkSdw)3IY2iS=VP#wwjbmM=KU0 zRseXo29Avb{hkh@yijBc0)GT8&_41~2!m^4O}!j=4*olCiV(}7Yr6}Wff)UE9ABh3 zJ7yLD^A{!qvRGPDAt6Bs;a>K%=aBvWKx5 zLvm5EAVP{@LKH|A)QCzsry;=^B3~jD>lyJ%37Ud07TQnvwQuH;Elyo`QI%L*#6yxiNZGtQhpG-?W5r*^#6g_9~Iv} zvxf@B4cl2cPlx&u4vw6zEsn>{9N*5L09W8x5G88j1}Gdbj+hsuxqI2j z&+J9<$kfAM46vCLs?3|GzH(bHQqj4TLDvkvHbt8;9dQaQ`z(C#$lfp{U!tzE#Jf6?uu{TI9Fn|NKCfe) z0iCpjWac@%(OIB2fkrwlQ{nN-+UGQZ;L@>Wz2Xztq;+FPFnIweNThpuC1}&ERS&~- zWvs6c6llfK3n2lmN_W(yxNInvDx-Pz^%4n(gpT`~W{kVsgF~U7=4GQ|jFA$dxZwES zd(7ux7-l@WutJg@r|u?x;@Hj483s)7*rDVz>XqCOVP#G@g^|-ZeqStZP7HxXOE$jF z?Q`$&SzAT4HE93ah%ckQ8T4z z&wQg?K(9-jI08TOV1AHN78}9HC)-oaH!;wd7FnUV#?qR;|DhoJl@67>)qd{&;35_{ z008&@o{PV`R^?NLIX+|_sKQ*7??vR40cr>l@Sw;^8sXOHyNQYBk+6Gkrs63w_#5;i zAqaRAcszb^-`yHv>T%X69Jg$@5Y~JA z>?**lr5F}e#i+AV5XF0#MoQBnqD-C+YklVY9!M1+4*VyGPfBRu1M<@SP_mz0|)go_*4r8>zhiU4oIZh zYnf7{uQyhn92@$|Cf>hj5h~Ovp*}NYtD`e&%IFH8=<*F9SeML*A^f@ zN;v;+DbEw2g!{5$qsqwP%G2e=G^?K8Y;{JLyGiaPt$-JKq9n0up9x5VP!_FmJZuI@ z_*9!y=RRD2C)<>0zeUF(iYx!_(FNTKNGq2mOUD`rYV8p<*Jl+XN02L=FS5Ko#k&Y+ zEMa>;!7g5CnnC-Tj{*@uL^uHrv;3}2wq3y2`StRU?3$45;7DggA)x7-;oz>0^y|*@ zJx(&qi1)1L&+olqXdg;2XBq7JKxLyb8~9NY*( zQ=XhfAwqgBugXL~&By|L+lMj|zHW1c-NIXSPl!PmZFgk;(KLSbDn>PxW>r2i&43T{ z5csc6<5xRQ-00sMa={A!Qzr0ylz7_pX9E9I;xWT_P<)hl2Ib#0;ko;pvyB>8R+e!{ z-ZkLf{Ct$0SP5XFa3|khCpjEbW2Ty10oX&Wp(0SNG^z*inUF2~pd*IJq;;V|RRtcO zlMwB-Ok&T6J5f#G5qh(Qm1Ht>(67i4u)gR34|wlz59JkFx#;673?=A-S?mU>L} zuqz3E8BLkzT7vi#7rLY%|Cj|v;2Ss@Zw~E}<}Pyc#Bk`4qw zn!`nxQ?~j0-IxsN8LYke{nGibH&cbh$4tdWa;ax4Coe}BV6TpLt zoluA6>c!+CspAW6>7Y1jMT0boEM5Q=z^SU!OIU`R)tOzjVDUt>V(wDH{_Cu0D>j* zYTh;F8u0?vQ_$W-Tw4FV%Me8`Twz7Wf$%B)9C zsY60*Np8ubI=JEDTVRwQe-g7-^Ive&4D|9E$OSm92D}3O7kaZ=UPym4uvK1ka|GG^1JA#IFOf^hY&r2Rh zpYHPW+8`*Jclxqg@DA5K59xKc@Nxj`VAo)gah9F*BKb^)jrt*wV`NW&S&ft!7mC^9 zF%(H-ts^@PSRoO1CJAX}Pdj0cpqP?FFZ~OE54tcb%wp6RQOZO;*RNt-b}^KVsTEb| z%lmFnSf?7Ckzanuh@Ew63T{GQP~(c}6{F}AZsUB|=}m;fDkD`rBgjKhvVkw?Nlo<> zjSPoW<(34lopHwumZ)6kZYxaHt}@m|-Q#jQNi44Jr;#(%CNUAXmO_r$qU2sYf@yQ^ zW}SQ7Hk}_tYsej}GSb-*FqMa4+|sfN34Hps7Wtgpog~#c&2L6F;Q;=~t3W?-;zf+{ z17`?DDD0+_eLAT3uXqIJ8CB+FV|S~8%CBp{p4oqg?w^xvaDZRXJr#JZiDt0r<%1V~M>qVm7p8^pEzkpLkq8zJ$8V<~Bwv|C zsQ?Mvol7`~s`!KLR@9ey>Aefe4+R(LOKgAYpcur=s@mQbcz((foItaEFzL9<;EA`Y zX{-C;H$*ay*2|< z-|^cXjKHT6C=7E;^ZtxP;!Ij9F5*R_8UTgY9f~NcS)CCv&F2vR)IOu^X1*umJw&{)pF*3Q_$$({ID zPVjrCthDtpxPbrJ*zvIHfNTa>xGh`OD9pj{Wg%Gd9Y3mpTo`dTP^Sutqx~YTjVkV4 zf&d|Z=IRX3IFnnrV2twWx`TKnoDjC7c>^OLnAJiANDr5RW0)4EH@4nr`LHB_7q${?&%|MQ4eaIU4T zJ(X>bXDZMehb~6J7v+YB7i`$T^sR5Kn^-g<4RCL?s9S7V*=GmZxyz3eN$G0@At9KJ z+Y>rX6CE&h=dq$N<(1Y<^-xjTj$89Mif2a^-E{*pEz6IjRE^bv!Xej|WebrR&?Ctm zMB`r%5t_~TJrGgGIL2O_2u9#LYzn)cP$BfozCUn9RxQV8jhx<^l0d@bJJb&`a}8k& z>c*K3>+AF(Uu1^!8!;Qj<)*cd`$eEZmwT5@z}I1`%I)O`?}C;st+pld@3*(RS?pY@ zcG{TH3MRU<0W~v=x(14%NjRAcFapF*N^oZ;?9W965D(fzK{t(fh-vVY3RYi+W#Ydi zQHMapU)x#x?>eS(MdpYQ-@zK?Ci>vJ0DZR*5XuG+PqTxQ_W*2QW^(@W)I`9%}P#d?C>3A*Q%JP6JwDYgU4JG1Or2!GdqDYHcx@pvd+KgN+&+ul^@aC6O&356g zL@^F+%*{32%-zyfIGGN|$5%Q&*jvR5fV-oQ%+!qIAHq3W;JhBWjeQ|{94jxYj>8dR zBz*=hI-Fec`GJpp6F0DipwJGI`=YgXp=S6i%L7;dLH+r2r-H?bw_|8qwjIxdr%6iF zW?Lik+WMZfWaC78V&f3^STfeEqm?VZM)rAu?7allW^sht4G%)Gg!WJW3~pLZlMP4e zm0Y8zG!mLi4nZoWjn3i><0iAEfQ=&gT@uNNQJXG`OfcIA^1R2EeViE+w-gNEtVOH( znnhxImNW26z9$P4i@VTxs+$P97f?bxBF|BWu}@HV_Vgf3D^1XK&M~Vg&w3?N>kg_E zcHd|L&aEc@PqIy06Tf`0C$1GW&U@JQYt7lS_RS-*bYF zLrYs2DI$sV9Yp&Tn&xRB#X4xU7e+XY&q~;SD^uvJETNlsCcdAhj|ZTIv$$<*AP|AgDq#z;9$)&MyIRZQ{4__yD018qgk+9HA!h9eA5;Bkc z9*8hyXl<_#?lLbd<#Jq#wJrmqF3qaUw{wK!Hv7_H(v`E${bmb}7f6ppXJiQ5iwDki z#|A-nIMk2sU=RKxErM=mjPPPYlmRxfIfl23aM$N2SA5JTJ7zdgH@SY*+vDd3FX$a~ z-$!_|Az`lZ95SIy$c1LYQ3J`F$}z}n#(O7#4Q09!7hg^_l%*I8ZGf@)~&n2oz(;xyHk7pV5EP+mH zlb`75Zj-r+1YAAnz$*nGtPx$uL^5^g6QhsSG>|YWV#Ky3HVeS=02R*BxYS^&3ksN0TqA6UfS}1< z%m^+vI6WqCz|??Mh?-7&duxi@^i(GkcP|NRm#+hf*KrU@5C^U=4)9KLIYX3?#w zVXZoCtW&~FcT)NzH{E1)q4q(QzysvtF|NQ`Uos3*|he_kO@MX`@4yEsh zeO??VK1|uff`u4?SvPsyVy`*CcJ#hM{|bND8o#(X-^b-`0$ZnkfU}#%IdM3(Y@RJY zcDAQ=#v?PknaIL)uT*iik$rUFRibAFxoZ5S-d0*7v-sS5WoLg4h?LDgMVsnf?OfN0 z9cv|+S5uin-PKehYQRp@NVOLW7{Y#?a9caiX#OoSQL{hkbp8Q-zoCG3D*#q-c9*-A zp&M=^RY|y_PBLMHGn8k<24~-7WO-ykjgx?-M%@g_`jd&-C@LLi#l9vD9?mzTh$m9P z=!RS9z=R#u$}v@KV6%~ck|)}(G@!8oPwm>0?XZ-aB^9Je$#I&8jFN0}PC**TXg{UeIwr-rL>910SdrbT2~o#Qo31Gt=Hw%JcVVMD(sQ`b1$+fYExjjVjWOwWXB zD_6#_&U7y_UTv$ko2PAl!9C0uc_~$hLcRtOtbAkZ%NCE=U@n#nkqxJ5UZsi<^FEoE z!ZnZ_teptvutYXt*RMxsfK8od1DvvjmlO@RT7sz)!8uE4HC7ClDEsVXd?+3nZvm;+ z@7kU>F`36N*|JhR)Xv$YSE1KISZ+v9owxaw)Mg7i%4_(6Uhmrha8v4CxN zbpjoZX9tw=bK(ZFMi*mhgb+@hV!5U!reQ-Hp9LvNby}Es>lrUqqhg$hrqJcw4OFpnm65LtCK^y#cgF^}UocsyN%_}zj@p-* zPe9?eGz1SScd|Rl^&qx+A?r^eh$xq++C{aty=^roon!PEHVJo2!8=2XF-`_)=%Xm! zr^awmo)m_LK?^=x9O)KLdEVbznb=p26dsm> zu_#T?#5iwqp{IG@Q=?@Z5&t8~YmePwHWj;^sRhpHIrN5>QctJrYOr)7d@iKCw$$>6 zr>;iE-ntNXCmpJLjUjvi`oORi9d2Tpqq6!b%j>syDKov))s;?r(T%~E^vNRFklR7` zTN#91WPF>WyZMJmf^X{gl_leK22pXNTz$d04qWoR)s%W>Plu;99lY%z1F3=V2L`x) z8uU5`VYIn3h#rg{2Z?yVo_;^|*fY#{di)*XVTWQv3(4)bp=jvgc_OCch(9l-pA+nJ zkUPhk5?Ngj^8)I7x(_e}&0W6XHg@wr3(3ILGC(h0x%FFv; zw-8vBv&WlsPoxHDW;P`0J5W$J!7IB_fkX~@VcHvsv1gLr;(n`^(mo!~wC(8fQ(??W zf%@XF51f`XvIW(y?I5MvG{g9@RoflRa6` ziQB@`7@#TDjOHX$5!X?78S>DGZMFnAL+h!UY)j-*SDFZn+1-Hd@pjX62?cQb zaW9);In<@~p)+h}ut-JoysNGa;cAGB?)te9=k#%8TZS20@3p6w8)*W)3msc&Tg!hQQO0w?5qnQ8w8-~3F;>IhmLC2p`AK-^7)B77+Q_pkv9 zBm4A8@2C#2xHlZ8<JpK`v=TtHt1(*D5J+Oyo^$-5la!{gz1%IT5} zy&!4DySy2|A@iv4EraG3x!VwbZ%+Dl;9`p(I?m|_bP?+=IBd%k)WXcNke2>A2weJm z^}*;6L$L$+9IOCW#IdN%S3S?~4C8j3b{t7OK{`R`9uUE~DGa=KkP?DjLh46LCD3nR zhoL@^%DG$m-bcz~EkwfK#m@jyHaD(d`Y1DSCVqQabD@mg4Tv2pTP?xmT9e+AU~Ut^ z?{;8MZ?r!uFpj*jW@4T`1>51x#Jnuo?-0+#?Ckl73%RY%Bz*c#X5U7)H75i|9C%cX zB$QRk&m2iuM92~bnbl0`P!thD&$-vEAsz>`0|y_>nK$8~y;-Csh;|UDRgXIFQ2nkQGKN3z5TFy(`i)B~ zYN#e9yJ@G*>u1-$a^PRHI8o2Y*5r?wFcusD0P|nxzyiklzivbtI+)x2dZXg^;!M?A z5lQu91m_R>MMy$e*m}W08pt?u8BJOUA_B~vDtFmHvqRjbcXmSC#5Hi%_D%F$O4sBi zm-j1g+1%mgMvyd6LXZ<`7H>g}5X`X8lgHG*Og!22w>`0QRj@nU!aqTfxAp=4y zaxx$=hvT(+Itze5ge-+Vx4`35eB5Jb6ghrimfGQH^z4Spt|1RPXNWnnM$)JrtxI+s$fSq zVbT$YnCZ1}@wy)`p6@~}9f^#ZN|fKDX5GHd0_n`w{tT zlwh=h8Kw(c}9Xh7TT@?Dz z+EN%3EMy#pjFO)dR{84k^pv&RkM3wDwT(xaIMPu9ILp4Rv-F#P;w-lv2vK4f&VgK2 zJZ=>4!=+8*@g{riiDVz39G^QzsU)+=WL`aujm`O7So_&{F4i&LOid?rS>gMSjMJ;( zvSNTM<0g)s^W`qc0u645G~HWQ=11gOhGz~cqvm$g7VGFdjnd6%LS-jMLt`REmWsRr z`hNXW%VRm;BN&#|AyS2ei z!Nc@10a1y2KOsaBzZ27Nym8)t^iigEI3(WOWQcsgu5-Gv3UB#0o$E1I{r7F>A0@es zC}=035X2@T8iW{ap&+%SFS)O^IM<}GY#^+vP5 zb&_3p|H7ksj>i95c+!UV2;dTdOYv@~p>U4mq4C}c{i>eu#?{XYIb0B7qTmOzKJ8FkYfEDPeBl#@&k+I+UYZ%n5w8#JLjRcozDLrs|6U?khS zb+1cYm9rMDbCDRBZ%lvhW{pzfcb<3NATKybZ5x+6AaCJJ)}Xaq%!}llrM*u#W?XKe z>P_2Bnma#T4Mo|Qg+wf1fpDlSNLpl(6lldswqZ{;PibgR7)1{`E{RrAvr7nHPZ`Sy z$vv6+{%lP0G)jjYWA3Q;BIYLn{>*&TZ^B2Cpwl8 zBB4~mTBnb?sLlc38-QP-G*;@J$uhQPB~JQQ5mDD9OftGmq{<6EQ+)=M8k3o@H#7In zNP?9v2zKjJuQT}GfT0ckpi~z@3*L*8*~bZqJM=Yx?5ZH3n7&}!JW~aJ00Y$Y8hVAZ zh!ymxj?spKJq7{elF|*12r-+JeFrNyBmP6 zNi0y8FWeIB8%20pBe8Ea@89AczIk49EbhCwlR#}?DV>W&Qazhxu#^;%3g$@)pWXo5 zm*AbcLfG<6!7F0dMGFWwl{E%1{h);N8w$WD6fpf!AR08UCEL)F9pK2#a_BJ{%`?tL z8SawWwYVK9#hbYtoG7NUBbiy1N5r5I%sYekjW8A+S_wf4`lUS9*MOKr)H9h1fF}SC zFCQuA>!+MNxEyOuimaHD8oXCkNlma|={;LPau22gWxHm9r1b$iEX1l~5M zZOw-0Hwl@q0?F<)SD8sQg1|aTw&rwtjEJ1#O{v{5Hv?;1LoXJz@9wfoc8u~u6j|{1|QePt^7t6(%=h52x_dKzVVU3HXx`$v@4S=l#>sSKn*G__q91hHxdA&=J3?$Czk}m6rv>W`^8~@$g-*l zK3qRt{~k@?%X~%S5t}l)jN{8JP_9fB5HY9v_wKF1RfZQE=RMf~mE2XPK`@khmH-{6 zLyyW(iGyM}Q#tp^00+(m!TjFk+^S6(ThF$*y4RSQNqf2#X@m9}&iV#Z>Ftr=i&b(w zhZ$3{BjekrRS;9}5%pA#TRn-;fki*bQ)jU{I<1nGA`l$s3?tFuhYBhs_8Iu<$uZ!> z&3jS1)+>T=+3NeHgfC+j0C+Qk`=vN-Uml&Kjjh`aj7<(?%cHhwF@GFV1T0Q1v7htF zt>e?feok4C-iF@yP35kH`{_P6LCD#kwYxq=s*6Z$1}F=~J9|U;6G($pz)G<=I>o#& zy1ZUxh^ij;4s06A3FWz=>qdID%zo(@?1W8TSExO>s>yO3M?>K3tI7hM{Ocd)E59=J z`pr;i((zfZas)GX~ZMNxh(#?wf4x?~DPYNv{Mrv54`DZ7z)LDD2I?AufQO>LIOxd-KR zT=U|Kjf(r>Q}Ejy9ktfE;c_Bfsz)KCeoM4A#chBkC$uLS)PvVUqK_t;pDinvGTgN1!te?EKIO41< z++B0W;Z6ymjm+4GW2Yx&=wu0y#LahgbZRE*);ZKz#tk%kGVe+>BD z?~AA5HDm;oFoeTslg{DrgFqHbtPoW&jTlhd zu7Yk97;n{sYdFI&aZ+@Jw-2`sa&=8LiV+;kr&jusBz1bl<;<2BdCFB?X*V$zcrPPc zg_@!znK-RxBwv+S#^_^Q@C^QBX|C)*b>OV9Tnm!=&O&z4I;)r^p^sF=BB~@l;{$Y- zsUH@-A}mn_lMpfxqkL%E!c;M(AX59@d8{B{b-*U5B9?9Y)ZcuNxsz?9t{QUla${i1 z$pgvCanV{YghHvNk@feyOvJOF|Qv=Eu@g&|%d|2tz- z#7_yvbsCC}LAxfE5qcTrMNo=bPH2m*QGos{5J3ZXDb-krvEAr#avgoQm6-20g;h0c zqEMhZrB5knQ;GS^xD~Ar?5-mnIAb5L&yg@GYdfxvDCJn7gp7do7_EASQi1h0DRt0y z150+(uyt+E>)cy;dn<63*oDfR+fSi58pvtC3l6E;lhbEHI4xdsLG%$(y3u1}T5*5r zO>MK3a}KK5KMK`0~hR7i7^C26&&^zs%QsY;%U;Y+V zeL~@B=Z%WGW!P)kmA4YI)ETqPQ`?pYvWaLVbsf8*z&58ay$Y_|ZP*xf13>6gbOWOX)DGJb$YaSwnil$u45_-sR2zxu=#GL&bDQ?&q|OU zaX=dvx$>S+n-X13fJfcVVi6hwT?u)a!`YOOZ*N&QmzQ}AC}_`FCy{5R{megokfKUg zhcA`vjAU6vACz2-WRpT)EX`q2kkXk1@ zoEN8)WSke^C5sJMoQf4USo-Hm-C)9Cccu!{wfbb&9A1U zh!PfOEEJB1c)b?%gd^~y63zabzZ=48ig#@YFrYf4ezRLF#ir_sd_Wj`A8SGLSe=rb%qza(F z3u%`Z{5nUc|8b`Ph+zgdZ@&?8w+rH$H^|MIWY^od-*%o&*ykwas3ky}jLz_ODrlp0 zd@9Zh7K^cpfWrx5Nvb2@=QxR#I}ETQ#!Iy`i$Pl9He5sXs*G26D}u4T*|$$vX(1Kg z&^Xn28LfyyR!l~i{li>PfEn6#6M}fBu?fvv&*5n*#^fx+mRX(ZPGj|!JO!P2dDKML zMLL$xdQC(XLG^a8#`Xju7sTpL=*4mB?xXgVqgcx~Rki>@F;RL@7CAGD&q&=NNrEj@ z>&nPp^1(z*;^9ax?m-sZb%guOv6d|e_nEy%P{ZA=n@Cmec(MKvd^zmW+>y+|W-XLge zV`6S9Vyy4v?C|^LA?0WW*Z@9cAyWkY8is5EtR*)P7Gl)F-pPwPFYsz=2x^fklN~^= zMEe@Y^pSQW#@nA~q!iYHX!c_8Ah+HFZ*)i2S20EYjpnTRN6Bk_*Zz85l_<#q||RYqfsfufI$urc2RI ziI0qe0RiEHxp!uSz_H^I+4W~(vXkomE1CXvEm!y;pH=narEmX_ubvY4dnf)`&IGXBx&+)(^z0K991uf) znAw)W`~G|l=;!05C(5*0osTu+@#35W6&{H}YoOKN65Epcov>#B8!f`m9jkI>24Eo? z)C@=qD4vxX@~CM?8qfwy0q6w;d-tUtK$}mbJKoP2kP1lU+>VfPyVb7=J$=?eB5uAq zQ-Vs|dX%@fdy;_}nyjIo*4#r)fyrTmZ>hLr!}r}I zYfenWk{X@mHAY%#%KOOfXZSIjxq4=^oY)Z|glJwf;<|Q(@T@=Z{tsjC6eZcZa0^zY zZ96M%+qP}nc4nn*+qP}nwr#s}_qn(KJsP9W(~7rvh&AGy-z3HPHb?xDg1jVbCG}Xm zJ$orNx;FL!(*?BTYu?wb?g$6YoreJ8#{Q_4u;sx__GIy&Q!#_*OM))BYehUHuIq5i z$&*kkc5a$#YbkRL#js)I%qe+!NJl7-J4KCHsHYQt>R3iQL85rg7=0JVQd0(~B|agA zhk2+*u1-CWaa($7h6^atG|nuwlvo9PGvP#ZhbKiv@99KP5<*6? z>4K9s$P^4{<+;paH-IW+EBic*pgit$e;hkDTXR7FV~r4zN_s<_3?VF5Th0DsL6!aP)JctA}o;qDLuO{~8f z19H?bc`^fZ)SRq@d#o^Yj>nh$N{0aj?h2t3eif%(i76c;*M>oz{c%SNacvHA;>DTj z!b+LI$UUpuC^u0dE_VKUHEB_WF=4A=>kauUrh51G%yLEcBIJ8q9n&-4+a962hhf)eL=h^<{YC&ICt+u|Me=iJvchuvAm`LV`J|5BD6(^JuJ(lWqScEJNi9q%3WF4# z#L5qIWOe{HZ*~q04{5Coozu0^U%F2IyKEP{pjpF^4<0<9M&-TXCkIyI-5hQf7z9j3 zbn+TM51L4-j`+x1QETso8k=1%%ZOpdi*lBbbdlmz* z8A4pzfq^=hYEY1KZHbKd%OK{Opxy$XE+w7d2wOyt3`nZPYhhAY%*k&J&{?O{6sI&KvgEqnLQEaN9Fkjg zCJp@_v+Cz!6imZpskt{GSb%=HNhMb6>D0;N~an>S~1** zZ^`a^!XJ$exirv!C(NDYia^u#tCc(S~nr&A!(usxg7Uws$al4Tp6I$ z@PNmR9%!c z2L1{N4=NW+1D29gMqKE}A{VSDQ%INudX#`cE?Om0NZ15=^nh_nHHKG6F!g(*2u=%% zw4NEB{!3dJ;`3&HZ7_{tZg!&S&)Z*bQBs_10nI`AT+1Tw0XsDU@&vpr`+UH*OM4@w z_|aaXpFS)8>_qYu^TgzT`RMb1%OG2!j5UV-7%A(1BstFi?${F5vo^Fevj2a^5Ehd) zY!LX6hNl~lD3v{Gn}j+RDQ$%y+a_W*eM7q5FNSI9%q{Yy zJZD^Z5^gD7NS!qhPy71mzgHO;x*fji0pHJ`pK*WLqQ=Rk1Zlwk*e8K}ZG#}In874T z;?{xq)y(Jt?t!USj4S00r%p;f|=|IK3|Y5d9q;a4ahxwn|JW; z=Ss$WZlnZxR*!jkv{%0|FJqrOxf{;+%jAq`QYkLk9dH&}te%#?(`|%>N9VF;%@f)7 zsl3q>gR88t4~84OaWFS1hF>aJp}LJG!dy6PoUa}^Z?}znZwi8=MlWRIumKNh*&8h? zl)MH@;}CZR?|lNBxFWcJOMhf?5{DaU;@NQP`?2{;dqSllHZTFnxLv-|I=|^mE!MW! zqB*@QA~f^`7E)XoDCZydSkGXcNZXv;8r&{~L@g zs$ObfsUUxAsixGRBZ&GE6PB7;{-K;{bSu|Wi8K1Gc0gprvcRvvexW_mL+{T}FDBa9 zw1#R`{@6LRtgfSPQ6^?3y1u~JC1h3UeRo^$^B4D{XnNm()5W>29ZDb>+O5Ky?f!|Q z`zKL#yyY>~@p`>X{d*;l=WRAZMmZNe8(|Ng2WQX#0Vnz9w6SEsB*3*Vn&egxIkfmA z;I*RVJp)eW{npKsFN6l-mI%L#azG{Er3`KwEYgI~b23`tr44txhh=cHdEndz@)jFE z3wh=m;x+?r8*%S_4-o$I7Y~w4@#hPCR`QLX>%9TE31J86E(yYvIP0*ifxUpz9Ki;y zk`@QnxxTI!)S{dg1C>y{aDroy3TF?=b;r#UPqv9F4|n;*q+Nb6h4Ro2ajyXs@;+kN zDEifj%vpV}*kD78ojx;mhH@N3Q5CR4SfONzI(bS)281&L;}n&|V$lSgfRXB=V!6Mb zjl$?!?GZePj-pKL<&SDO1jgiHo{S+ONDA@nbM0Loxcm7m%@^FR&c5OJV_6G?1SS zin8mMRp5+6O8L!IC|%Ydi`JBWAkL1w3>^*@vMt|=E;fy=MBGwHoapGDg+Om`r>E6? z#XJH`&x^=2NX2nSH%ag45EUoDf(FBg9GRb{07i|Uvt#*Z?;{1J{+ed$s#3foJ#=|= z9ez=fWTC-)QY8BB0E%Yynh0oMyOll2Hm4uGg8}m1e~eOy-5Nb?u=q%Y(bYz2&kAo# zTS%g?6@J`0s7zm^p_8?A!~<4KUn?8dOy65N;MQ~&>nh)gqGxbzK!0kViVWdM-|1#k{h(Ci^GaVaLJD%_EnwJlYv-zga$kNh9E(kYt> zAqMI5gfj3)LK!2#ag{9F@-$zBr5W?$GP-Vp)wkElc$lCQCqj7=l?G~SVrVDnnwZe6 z^YP+BK?4@sP8y@_q-eopbJwAK^$X{Q+^3VF3VxGkVfCt~8A|Uyh@);e4P?G|Cw7k3 zk{B%2A^G{<3k|;taqzh4`HOTNGAJsr&X;XZT|3?y_JR}>(EsLJTY$`bw_!KDNd3!PABa1eQa1ja2^BK z^Pv_5Yqd+gTE7cw?=8lV>Dq-xo7WJYhblqNYw%a+Tdhz>U&umX*VyMpz_ZYlB%Xo8 zlp;AX8cqbNo$%d(FpRiDFL{yPU%|vhW;eNu34P5}ck`iHWuW`c@#R@a$lTDwxXTQ} zanB|C)umJqXU@6!1~l49wU{1;8@^f#p`)zPz@z;KBbW<5s)W|w-DNiH)#>! zu3Ew@?uH+l8(Mwm2wO3;(ZA9C(c+}?a{21Pn0?{!^@2v+aK z2)7$`7zb3h7dV?7iQp4V($}WkiVt(R(;7gL9EObZm%1AhzEXu9Shu)v(6O+@1rcg< zds+K03!Qcrd_)NR_XP+x`}=FD_riqR_it}~bE{NkDm+raY(in7NrqsdVX@C}qzBse z_hY{VI%B7<1Sv62ue(i*;&ooqN!MLH7;B)VS$4&zke!-@*emt9+tLw&B=u%ZZp3cS zNmD9SCA3b67VE8u9zj-t#!#Lk!^um8s2L~|zV0u5aw*lBaoC*N*BYd-i#W{1;z0_T ze{_A0%%3i6v|i15;FF{Rzo2-Igm)_8xpqY7rSTAp@E zXLLAjg5Y8gyo1@1a9t8hvS}@YQvU^3pUS7KIpiFho}~zajoIL}oymlKmkV^R5Evm| zkqPtT)f_)j&n9w3H}dnZI>cebCWPf3;=3c}H|*<&n+>|<3%;UjQ-&~fW3BnMZKMd* zpnXQVeO&%*;s`I1=LOCkJIo3Q@h_8a@{Uf= z8bj+ZV`LdP_M^}wu9;}WwrNDIOJDD`VN%}CCylard-aLgyi%>6wtDJH6ES(d!$|FG z;cnhLxGQ_&^}s5-d>U3goFY5f(j%+t-cnk;YNE z%33AV8awpMZnibV2SK6I{LajV!L;Y~wMxj9gQfTO{NYnG1O;GsqbBXYmdw<;^%~b@ z`7R424~p;S4|i`Gns1g`zF!TMIusBl*EiNq7R~T!1gm*ngtA zAqbl9q}uW^wlqA_HQJ*O=&)S&YfdKZkUV(Q0H0_W#Ty)sD3Np5-J%Q-qL zx~8q1f+~te&nVRvN6Ms?p=HW(^VO!dyZ~TVmxFI}Qk?FH|7P#)Cn|ma>q7Al+A2^r z8v03dOA_Ye?XqC^nbjY(Nx zoj0d&C4iK4Ns1j>gSp+vMP8k^hb077_Eu(w#yyHAs@j3md(Pnl^+SjA%eZcn*=&w6 z{prQXz!3D?X`~Cb{@BzxJHf|{nu>c0)t{RUg{?0+nyU4J=;iH|BM+Lx< zNtDms09h;l{C6AvI1Au|GF+q$=t<_UPRyKVv`V{{N(Ru@WM*O6<{d1#kxA zw4@mzDE0_t*a(Yw^#VLc0{RjuM+WuO1&1PH2xgN6N~=g1!%9y>Ne7_j;yYnO&2ep8 zN(TBeaH{kj)3zLiMoi7}2;C9~(0-NDJ+!TB+`*T6>O2;FVWNU7Zb zEL#i0?;|GC9*kWs0>~`KQ+L$#^x9q_;POjscm@4uoy9mn%8y8KD>vpZ6KL(c;TJhV z(*zx>edt^z_Ixfk4fIrz1AC|TdLX!o{&=PB*o{wF^s$suEnbi@TF5E9q!>qGY)B)) z2DdGV#$??`m!K_YEf!ls=ICRPun-a#kg#T^YY(YuLCfAkkAibtU=t!{BFh)c7-Leb z%I6?5v8ilZc*dQY{gSui)|vk+FTIPneBgJ>Q}FJ^OBU6L7=CPM9u+JC(MGq%Yx$1p zr-YfE*UdjQ*w9vwb)M0E{$|*0mQ|`Y&_-{k?(z^}eWKs?%sH*Cy7ZR{h(qGrSHH)2 z4bU-O&Q^KoOge?Qrf?psd5fle*L+L*&?sD$c^n(mt+Hv%Zlu<)=B?$|E_OYTCuqr8 z3niu;@^tD&aTF(@vND5f|7!I>5p0h@XBHe|J zRtjHD^ht~>4QO)PvM+`(hxgt7aP+~wm%&!|%QI;zaT8w)ewog2`h^}6xk z2l)IdcWP?+_x)d92zeZi$+Ks5zrkmV6RNH1MAxD1Lb&s%(Jvq2jVr3z8)-i&fSGxp z(XgMg@zJ?7zUR~3Ay-wNnG`n>RH6@#hh}20Q_+!Qi_een75E1=JUvFCQ6<31{AQ0jRC7(=84%&*E7De)SfK8dTNyguNgx7TzC|bJILA;z|JEt_FrL@)d-LLNZVw>@q96Xh0m1$!& zYnhFp$GY;XM4pRgucdE@s{?x`?Hhw{qiZxauE%w$51pH!8l5;)Z2^x5<3|G50RUo#;FL^@S)>_bf;6%f$Y-2!s{ZQ$g0~9b z06JoZX+aBg1RB*a8^F!k4v%5VQR$Z(DBd-|0oUIS*nO7Y_T#{-)x0o@Ag5&pl2^YD zsDWb-Ibs@F=8u219{XWg>N$qMc!ZZ=+BZmgS4naUa%FvV#Od4|q{KzL+E>TDbGG8z zXGFQ*(Jf}(9PEp8?~VeB<2)S1#{}1qn;f7jz1NVC;1{15$#CbdO}pPwh8*Ecx5t<(4VZ!(kE2v3BGC2R9Mx;T?#Ejp)7q=RUT@=mMji$=4PxnR(4n{5YdAq zVr9B0z0si>*0}+ZPx{FH^%BB7ytYB&^na~6Lxo_P#a;NSoXc!<_H+CIEiqG~=iRS5 zg`~C84MYjWbzH4*kz(-?!hd~-_NZH8#f2sx}0hOI;mZ{@$LtT7Ms>`1^-BE{2W+1l)oC$cS=8RZ<^(9DyF8 z4nY~MU~SgzvA}+;MvZy1X=?{t$FK|0AoxDJ5^_{*Lm}C#9D~EpjGX!Pi3cbwSoA;}?9BbyZ zw`VHPvBwr`hvHI|h$LDsjGb>DvNNc5A6>2Oy7vpBMW`|8XLf=0a!of=%}1_rv#aPi z^iv?&obo^ZdJ$WLx=oIed5ZHTWYRO_5~*@g*POna3Vb3mbhoRDq(yYdd8u%bTzK}+ z{)(f**df-jVmAc~B^V0()1sVz?i4ux7L$q4-v0}E{qvg|V@aQL{AA zMgAb}enj@iUhvY`Os&CVI>TFb#j*8VjqfCqt>MmA=keAt=QP{%hR5r9woW!+i*F<8 z8!h4>UR~#dlLljb-m4&^i(q^_Eo!eP5VUF+4Zo@+ltZN-(#gb>R)6)Yo|36p?>F*?BL0=t0iRz(@q zt)Fp8p|F=k?Z^zL-%^#| zX4&Jq(o^H?4|moSNnB+uw?qn`Xe z!*hFbkyCSME8E2ag`^PfGAYy(B*m5W_zrWj-xLDF?jn_9TaI6^wj%d5iCLuN{j?(iLpJT z{Y=rSS}GQr(`t>vT1**(!N^WB326N%oGb`Ir-V-}RwNNYRV19Ha7aYp6!hHv$58Xf zG)O_?B&ph4^z_PnDw_kVPf>bj8>PkVpQIcV8XV?>dT91iX{*F$+Lp<2SynV0NyZBs zpRGYfDq4e|X?%GZ9da|4#fH?3Po(9Jb~vaE4s&sLYC_Mns6cG* zMr`y29~-YYq>^*#tY8pWdgS>MXhqk{CuHZn=ZYeVst;U$$iv?7TgcoRAR$V5fwG03-3_H61v2LZFV1!deXWFEdEdZNLi zu<=r+8iG>+1LpRxXeIk^0Y#&=3j3aE2M8)+vd@vGq2(Ro_1goVN7}+~AP3+RZn}V0 zKO_BTPk^PI)jiVk_uNQEY2uLd8ER<66#u@_g_T~T|G@<83=a9q`U=$d2!r&AsWv%T zABn*i^g%E>m*dF$%|fEEAWaZNc{ymslJ-kA;-grm7vZiBY)KL|iOu{t)F@Upse{sB z#L+0UQMG_rqGR$;3IjLg_yS5up&%uNc9NZBgDP<;>L4Pbca{$ z4xIY|hkolGB&<_lwNqd9dtYJI&7<@Sp^`>4q)fvOJpLCMHMhBnH)4w~tfmT!nd3Mr z@*SVoC7;(xc$}wfN8nq?*X(DD7xVB28y?OJ^rsA5j`a?B-*EKFFYH}b*qVIo| zUj1_?j3qUNdHiYW_<;Mba$kb~Yl`QGe|I!;b^OnDa8l*m0r4L||wuPIQ#G-9mOyGG#EqOwK}y4AS(`ilYfTEd7exZr$Z zW2Qsk;6VWiInnQWZ+hUJhzQz=x(o|Wm_@r!vaiuRSC?^DgG1n+G4xcdkJQEWMB@D?Yr_+zPBPXO%|`U7o7kW zO4uMg40eg{^*4P(Ih0)xudGP8M5_`bQf{Q<)bYUG5r-f2ZYX#nfXU*)9Df$_1K31} zeo#xlfbnU|x;lduL9>hj%3eo!ACW&n)GWvX)<>|Fr6AQlRhuu40!QTNcP0(7`jqM; zqeQzfIYRmqp14xl?%20sXS=)rkq|HOaAiZ~t+znJ%V7KcnrQSm!<8_8-i};_!VT*h znGjMytsEba4CzV~HF!Kk)_^kb`b|QB0tEd^#SY_?EHzokUPZt%Qb!aE8uRqGB60`W zLT8`@)UMm040J_>JZ%NFe2_d@mZE~4uQUECdJ;0*UX@kKsFoQ)A*22Du$brJyWQbdF#1ZIqvj5bgCYXaACEj7b1Q+yiUaUIC-ZDnvn64&Um8 zl2-3KD^1kCzuIgDaFkPjlGyS2IMrB;*e?%d*4?_&u(CKrj3!PpVB9@`{MH z4Y8KPUb2&Z5h%=ZR=K29D5=BK3Aof_UOt5pEJ6?^1sN$7q-EJoF$0OlBmtK`q(fOT zZzYGCj(J5F+awI}8`=DyxO%H|SAr-5$UIZCnk9%DIbOG7r7d#&jt^Dnb2e=mV^`}U zyxuO{rK$dmW!jx@Mq4dRyFB*M%)Vp8TdjA9s%E};{ELj2I8ZRwci zZkV%T%v~epwQ3i!cmuZbu+XJVH4=PBRpL4WW$GxD7ab$IboGA7Y!-2-_c{jZ7`cDJ z@0a3WDi!1N%`T<~v8JDYbNm$3zm8rJSITo^rj?f+;7=4*q_`*Q$MAsM#A}3?94FSl z*-yOz`5SCdtQe~Gp}Ev}Exb%nAejy2?j2IoaP*5o(oJBGsNR4*P`d1|_~`3GyC{nz zt#g06kkKO+<7(S5jrN95#5>bdfZo*?W?*Buw)xdW4?o~LJiJ|2jyIdp+piW;;T<|C}kA@$1$<`IVq=sX10VEevtr zhC|t&0`R~zWdLww{J-gm7&|Ob@dRcILWFKi6N{ffl@FaQt4sa3JW?@c`th z$q7A-yKbj0y3-z`v$v&xTk1&&;Yg^Js7}c@{J9PDD@UjjbI?jtGP5RaDcxcA&(*Nm zT)A3&#oUAed9%P7{Nu@T^T6F4o!3)rN&0Y%)aXyJ%Ru;44wX9Gbo^%h5rD5oc}Z8` z3?M=~vHY`X5#(P5w%&0rXFL^F3g3uJSE?slsf)Ijw>NezacGScyb;(S|Ai~Gjn-=s(9D{Mfti|66+QlwfPb~=z=NUFqSQq+Idk{Ix zAV?3+d?jWa%Ir#_KGZ45ioNRgxMk>i9|I=ZZTS(qKh{0M?Ce1bgw|AP8+A8oIA2r{ zsx|blaWlU>O>d4&b>ckjSDNr!iibd}SE=e+b!MS)dct+01@?W9d2?B$2~=SH z5*gn~3-`0IK(R&)=ChgOnat!8U*oK?>I;cdDbsj@;_#?*xdHt|RIYrLnz3~v^*N=M zcGCE`?-&?*MnC5()+~4&((lY_-Qw*<8d1+AnLD6T#d`vI8sQY;jMNTx|nnt!tMsD5Q?Ct{Su{e*G<$5Qamn`mOLR&xAPD7}gNUu`t}f4_QOb z{$+;U_~I9|kI_}KD}j*(|MxF^z13+G;iRH?5s-0Vfko=5^l1_0@D}zu9-ca|xCR!- zVQSN|8S#AG$=sTo%jZ2VY85ir^)5L0#+=meofV94cGbLUHA@$)Vsnruz5EkT_E?x1jKB~`ENV@M zm543H?&fWz*vuoAV3iyN>lsaPV|?*;pq_TiXU}L)Lv&FZYh-Zdb_nvX3w4K2jylPX zE~#B{h1fWQu@l+vFK=~0h!|OmH^{y!-_>Q^vvNvVGnIA(v;BDla05jYc2+I~mhk>D|Uh&SE)^4%->uy8ZI5-Ik^{7_N9O3c0mqaEFXyuy4vf5(?h2Da0b2!Od1L^@? zAyV&)VmT8-XA5GY#ya#TzInR`(sj1S*pki`Mu(`xL68rG@yAdkhdB{YC(;I@z9^iv zVyVnngRGIF3FQe*174BI{Kk~Qazo!$wTlVT6{-RK@OQ4g7wd@%a2q7kVFD@xQBGA- zi10etk)SCdG~`&Y&9Gql;(A(oFACeGkfgrADOUSFCSqWoZ2C0(U~sK6oV9ANp$>SF zp6d>`XeT69R24$jcrKYQ%zF6po~~%u&o}%f%J+H?8F0J*8T#WF593W4#wQpL^9|yM zVx+h6&T)(34r)umZZe4XkDpVNblls28{-ArTP6Vg1@Md1Rx4{cUToEXICY$h%{~_B zC^FJKCJ7j&f%Vkzk3NU?Kq485m_dC{_y9tz7syutPx%oIK)7}I!m`MmGjCGJOj&+TxXvJ0j)_M$DbKiE21)G+Q)AeWEtJn#6-@d9XY0G zA$C-zZ#|YX45R#k4jxOl3ND%*3KEIfD#YYcq}Z6@g`Y04;wMWCwfz;pM}{2jCO~&YiNW;IjsBYlxj%^41N!IF&sqz=;UajkcMz>o0(+M;|PgoU$G0IH7yb8_(YUrp@a;(xVQeUFc^^*1pQ#!I2iZ zN#r~lCT2VI7>}PIK14M7tN$2OQ)=-UaQ!}>uroyWfOwEn`#_Y%@IlA!l9$h33s+u) z0bnBxew6<^5{utT#-JXD`A_81Zy*izmA+HXWc*m@C52~BC4yWi zdg$MIjHYb3Ar!VW%KD&W*TOGOZ+W8q>x>r*Gr4-nL7Q-zrn}cpa}n#5JANmgfTRG^ zE_2n*JIYND6#2w2!;drICEwSi^{Z_Zj*xD^xm;`qeAS+;x*QmhCQRpTF_W!_zbsemOyHiF&Q>5*d;aPy z!j(a3@wyq2`nv%_*-_2fKIUvI89#?n2>3smbMv??`~iSSsFHIh+v4k&>T6D)J=d#n zM=u2I!q7va{6IA}C#3U&hMWmxP29_8l{KeJBsbJiM%AtQNQ2sP^o~&2ko&-YEQGu1 zp3uHsFRlYIvc0S`VP)|Gzk${s(c$trW41c1ju$xvH2w4Gn3ckKyR6R%BU}k8$+Eh9TDqJ;wG6-!g9%zF zQ3%!UlWpOOEx3)#L{_JZ(%;kzWPDu3Hl}xsq2<=oNKX3vwd(*8YOB5lWSTC=U)3*u z;mu8_ojzo_Ce?0!hJ)EX@b?oHh}t7)ZBnPS&GrCPkQ&i9$p2ude^yxaEL;^yS%3Ya z8Tna2`ft(vk3GQ5;NMXGf8}QWgQG6JKs^Jg5ia{3JlNVnH$MTQj$5e{Lu)O3832hzl+c`LvIgNDf| ze~Rp*=UcK7iuOox_8g^gCWVYo@)S`Soan~Mj5!ABsL=>u<_2q}>4wRU>_7K4_gw7& zwx#St5eGS~4+yKy4ug*Gwa||fi}$c*HBh-x6T*PoR8RcW^kb<%GH|AdP>REd^8DJh z%fiLIH3y|A9YW)Un6`m6Z6iu{0U9?h$UN1il94rCiMBJ-0KDzesHKkw(8*+bLmAlY zlpz%D_AI3{`ad(v!4BB)SMOUdfHxj7P!Ban@;gFS-RYLQ z2Z*SVlTY^`sBM{!HTV4-1{yc!oIG8)wl{l{*^kcDwKhgV(_dC6JzEEXhr=~q?b9VT zsIPY9UC#EXsT-pZ&$aTjH!}ZR!9SnvaieO|T$ymW{-uFE+rvlQAjM$4t)XTv=%dol zhh$dZQ2d7PI?oFiahg5xYabw%wmBL{@%~6rusq!5oC+mTwaHo-RA^f{@&g^5Z*v_2 zhTd~&b6o<)9B|l}c4m&lrp_SDIu4^b*%P|DB}#T(J-bDwek4EcJn~B(JojuBK()E4 zXJO-8=ombEYf|XQ58rOrZGQng{^xtFzqE>7Wl*or_W)5l{%{|7ONPIM#QPjP@i^<@ zFiD}-PxIJqk!&0nd%i~8bDO|>@A^d#W@qlvNZ%GJd}LF9jRCx2@_cjfyn(8GkSxEV z9(x@k=!E+?++kk*WD*{DJfE?3x?DnW2ck>$i(f(u_33R@$_-0_~!>{XFhdENL z&NJ%>)c#K3OOHyE)zx40xmb5OO2uv(x^$iQqIkn2&cxGz#>9 z(rrr}wUbR`mr}DyB^8Y1A2=TE&SqrvCd+G0EgVv6O)VYLRiv1;aVjS}oG4E%9@@2W zYA2JN+zA$E6pzO{o-Q7KAgK|LXU-kRK_2jHQO_0XB!@e-3MM1BX_k$PYbl@Fr&7x- z88uP^wpH-a4oOpyQ)Rj=q>SzlPYIsTI@LZSUFSg99QN@UP;~h6;`57_`sful7d5Q~ z&(J-+-gLwU<|>PuOp#KjidL$Q*2ae!Phc`w^ab29z|B>5?4|CTAVsFKr+wQuP%!?c|Cc0rej{H+EjY$0N$!gD?3XxC?`jKLH!evp|0HMI0ImlGo;d~ zZ#I}SxZ$F7m}74f>C)9*=PA4D7wA9q3eaWV-Q4F>R_)Gj=w&`jx1n=djUFnyQ0*o4 zm>rojq?{Pf%24!1;YHLaar|Cp;(n|mD}BVTGZ|nyCh~l~t-Yo-{>c>XcbU1S{T8o8 zb6ggRfhXQZM=+m(b->OZ*GFmn&LCQ9a&Nw)v7E^|Fx;A4_m5 z!M@C5+Rvk3%X~9AHpqHSB>z!mNl^tjDb@f-QBh4z zX}|I|QRMA5|A?l@s3_ z^6{Uim!Dcvfo+`t8?e@U6gP@-3eQ5M6y=w&GSnsNN2Mh}QXKt58{fcgpzk#R4EPMH z3=S4=>z@HV{kxNWm7W_NQIlu*>0A@ar!~77MxDvLvb(?3%5>Z$b;#{_dljDtX5T)v zh~bxk4y#yEpU^jtEQZkVKht!%J>%By?oNyJI!@4L^(!`bNG8#PR_IHPHjOT&)j>)f zm3nGWun6MyyMD`YsOMj7`k43XP1~uCA(cvrTaqpZ+4@WJU->j6$O|i~Kg7X?QrV z-yF-T&1+>bC@}%c?)kF^i(cm5yV}pF1tF;LTQAiZ@kB#avF8%Agm{|ijy<`96-{cw z@_C4MAiF(aw3foZ?NrAt+Y>dvE74ukb?pwmRhPLfCn5)jO23G@Og%jvc=W)ZJGT3( z7QwDRmLtaz%&r4s5J^<9w$#_nZh5^ep5}>9(C>Mk8gaetDPK~Lv``}1IG#$a?kp-k zks~^*!&%_8Kd#ZDi5Oi(O>d|63ca{yKF^4PuFh9`y|HC!BVgKtRoew@#(66XA)0++ zD2+h}t2gZ^KX9X;<6TbCE6;B6W2y)9UJ}`^w^PPwUU9RZ^VeMJKJH(})(U5*UR~bD zk{eyE3O}XM_1*oNtr!h)E*`#uZK}cavMk=-y?oMGS%$jc+#LVD zgeU6jjooJkmQzFI`Iyoi+mgVTY=a~PX~q$@d@QX}$Jom7wLR~W4+&@&UH2=*^w~s$ ziQe|pduuN2u-RT%qN5-{@3QKKF}Y5)Dk-2|KFOo#yX-e{SJxzaP0#COJ4m&40;Dv`vb%ri_LHQjF@lvavnYOiG2Ju@l;VDK*xg;UXVWIh~KyW zPIs|cexR`{1j^8&&q?<@BC|t-X8ks35T1=r>gV997Wm1Pd9m!%M14%qB3^D@KJJP5 z@qw=yO}F*8n{sSdRYMrGt^f)u1PM?^*j^eH-8HRar6=s~jj4}M&kR*X@dd@5!tY&P0JkrOBVtpZrD#b=N{e@jZaHRo#NyQ++i$G0bc{&kVzlyR32xZ_(^qp(tcrz2 zmSej@s}awIPw7!!rxCw8nPujeQ6~QK7$&q^e8*}`^N5C%TNu90e#ZJCHdrvxu1{Wc zC6pTpgF!3)b=;GSN>>T~wJpMW=*U>sE{p^@NsqJT|#g*tC0tCw!znS)lTl5ptKGQOE7v zco^Jj6^kiJ>q1Lst$cENh%X^btJ+q`j#(@mg0-hn=33r(Vvwh#HPgZV9XKFv&pOm= zf#+Dvy6BWE1xa?&G#->$dJR0ieoVrVx80KRn12M^UCThbXaAhWo<^z$jxTV6YR^q? z6ABU+znor`4X{cfhOzPl7G82%!wlC^?}#Q(WbZMR2rJ=eOFsgRqP!7ojST(Wq`l=A zJdk?80G(|Cz7I+E;vssFr?mC*A&dYwjSlTW_#Kfz*F@7xnCD_l_2@G6Ymg_Rp5wS) zN`CkbrLJa(Z;+=1cLZ%6v@OnUDDBXe2)ZL&b)!Akx1fM7 zdon=)&OH5V?6^!f)h{dpxd=gVQ0%`8p$f@@sa4R$Nhsx|ukcn~^^avhxP4_X$c45_ zD3WvK6LZTM1q#a}4utj1G;@kJvfKtQU5v>Ypcj2ll+-SuL>fv4kGgu96`RgXOR%g@ zXHXiER>gZ{Gfhicuw8(hh>_5f-pt{Gnq6C*6IXJbnH5oS%F++-DY-@VvCk_R2~c2| z$Sgzo4Ing6)Qo<=*3koS=~%lqM_eW;sVqirt{4TKO<7miq?lJJYG_GmFRwju7Uh*$ zg5wX*Hg>5)0FgAgQrUgo__$O5YV z4dn9z8>DG<_U+pUIa2TPMQ%yxOHeK) zVnT{Q25H#a^s=vkoKOF|1Rwyd=nuuDimhKFu&4*(9fFH~X6qD?8?^Htgdr~WfyBeG zKntP07&|5aqpxg~v!v610r3{>4F>#a7GR{bXdE#jf_o5UjMkuKWX*#^=RnCSev!SQ zB6QCl=BiW@gvk#!+K;AJ5^J82D~y=?LgZak{zo8EE+}`1{&auARX|D>5t>O18PmKj zEw8*ZD6L4`(Jd=CDlc}|&9y7Hs5~EW+-`x>DK57o%sAPLf1CXfhjV2Q)`4OO6fye!kp-E2SD*0(CD zR)&3*mxr3xmhM>50Y)l5Nj9qN|KRMLnnVGDGrG2I+qP}n-n+JK+rDetwr$(Cm7B^# zlDAZ<<`4ALJk0d;IbXiL*m8w3Omp^hi*bRlEljgeHH$qqUv;H2tV<@BuDbczg-oPr zcml9+G|t$pgn)T@Bdkj-*Q!G0lBIA?>5TXpOF&fu@G(_po{G9UE&PQHzI1({n6iOc z*x=5V?};Rk3PZD>Z@i6rIv9Sv}O-_`SQ4r$5jhpX4kqhDBQQP z*ULFWi;qB)Z5we5-kvU8s$!RMoa8S^QfVj9*3lS_Mk zjlqlVIPGh+Rr{2dI(&<-KzK|x_HIyq%|T18+G-PP_R%soaPP1kj7xRLNT1*1wu^IV zjrws1iE^jl^0{SozO4#7=7pI{RKBfhE9Ql(i@1un)i6&H5~6ae=+1@G?szlbqkni+ z_*}-HCI+4X*0oYL!Xi=JPZS+t#zp1t6lw2cS4rXR@*Aj{!67j~W8qdaY@b9FD3@GZ zIt?w=X_|vA2&VVp!VGgbXM$5$n)}=X{V`xBd>DxZb?5Ugl49w!H_1X^R>Y+Y9++uw zm*yFTOI2PWI?0Al?I|t;=^V#_3bgwl zDx;Wg5X%bZT{JphFxml}WDCTT1#u?&)VE@RhdG*)YJmqx=YitwBN%Cp;nq}+L|EE; zD2R{<+FPcZ$Gf8_g@5lkl1Jx&i!;%(tHT5ScsV?mpDXl*@n=@WXXCNVX|nJz;W+6Q zlU)1#LI#gIEE+ALBBl5>By;SK0T#}*toI+ncKgCqfI#WFeATD^YM=G_0fsy<@2hnW2-eS&e`!kK0CcCnV37rZ0_c-mw9_S^D=&aDG>G=MaN(7ZQ&fF?r-hi`=GWeFO$)wwQ|8N8krqQLr5?#MExm?NP(WY()^A%8lq3WQTeH9X zXNPVr5n*gYk5zQq|3>yvdPq-yxc?A@Ygx@C;AeE5o5flRQb<}tPAjLx=W!0biiGi* z4dXhBXWafs$qiVHY-~D#{bi=`RTAxJ-tr^wpsp!mOH)VadjF_IqpF%NkJoazE%HndYfy&1g1BYZNU@eWDc$|-I*vHyQ%y>?kQ+s z(kDQ0W`4T6EAm95zHg7_*+%;i0%sTzuPf9VE`CcYg;>Ynj+&F zh#u#6vOOK7fMiS?j5+2LqlhM2H9QEC{EXkHlao+{whn`3c%3I*RL=M&4wnv-;n zT${o2U?GmSC`^myK!DE&ZvSg=xZ)kt#ecjWF&2|KJ_{<@6_8wz3KxLT7VIhc)9;D2 zWx6C4w}yE2T7MZG>EKQq2DZK)sT4REdq;|UCP~5BQqhu_=35{QK83JIwkZOrXC&F< z_juYuHPbAV3n3J_X56$`>0)YD_n57qiVF-4acq;U*PxZ)FS+|&K{>t zS7V}k;=ja13e_KHiT;bU9#J@;-d<;hSnl7-(5;(gay5R)xLktXT1Uu@@eHGdE>|QNiV?;qdMx)Cxh}idrm(%{HJ3)PX`pJ`dg%@{rSV08VSnR%rr!d zOqLK<@)^8D{WI;u>Z^3_(SbI1EtG25M)6S8A5@jCELOTMaWz!FM61VcMri^htc&YA zf6hl{^6i~@8c~w{_8OVxFm&4$8KOpnOlyqn{wSGz=GNNhAjRK<|E93HQmvtEIghk? zBN6FLPs^jpF$>WF2rsAZH8wiB)T_m!yi32$Ga$_+-GH-gMusGWF!BHy8GMR!(7|hc zTjU|Px38g4aJLEoGlG|2B-m#x+~*W6Q=95fQq{}BeSWo>VB=+{$g0(^YQa9DODjWV z`=I;lmGqwFX?yc0X!nuO&cOotICR|{36FP)H)VdrvP}E&L=wI&%1X}4=ht1;kPfJY zTyA^)K`ei8Ij#9_tKg9hpSewMc(*wV@*(_+Q-Yq%{W>>2&JTc{y@2}<`cPOm&M(V# zcYf0{Ytu_pY4=os+`LsKb7dsDn%ceoZT8kk@lbG91{bI|tJz=|4@P_9X1RXg!^zZG z!+x7ESMP3G=;jJD?Q2wXhcHeA`%>Nuqq^@lN9r^ePAO&1^_IJ>sn%r)^AtTEt^Fkm zW-s`lv0k5dQ+2k@^*hk@`%({QZg5Wnye$Owd`qijKK*{2#6--SFtki^y)*kyU%j30 zxw5q{V#vS2@knzqYF8MLs>Y&%OLLm&AC4Jc{Jb}a${It#QTo|fo54t#uPu7!wj_!! z%7^OjN3=Fmvel8oQX{r7G%!rN8S8d{7^iu?Y!&izo+$kh%~Ph}cb)XDIpOIM6*?JT zcOfU$_jEJrY?=z1R_1G>B9*x7L0p3Bl}xi2KhYlb*f;L&6{>RDgM;EpDg>oTV&%n6 z0|v>XOy)ehL-`)5o`iz#_>6eaYpz9VuLO34-_;7{v?0?BTk4yymeSW}d@T#wmgfC7 z_B2+XhJlz=KP4?KLhp{Xdx9R=&|uOr>$2&hn^8937} z#JH_-kY6Y(bP}OBk=lWvPhj_U`irGnjumqLFM7W4?X-C>9{nV{LrDa))}Ac7dUBc2 z@3+lQa=FHkmR+Ob+0Djh6Te}C>OC>${t3WooP5mGT55&E>Ke$ql~S`F<@6|ql3_i| z)bS@rs}PQjjgjUrUdzU66tZ7$>K7a9si}%)dM9Jg*#r8*?jI?ujLjXPbhMO+_}##5 zA4KW3^5zt2s>;+&XoQ?Wzf#td+9_JAZ_N zgvF0@r^#4U%9S+=S)I5H%#f6P8*QD<0+{=I zA+}q!f~&J>!9(O8HtXvF$F2P7{o0wJ&qO9#uyqeWwZNGbY#L@_v*$F6<~)%_?gH8; zu|IO9;i-i$^QIuJcOj0^ckGs5#kOz6@tP@sw?J0nBK8)pJF^9*GCEtKjmFyF!@nST zttF|uATBwKJ%6^k?nxU5I>oWIs`eopL5&SO-tDjNYa*9(($c_%AKHh55;r++7dhT zq-;JaJQhEe_7ad6Bf?mRB=g)X4DTRf wFiWYZmIFBOCjshloX;js!T)vQ01(>3 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

    ESO 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

    pKz$ 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

    Tg&CWjgg%T|Pu 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

    xer~~uj*v)<^u);_RM>w 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

    AEo%OW4_MCE> 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 I28M(CA0ml"); req.setAttribute("title","SPARQL Query"); req.setAttribute("bodyJsp", "/admin/sparqlquery/sparqlForm.jsp"); @@ -348,31 +363,33 @@ public class SparqlQueryServlet extends BaseEditController { } -protected static class ModelFormatConfig{ - String valueFromForm; - boolean converstionFromWireFormat; - RDFService.ModelSerializationFormat wireFormat; - String jenaResponseFormat; - String responseMimeType; - public ModelFormatConfig( String valueFromForm, - boolean converstionFromWireFormat, - RDFService.ModelSerializationFormat wireFormat, - String jenaResponseFormat, - String responseMimeType){ - this.valueFromForm = valueFromForm; - this.converstionFromWireFormat = converstionFromWireFormat; - this.wireFormat = wireFormat; - this.jenaResponseFormat = jenaResponseFormat; - this.responseMimeType = responseMimeType; + public static class ModelFormatConfig{ + public String valueFromForm; + public boolean converstionFromWireFormat; + public RDFService.ModelSerializationFormat wireFormat; + public String jenaResponseFormat; + public String responseMimeType; + + public ModelFormatConfig( String valueFromForm, + boolean converstionFromWireFormat, + RDFService.ModelSerializationFormat wireFormat, + String jenaResponseFormat, + String responseMimeType){ + this.valueFromForm = valueFromForm; + this.converstionFromWireFormat = converstionFromWireFormat; + this.wireFormat = wireFormat; + this.jenaResponseFormat = jenaResponseFormat; + this.responseMimeType = responseMimeType; + } } -} - protected static class RSFormatConfig{ - String valueFromForm; - boolean converstionFromWireFormat; - ResultFormat wireFormat; - ResultSetFormat jenaResponseFormat; - String responseMimeType; + public static class RSFormatConfig{ + public String valueFromForm; + public boolean converstionFromWireFormat; + public ResultFormat wireFormat; + public ResultSetFormat jenaResponseFormat; + public String responseMimeType; + public RSFormatConfig( String valueFromForm, boolean converstionFromWireFormat, ResultFormat wireFormat, @@ -386,7 +403,7 @@ protected static class ModelFormatConfig{ } } - static{ + static{ /* move the lists of configs into maps for easy lookup */ for( RSFormatConfig rsfc : rsfs ){ rsFormats.put( rsfc.valueFromForm, rsfc ); diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServletTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServletTest.java new file mode 100644 index 000000000..0ea095a69 --- /dev/null +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServletTest.java @@ -0,0 +1,74 @@ +package edu.cornell.mannlib.vitro.webapp.controller; + +import static org.junit.Assert.*; + +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Test; + +import com.github.jsonldjava.core.JSONLD; +import com.github.jsonldjava.core.JSONLDProcessingError; +import com.github.jsonldjava.impl.JenaRDFParser; +import com.github.jsonldjava.utils.JSONUtils; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; + +public class SparqlQueryServletTest { + + @Test + public void testJSONLD() throws JSONLDProcessingError { + //just check if we can use JSONLD-JAVA + + final String turtle = "@prefix const: .\n" + + "@prefix xsd: .\n" + + " const:code \"123\" .\n" + + " const:code \"ABC\"^^xsd:string .\n"; + + final List> expected = new ArrayList>() { + { + add(new LinkedHashMap() { + { + put("@id", "http://localhost:8080/foo1"); + put("http://foo.com/code", new ArrayList() { + { + add(new LinkedHashMap() { + { + put("@value", "123"); + } + }); + } + }); + } + }); + add(new LinkedHashMap() { + { + put("@id", "http://localhost:8080/foo2"); + put("http://foo.com/code", new ArrayList() { + { + add(new LinkedHashMap() { + { + put("@value", "ABC"); + } + }); + } + }); + } + }); + } + }; + + final Model modelResult = ModelFactory.createDefaultModel().read( + new ByteArrayInputStream(turtle.getBytes()), "", "TURTLE"); + final JenaRDFParser parser = new JenaRDFParser(); + final Object json = JSONLD.fromRDF(modelResult, parser); + + assertTrue(JSONUtils.equals(json, expected)); + + + } + +} diff --git a/webapp/web/admin/sparqlquery/sparqlForm.jsp b/webapp/web/admin/sparqlquery/sparqlForm.jsp index 37968697c..35fb67127 100644 --- a/webapp/web/admin/sparqlquery/sparqlForm.jsp +++ b/webapp/web/admin/sparqlquery/sparqlForm.jsp @@ -52,6 +52,7 @@ LIMIT 20

    Format for SELECT query results:

    + @@ -66,23 +67,11 @@ LIMIT 20 +
    -<%-- -

    Notes

    -

    CONSTRUCT and DESCRIBE queries always return RDF XML

    -

    The parameter 'resultFormat' must not be null or zero length

    -

    The parameter 'resultFormat' must be one of the following:

      -
    • RS_XML
    • -
    • RS_TEXT
    • -
    • RS_RDF/N3
    • -
    • RS_JSON
    • -
    • RS_RDF
    • -
    -

    ---%> From 22d7e04573bc181f20b66975472a3642fd5b3545 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Tue, 27 Aug 2013 15:27:16 -0400 Subject: [PATCH 26/46] Odd commit related to licenser. Maybe line ending problems? --- .../revisioninfo/InfoResponseParser.java | 246 +++--- .../revisioninfo/RevisionInfoBuilder.java | 460 +++++----- utilities/licenser/licenser.rb | 822 +++++++++--------- utilities/licenser/licenser_stats.rb | 190 ++-- webapp/config/licenser/licenser.properties | 74 +- 5 files changed, 896 insertions(+), 896 deletions(-) diff --git a/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/InfoResponseParser.java b/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/InfoResponseParser.java index 1f3464046..76816f50b 100644 --- a/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/InfoResponseParser.java +++ b/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/InfoResponseParser.java @@ -1,123 +1,123 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.utilities.revisioninfo; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Parse the response that we got from SVN info. - * - * Not thread-safe. - */ -public class InfoResponseParser { - private static final Pattern URL_PATTERN = Pattern.compile("URL: (\\S+)"); - private static final Pattern ROOT_PATTERN = Pattern - .compile("Repository Root: (\\S+)"); - - private static final String TRUNK_PREFIX = "/trunk"; - private static final String TAGS_PREFIX = "/tags/"; - private static final String BRANCHES_PREFIX = "/branches/"; - - private final String infoResponse; - private String path; - - public InfoResponseParser(String infoResponse) { - this.infoResponse = infoResponse; - } - - public String parse() { - try { - path = figurePath(); - - if (isTrunkPath()) { - return "trunk"; - } else if (isTagPath()) { - return "tag " + getTagName(); - } else if (isBranchPath()) { - return "branch " + getBranchName(); - } else { - return null; - } - } catch (Exception e) { - System.err.println(e); - return null; - } - } - - private String figurePath() throws Exception { - if (infoResponse == null) { - throw new Exception("infoResponse is null."); - } - - String url = getUrlFromResponse(); - String root = getRootFromResponse(); - - if (!url.startsWith(root)) { - throw new Exception("url doesn't start with root."); - } - - return url.substring(root.length()); - } - - private String getUrlFromResponse() throws Exception { - return findNonEmptyMatch(URL_PATTERN, 1); - } - - private String getRootFromResponse() throws Exception { - return findNonEmptyMatch(ROOT_PATTERN, 1); - } - - private String findNonEmptyMatch(Pattern pattern, int groupIndex) - throws Exception { - Matcher matcher = pattern.matcher(infoResponse); - if (!matcher.find()) { - throw new Exception("no match with '" + pattern + "'. Is your Subversion client out of date?"); - } - - String value = matcher.group(groupIndex); - if ((value == null) || (value.isEmpty())) { - throw new Exception("match with '" + pattern + "' is empty."); - } - - return value; - } - - private boolean isTrunkPath() { - return path.startsWith(TRUNK_PREFIX); - } - - private boolean isTagPath() { - return path.startsWith(TAGS_PREFIX); - } - - private String getTagName() { - return getFirstLevel(discardPrefix(path, TAGS_PREFIX)); - } - - private boolean isBranchPath() { - return path.startsWith(BRANCHES_PREFIX); - } - - private String getBranchName() { - return getFirstLevel(discardPrefix(path, BRANCHES_PREFIX)); - } - - private String discardPrefix(String string, String prefix) { - if (string.length() < prefix.length()) { - return ""; - } else { - return string.substring(prefix.length()); - } - } - - private String getFirstLevel(String string) { - int slashHere = string.indexOf('/'); - if (slashHere == -1) { - return string; - } else { - return string.substring(0, slashHere); - } - } - -} +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.utilities.revisioninfo; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Parse the response that we got from SVN info. + * + * Not thread-safe. + */ +public class InfoResponseParser { + private static final Pattern URL_PATTERN = Pattern.compile("URL: (\\S+)"); + private static final Pattern ROOT_PATTERN = Pattern + .compile("Repository Root: (\\S+)"); + + private static final String TRUNK_PREFIX = "/trunk"; + private static final String TAGS_PREFIX = "/tags/"; + private static final String BRANCHES_PREFIX = "/branches/"; + + private final String infoResponse; + private String path; + + public InfoResponseParser(String infoResponse) { + this.infoResponse = infoResponse; + } + + public String parse() { + try { + path = figurePath(); + + if (isTrunkPath()) { + return "trunk"; + } else if (isTagPath()) { + return "tag " + getTagName(); + } else if (isBranchPath()) { + return "branch " + getBranchName(); + } else { + return null; + } + } catch (Exception e) { + System.err.println(e); + return null; + } + } + + private String figurePath() throws Exception { + if (infoResponse == null) { + throw new Exception("infoResponse is null."); + } + + String url = getUrlFromResponse(); + String root = getRootFromResponse(); + + if (!url.startsWith(root)) { + throw new Exception("url doesn't start with root."); + } + + return url.substring(root.length()); + } + + private String getUrlFromResponse() throws Exception { + return findNonEmptyMatch(URL_PATTERN, 1); + } + + private String getRootFromResponse() throws Exception { + return findNonEmptyMatch(ROOT_PATTERN, 1); + } + + private String findNonEmptyMatch(Pattern pattern, int groupIndex) + throws Exception { + Matcher matcher = pattern.matcher(infoResponse); + if (!matcher.find()) { + throw new Exception("no match with '" + pattern + "'. Is your Subversion client out of date?"); + } + + String value = matcher.group(groupIndex); + if ((value == null) || (value.isEmpty())) { + throw new Exception("match with '" + pattern + "' is empty."); + } + + return value; + } + + private boolean isTrunkPath() { + return path.startsWith(TRUNK_PREFIX); + } + + private boolean isTagPath() { + return path.startsWith(TAGS_PREFIX); + } + + private String getTagName() { + return getFirstLevel(discardPrefix(path, TAGS_PREFIX)); + } + + private boolean isBranchPath() { + return path.startsWith(BRANCHES_PREFIX); + } + + private String getBranchName() { + return getFirstLevel(discardPrefix(path, BRANCHES_PREFIX)); + } + + private String discardPrefix(String string, String prefix) { + if (string.length() < prefix.length()) { + return ""; + } else { + return string.substring(prefix.length()); + } + } + + private String getFirstLevel(String string) { + int slashHere = string.indexOf('/'); + if (slashHere == -1) { + return string; + } else { + return string.substring(0, slashHere); + } + } + +} diff --git a/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/RevisionInfoBuilder.java b/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/RevisionInfoBuilder.java index f533b912e..37f1953d9 100644 --- a/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/RevisionInfoBuilder.java +++ b/utilities/buildutils/src/edu/cornell/mannlib/vitro/utilities/revisioninfo/RevisionInfoBuilder.java @@ -1,230 +1,230 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.utilities.revisioninfo; - -import java.io.BufferedReader; -import java.io.EOFException; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Writer; -import java.util.Arrays; -import java.util.List; - -import edu.cornell.mannlib.vitro.utilities.revisioninfo.ProcessRunner.ProcessException; - -/** - * Get release and revision information to display on screen. Put this - * information into a single line and append it to the specified file. - * - * Ask Subversion for the information. If Subversion is available, and if this - * is a working directory, then we can build the info from the responses we get - * from "svn info" and "svnversion". - * - * If that doesn't work, read the information from the "revisionInfo" file in - * the product directory. Presumably, that file was created when the source was - * exported from Subversion. - * - * If that doesn't work either, return something like this: - * "productName ~ unknown ~ unknown" - */ -public class RevisionInfoBuilder { - - /** - * Indicates a problem with the command-line arguments. - */ - private static class UsageException extends Exception { - UsageException(String message) { - super(message); - } - } - - /** - * An object that holds the revision information and a message about how we - * obtained it. - */ - private static class Results { - final String message; - final String infoLine; - - Results(String message, String infoLine) { - this.message = message; - this.infoLine = infoLine; - } - - public String toString() { - return message + ": " + infoLine; - } - } - - private static final String SVN_DIRECTORY_NAME = ".svn"; - private static final String[] SVNVERSION_COMMAND = { "svnversion", "." }; - private static final String[] SVN_INFO_COMMAND = { "svn", "info" }; - private static final String INFO_LINE_DELIMITER = " ~ "; - private static final String REVISION_INFO_FILENAME = "revisionInfo"; - - private final String productName; - private final File productDirectory; - private final File resultFile; - - private Results results; - - public RevisionInfoBuilder(String[] args) throws UsageException { - if (args.length != 3) { - throw new UsageException( - "RevisionInfoBuilder requires 3 arguments, not " - + args.length); - } - - productName = args[0]; - productDirectory = new File(args[1]); - resultFile = new File(args[2]); - - if (!productDirectory.isDirectory()) { - throw new UsageException("Directory '" - + productDirectory.getAbsolutePath() + "' does not exist."); - } - - if (!resultFile.getParentFile().exists()) { - throw new UsageException("Result file '" - + resultFile.getAbsolutePath() - + "' does not exist, and we can't create it " - + "because it's parent directory doesn't exist either."); - } - } - - private void buildInfo() { - results = buildInfoFromSubversion(); - if (results == null) { - results = buildInfoFromFile(); - } - if (results == null) { - results = buildDummyInfo(); - } - } - - private Results buildInfoFromSubversion() { - if (!isThisASubversionWorkspace()) { - System.out.println("Not a Subversion workspace"); - return null; - } - - String release = assembleReleaseNameFromSubversion(); - if (release == null) { - System.out.println("Couldn't get release name from Subversion"); - return null; - } - - String revision = obtainRevisionLevelFromSubversion(); - if (revision == null) { - System.out.println("Couldn't get revision level from Subversion"); - return null; - } - - return new Results("Info from Subversion", buildLine(release, revision)); - } - - private boolean isThisASubversionWorkspace() { - File svnDirectory = new File(productDirectory, SVN_DIRECTORY_NAME); - return svnDirectory.isDirectory(); - } - - private String assembleReleaseNameFromSubversion() { - String infoResponse = runSubProcess(SVN_INFO_COMMAND); - return new InfoResponseParser(infoResponse).parse(); - } - - private String obtainRevisionLevelFromSubversion() { - String response = runSubProcess(SVNVERSION_COMMAND); - return (response == null) ? null : response.trim(); - } - - private String runSubProcess(String[] cmdArray) { - List command = Arrays.asList(cmdArray); - try { - ProcessRunner runner = new ProcessRunner(); - runner.setWorkingDirectory(productDirectory); - - runner.run(command); - - int rc = runner.getReturnCode(); - if (rc != 0) { - throw new ProcessRunner.ProcessException("Return code from " - + command + " was " + rc); - } - - String output = runner.getStdOut(); - // System.err.println(command + " response was '" + output + "'"); - return output; - } catch (ProcessException e) { - return null; - } - } - - private Results buildInfoFromFile() { - try { - File revisionInfoFile = new File(productDirectory, - REVISION_INFO_FILENAME); - BufferedReader reader = new BufferedReader(new FileReader( - revisionInfoFile)); - - String release = reader.readLine(); - if (release == null) { - throw new EOFException("No release line in file."); - } - - String revision = reader.readLine(); - if (revision == null) { - throw new EOFException("No revision line in file."); - } - - return new Results("Info from file", buildLine(release, revision)); - } catch (IOException e) { - System.out.println("No information from file: " + e); - return null; - } - } - - private Results buildDummyInfo() { - String line = buildLine(null, null); - return new Results("Using dummy info", line); - } - - private String buildLine(String release, String revision) { - if (release == null) { - release = "unknown"; - } - if (revision == null) { - revision = "unknown"; - } - return productName + INFO_LINE_DELIMITER + release.trim() - + INFO_LINE_DELIMITER + revision.trim(); - } - - private void writeLine() throws IOException { - Writer writer = null; - writer = new FileWriter(resultFile, true); - writer.write(results.infoLine + "\n"); - writer.close(); - - System.out.println(results); - } - - public static void main(String[] args) { - try { - RevisionInfoBuilder builder = new RevisionInfoBuilder(args); - builder.buildInfo(); - builder.writeLine(); - } catch (UsageException e) { - System.err.println(e); - System.err.println("usage: RevisionInfoBuilder [product_name] " - + "[product_directory] [output_file]"); - System.exit(1); - } catch (Exception e) { - e.printStackTrace(); - System.exit(1); - } - } - -} +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.utilities.revisioninfo; + +import java.io.BufferedReader; +import java.io.EOFException; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.util.Arrays; +import java.util.List; + +import edu.cornell.mannlib.vitro.utilities.revisioninfo.ProcessRunner.ProcessException; + +/** + * Get release and revision information to display on screen. Put this + * information into a single line and append it to the specified file. + * + * Ask Subversion for the information. If Subversion is available, and if this + * is a working directory, then we can build the info from the responses we get + * from "svn info" and "svnversion". + * + * If that doesn't work, read the information from the "revisionInfo" file in + * the product directory. Presumably, that file was created when the source was + * exported from Subversion. + * + * If that doesn't work either, return something like this: + * "productName ~ unknown ~ unknown" + */ +public class RevisionInfoBuilder { + + /** + * Indicates a problem with the command-line arguments. + */ + private static class UsageException extends Exception { + UsageException(String message) { + super(message); + } + } + + /** + * An object that holds the revision information and a message about how we + * obtained it. + */ + private static class Results { + final String message; + final String infoLine; + + Results(String message, String infoLine) { + this.message = message; + this.infoLine = infoLine; + } + + public String toString() { + return message + ": " + infoLine; + } + } + + private static final String SVN_DIRECTORY_NAME = ".svn"; + private static final String[] SVNVERSION_COMMAND = { "svnversion", "." }; + private static final String[] SVN_INFO_COMMAND = { "svn", "info" }; + private static final String INFO_LINE_DELIMITER = " ~ "; + private static final String REVISION_INFO_FILENAME = "revisionInfo"; + + private final String productName; + private final File productDirectory; + private final File resultFile; + + private Results results; + + public RevisionInfoBuilder(String[] args) throws UsageException { + if (args.length != 3) { + throw new UsageException( + "RevisionInfoBuilder requires 3 arguments, not " + + args.length); + } + + productName = args[0]; + productDirectory = new File(args[1]); + resultFile = new File(args[2]); + + if (!productDirectory.isDirectory()) { + throw new UsageException("Directory '" + + productDirectory.getAbsolutePath() + "' does not exist."); + } + + if (!resultFile.getParentFile().exists()) { + throw new UsageException("Result file '" + + resultFile.getAbsolutePath() + + "' does not exist, and we can't create it " + + "because it's parent directory doesn't exist either."); + } + } + + private void buildInfo() { + results = buildInfoFromSubversion(); + if (results == null) { + results = buildInfoFromFile(); + } + if (results == null) { + results = buildDummyInfo(); + } + } + + private Results buildInfoFromSubversion() { + if (!isThisASubversionWorkspace()) { + System.out.println("Not a Subversion workspace"); + return null; + } + + String release = assembleReleaseNameFromSubversion(); + if (release == null) { + System.out.println("Couldn't get release name from Subversion"); + return null; + } + + String revision = obtainRevisionLevelFromSubversion(); + if (revision == null) { + System.out.println("Couldn't get revision level from Subversion"); + return null; + } + + return new Results("Info from Subversion", buildLine(release, revision)); + } + + private boolean isThisASubversionWorkspace() { + File svnDirectory = new File(productDirectory, SVN_DIRECTORY_NAME); + return svnDirectory.isDirectory(); + } + + private String assembleReleaseNameFromSubversion() { + String infoResponse = runSubProcess(SVN_INFO_COMMAND); + return new InfoResponseParser(infoResponse).parse(); + } + + private String obtainRevisionLevelFromSubversion() { + String response = runSubProcess(SVNVERSION_COMMAND); + return (response == null) ? null : response.trim(); + } + + private String runSubProcess(String[] cmdArray) { + List command = Arrays.asList(cmdArray); + try { + ProcessRunner runner = new ProcessRunner(); + runner.setWorkingDirectory(productDirectory); + + runner.run(command); + + int rc = runner.getReturnCode(); + if (rc != 0) { + throw new ProcessRunner.ProcessException("Return code from " + + command + " was " + rc); + } + + String output = runner.getStdOut(); + // System.err.println(command + " response was '" + output + "'"); + return output; + } catch (ProcessException e) { + return null; + } + } + + private Results buildInfoFromFile() { + try { + File revisionInfoFile = new File(productDirectory, + REVISION_INFO_FILENAME); + BufferedReader reader = new BufferedReader(new FileReader( + revisionInfoFile)); + + String release = reader.readLine(); + if (release == null) { + throw new EOFException("No release line in file."); + } + + String revision = reader.readLine(); + if (revision == null) { + throw new EOFException("No revision line in file."); + } + + return new Results("Info from file", buildLine(release, revision)); + } catch (IOException e) { + System.out.println("No information from file: " + e); + return null; + } + } + + private Results buildDummyInfo() { + String line = buildLine(null, null); + return new Results("Using dummy info", line); + } + + private String buildLine(String release, String revision) { + if (release == null) { + release = "unknown"; + } + if (revision == null) { + revision = "unknown"; + } + return productName + INFO_LINE_DELIMITER + release.trim() + + INFO_LINE_DELIMITER + revision.trim(); + } + + private void writeLine() throws IOException { + Writer writer = null; + writer = new FileWriter(resultFile, true); + writer.write(results.infoLine + "\n"); + writer.close(); + + System.out.println(results); + } + + public static void main(String[] args) { + try { + RevisionInfoBuilder builder = new RevisionInfoBuilder(args); + builder.buildInfo(); + builder.writeLine(); + } catch (UsageException e) { + System.err.println(e); + System.err.println("usage: RevisionInfoBuilder [product_name] " + + "[product_directory] [output_file]"); + System.exit(1); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + } + +} diff --git a/utilities/licenser/licenser.rb b/utilities/licenser/licenser.rb index aa939d201..4bcc4ca77 100644 --- a/utilities/licenser/licenser.rb +++ b/utilities/licenser/licenser.rb @@ -1,411 +1,411 @@ -=begin --------------------------------------------------------------------------------- - -Scan the source directory, checking for expected "magic license tags", - or -Copy the source directory, inserting licensing information into the files. - --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -=end -$: << File.dirname(File.expand_path(__FILE__)) -require 'date' -require 'fileutils' -require 'pathname' -require 'property_file_reader' -require 'licenser_stats' - -class Licenser - - MAGIC_STRING = '$This file is distributed under the terms of the license in /doc/license.txt$' - - # ------------------------------------------------------------------------------------ - private - # ------------------------------------------------------------------------------------ - # - # Some paths in the properties file, if they are relative, should be relative to the - # properties file itself. - def relative_to_properties(properties, key) - path = properties[key] - base = File.dirname(properties['properties_file_path']) - - return nil if path == nil - return File.expand_path(path) if Pathname.new(path).absolute? - return File.expand_path(File.join(base, path)) - end - - # Some paths in the properties file, if they are relative, should be relative to the - # source directory. - def relative_to_source(properties, key) - path = properties[key] - base = @source_dir ? @source_dir : '' - - return nil if path == nil - return path if Pathname.new(path).absolute? - return File.expand_path(File.join(base, path)) - end - - # Confirm that the parameters are reasonable. - # - def sanity_checks_on_parameters() - # Check that all necessary properties are here. - raise("Properties file must contain a value for 'scan_only'") if @scan_only_string == nil - raise("Properties file must contain a value for 'source_dir'") if @source_dir == nil - raise("Properties file must contain a value for 'known_exceptions'") if @known_exceptions_file == nil - raise("Properties file must contain a value for 'skip_directories'") if @skip_directories_list == nil - raise("Properties file must contain a value for 'file_matchers'") if @file_match_list == nil - raise("Properties file must contain a value for 'report_level'") if @report_level_string == nil - - if !File.exist?(@source_dir) - raise "Source directory does not exist: #{@source_dir}" - end - - if !File.exist?(@known_exceptions_file) - raise "Known exceptions file does not exist: #{@known_exceptions_file}" - end - - if !@scan_only - raise("Properties file must contain a value for 'target_dir'") if @target_dir == nil - raise("Properties file must contain a value for 'license_file'") if @license_file == nil - - if File.exist?(@target_dir) - raise "Target directory already exists: #{@target_dir}" - end - - target_parent = File.dirname(@target_dir) - if !File.exist?(target_parent) - raise "Path to target directory doesn't exist: #{target_parent}" - end - - if !File.exist?(@license_file) - raise "License file does not exist: #{@license_file}" - end - end - end - - # Prepare the license as an array of lines of text, - # with the current year substituted in for ${year} - # - def prepare_license_text(license_file) - if (license_file == nil) - return [] - end - - year_string = DateTime.now.year.to_s - - text = [] - File.open(license_file) do |file| - file.each do |line| - text << line.gsub('${year}', year_string) - end - end - return text - end - - # The globs in the exceptions file are assumed to be - # relative to the source directory. Make them explicitly so. - # - # Ignore any blank lines or lines that start with a '#' - # - def prepare_exception_globs(exceptions_file, source_dir) - source_path = File.expand_path(source_dir) - globs = [] - File.open(exceptions_file) do |file| - file.each do |line| - glob = line.strip - if (glob.length > 0) && (glob[0..0] != '#') - globs << "#{source_path}/#{glob}".gsub('//', '/') - end - end - end - return globs - end - - # Recursively scan this directory, and copy if we are not scan-only. - # - def scan_dir(source_dir, target_dir) - @stats.enter_directory(source_dir) - - Dir.mkdir(File.expand_path(target_dir, @target_dir)) if !@scan_only - - Dir.foreach(File.join(@source_dir, source_dir)) do |filename| - source_path_relative = File.join(source_dir, filename) - source_path = File.join(@source_dir, source_path_relative) - target_path_relative = File.join(target_dir, filename) - target_path = File.join(@target_dir, target_path_relative) - - # What kind of beast is this? - if filename == '.' || filename == '..' - is_skipped_directory = true - else - if File.directory?(source_path) - if (path_matches_skipped?(source_path_relative)) - is_skipped_directory = true - else - is_directory = true - end - else - if filename_matches_pattern?(filename) - if path_matches_exception?(source_path_relative) - is_exception = true - else - is_match = true - end - else - is_ignored = true - end - end - end - - if is_skipped_directory - # do nothing - elsif is_directory - scan_dir(source_path_relative, target_path_relative) - elsif is_match - if @scan_only - @stats.record_scan_matching(filename) - scan_file(source_path, filename) - else - @stats.record_copy_matching(filename) - copy_file_with_license(source_path, target_path, filename) - end - elsif is_exception - @stats.record_known_exception(filename) - if @scan_only - # do nothing - else - copy_file_without_license(source_path, target_path) - end - else # not a match - if @scan_only - @stats.record_scan_non_matching(filename) - else - @stats.record_copy_non_matching(filename) - copy_file_without_license(source_path, target_path) - end - end - end - end - - # Is this directory one of the skipped? - # - def path_matches_skipped?(relative_path) - @skip_directories.each do |glob| - return true if File.fnmatch(glob, relative_path) - end - return false - end - - # Does this file path match any of the exceptions? - # - def path_matches_exception?(relative_path) - path = File.expand_path(File.join(@source_dir, relative_path)) - @known_exceptions.each do |pattern| - return true if File.fnmatch(pattern, path) - end - return false - end - - # Does this filename match any of the patterns? - # - def filename_matches_pattern?(filename) - @file_matchers.each do |pattern| - return true if File.fnmatch(pattern, filename) - end - return false - end - - # This file would be eligible for licensing if we weren't in scan-only mode. - # - def scan_file(source_path, filename) - found = 0 - File.open(source_path) do |source_file| - source_file.each do |line| - if line.include?(MAGIC_STRING) - found += 1 - end - end - end - - if found == 0 - @stats.record_no_tag(filename, source_path) - elsif found == 1 - @stats.record_tag(filename) - else - raise("File contains #{found} license lines: #{source_path}") - end - end - - # This file matches at least one of the file-matching strings, and does not - # match any exceptions. Replace the magic string with the license text. - # - def copy_file_with_license(source_path, target_path, filename) - found = 0 - File.open(source_path) do |source_file| - File.open(target_path, "w") do |target_file| - source_file.each do |line| - if line.include?(MAGIC_STRING) - found += 1 - insert_license_text(target_file, line) - else - target_file.print line - end - end - end - end - - if found == 0 - @stats.record_no_tag(filename, source_path) - elsif found == 1 - @stats.record_tag(filename) - else - raise("File contains #{found} license lines: #{source_path}") - end - end - - # Figure out the comment characters and write the license text to the file. - # - def insert_license_text(target_file, line) - ends = line.split(MAGIC_STRING) - if ends.size != 2 - raise ("Can't parse this license line: #{line}") - end - - target_file.print "#{ends[0].strip}\n" - - @license_text.each do |text| - target_file.print "#{text.rstrip}\n" - end - - target_file.print "#{ends[1].strip}\n" - end - - # This file either doesn't match any of the file-matching strings, or - # matches an exception - # - def copy_file_without_license(source_path, target_path) - FileUtils.cp(source_path, target_path) - end - - # ------------------------------------------------------------------------------------ - public - # ------------------------------------------------------------------------------------ - - # Setup and get ready to process. - # - # * properties is a map of keys to values, probably parsed from a properties file. - # - def initialize(properties) - @scan_only_string = properties['scan_only'] - @scan_only = 'false' != @scan_only_string - - @file_match_list = properties['file_matchers'] - @skip_directories_list = properties['skip_directories'] - @report_level_string = properties['report_level'] - - # These properties contain paths, and if they are relative paths, they - # should be relative to the properties file itself. - @source_dir = relative_to_properties(properties, 'source_dir') - @target_dir = relative_to_properties(properties, 'target_dir') - - # These properties contain paths, and if they are relative paths, they - # should be relative to the source_directory. - @license_file = relative_to_source(properties, 'license_file') - @known_exceptions_file = relative_to_source(properties, 'known_exceptions') - - sanity_checks_on_parameters() - - @full_report = @report_level_string === 'full' - @short_report = @report_level_string === 'short' - @file_matchers = @file_match_list.strip.split(/,\s*/) - @skip_directories = @skip_directories_list.strip.split(/,\s*/) - @license_text = prepare_license_text(@license_file) - @known_exceptions = prepare_exception_globs(@known_exceptions_file, @source_dir) - - @stats = LicenserStats.new(@source_dir, @file_matchers, @full_report) - end - - # Start the recursive scanning (and copying). - def process() - scan_dir('.', '.') - end - - # Report the summary statistics - def report(properties) - verb = @scan_only ? "scanned" : "copied" - if (@short_report) - subs = 0 - @stats.substitutions.each {|line| subs += line[1] } - known = 0 - @stats.known_exceptions.each {|line| known += line[1] } - missing = 0 - @stats.missing_tags.each {|line| missing += line[1] } - - puts "Licenser: #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." - printf(" Substitutions: %5d\n", subs) - printf(" Known exceptions: %5d\n", known) - printf(" Missing tags: %5d\n", missing) - else - puts "Licenser: run completed at #{DateTime.now.strftime("%H:%M:%S on %b %d, %Y")}" - puts " #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." - puts - puts 'Substitutions' - @stats.substitutions.sort.each do |line| - printf("%5d %s\n", line[1], line[0]) - end - puts - puts 'Known non-licensed files' - @stats.known_exceptions.sort.each do |line| - printf("%5d %s\n", line[1], line[0]) - end - puts - puts 'Missing tags' - @stats.missing_tags.sort.each do |line| - printf("%5d %s\n", line[1], line[0]) - end - puts - puts 'properties:' - properties.each do |key, value| - puts " #{key} = #{value}" - end - end - end - - # Were we successful or not? - def success? - return @stats.missing_tags.empty? - end -end - -# -# -# ------------------------------------------------------------------------------------ -# Standalone calling. -# -# Do this if this program was called from the command line. That is, if the command -# expands to the path of this file. -# ------------------------------------------------------------------------------------ -# - -if File.expand_path($0) == File.expand_path(__FILE__) - if ARGV.length == 0 - raise("No arguments - usage is: ruby licenser.rb ") - end - if !File.file?(ARGV[0]) - raise "File does not exist: '#{ARGV[0]}'." - end - - properties = PropertyFileReader.read(ARGV[0]) - - l = Licenser.new(properties) - l.process - l.report(properties) - - if l.success? - puts "Licenser was successful." - exit 0 - else - puts "Licenser found problems." - exit 1 - end -end +=begin +-------------------------------------------------------------------------------- + +Scan the source directory, checking for expected "magic license tags", + or +Copy the source directory, inserting licensing information into the files. + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +=end +$: << File.dirname(File.expand_path(__FILE__)) +require 'date' +require 'fileutils' +require 'pathname' +require 'property_file_reader' +require 'licenser_stats' + +class Licenser + + MAGIC_STRING = '$This file is distributed under the terms of the license in /doc/license.txt$' + + # ------------------------------------------------------------------------------------ + private + # ------------------------------------------------------------------------------------ + # + # Some paths in the properties file, if they are relative, should be relative to the + # properties file itself. + def relative_to_properties(properties, key) + path = properties[key] + base = File.dirname(properties['properties_file_path']) + + return nil if path == nil + return File.expand_path(path) if Pathname.new(path).absolute? + return File.expand_path(File.join(base, path)) + end + + # Some paths in the properties file, if they are relative, should be relative to the + # source directory. + def relative_to_source(properties, key) + path = properties[key] + base = @source_dir ? @source_dir : '' + + return nil if path == nil + return path if Pathname.new(path).absolute? + return File.expand_path(File.join(base, path)) + end + + # Confirm that the parameters are reasonable. + # + def sanity_checks_on_parameters() + # Check that all necessary properties are here. + raise("Properties file must contain a value for 'scan_only'") if @scan_only_string == nil + raise("Properties file must contain a value for 'source_dir'") if @source_dir == nil + raise("Properties file must contain a value for 'known_exceptions'") if @known_exceptions_file == nil + raise("Properties file must contain a value for 'skip_directories'") if @skip_directories_list == nil + raise("Properties file must contain a value for 'file_matchers'") if @file_match_list == nil + raise("Properties file must contain a value for 'report_level'") if @report_level_string == nil + + if !File.exist?(@source_dir) + raise "Source directory does not exist: #{@source_dir}" + end + + if !File.exist?(@known_exceptions_file) + raise "Known exceptions file does not exist: #{@known_exceptions_file}" + end + + if !@scan_only + raise("Properties file must contain a value for 'target_dir'") if @target_dir == nil + raise("Properties file must contain a value for 'license_file'") if @license_file == nil + + if File.exist?(@target_dir) + raise "Target directory already exists: #{@target_dir}" + end + + target_parent = File.dirname(@target_dir) + if !File.exist?(target_parent) + raise "Path to target directory doesn't exist: #{target_parent}" + end + + if !File.exist?(@license_file) + raise "License file does not exist: #{@license_file}" + end + end + end + + # Prepare the license as an array of lines of text, + # with the current year substituted in for ${year} + # + def prepare_license_text(license_file) + if (license_file == nil) + return [] + end + + year_string = DateTime.now.year.to_s + + text = [] + File.open(license_file) do |file| + file.each do |line| + text << line.gsub('${year}', year_string) + end + end + return text + end + + # The globs in the exceptions file are assumed to be + # relative to the source directory. Make them explicitly so. + # + # Ignore any blank lines or lines that start with a '#' + # + def prepare_exception_globs(exceptions_file, source_dir) + source_path = File.expand_path(source_dir) + globs = [] + File.open(exceptions_file) do |file| + file.each do |line| + glob = line.strip + if (glob.length > 0) && (glob[0..0] != '#') + globs << "#{source_path}/#{glob}".gsub('//', '/') + end + end + end + return globs + end + + # Recursively scan this directory, and copy if we are not scan-only. + # + def scan_dir(source_dir, target_dir) + @stats.enter_directory(source_dir) + + Dir.mkdir(File.expand_path(target_dir, @target_dir)) if !@scan_only + + Dir.foreach(File.join(@source_dir, source_dir)) do |filename| + source_path_relative = File.join(source_dir, filename) + source_path = File.join(@source_dir, source_path_relative) + target_path_relative = File.join(target_dir, filename) + target_path = File.join(@target_dir, target_path_relative) + + # What kind of beast is this? + if filename == '.' || filename == '..' + is_skipped_directory = true + else + if File.directory?(source_path) + if (path_matches_skipped?(source_path_relative)) + is_skipped_directory = true + else + is_directory = true + end + else + if filename_matches_pattern?(filename) + if path_matches_exception?(source_path_relative) + is_exception = true + else + is_match = true + end + else + is_ignored = true + end + end + end + + if is_skipped_directory + # do nothing + elsif is_directory + scan_dir(source_path_relative, target_path_relative) + elsif is_match + if @scan_only + @stats.record_scan_matching(filename) + scan_file(source_path, filename) + else + @stats.record_copy_matching(filename) + copy_file_with_license(source_path, target_path, filename) + end + elsif is_exception + @stats.record_known_exception(filename) + if @scan_only + # do nothing + else + copy_file_without_license(source_path, target_path) + end + else # not a match + if @scan_only + @stats.record_scan_non_matching(filename) + else + @stats.record_copy_non_matching(filename) + copy_file_without_license(source_path, target_path) + end + end + end + end + + # Is this directory one of the skipped? + # + def path_matches_skipped?(relative_path) + @skip_directories.each do |glob| + return true if File.fnmatch(glob, relative_path) + end + return false + end + + # Does this file path match any of the exceptions? + # + def path_matches_exception?(relative_path) + path = File.expand_path(File.join(@source_dir, relative_path)) + @known_exceptions.each do |pattern| + return true if File.fnmatch(pattern, path) + end + return false + end + + # Does this filename match any of the patterns? + # + def filename_matches_pattern?(filename) + @file_matchers.each do |pattern| + return true if File.fnmatch(pattern, filename) + end + return false + end + + # This file would be eligible for licensing if we weren't in scan-only mode. + # + def scan_file(source_path, filename) + found = 0 + File.open(source_path) do |source_file| + source_file.each do |line| + if line.include?(MAGIC_STRING) + found += 1 + end + end + end + + if found == 0 + @stats.record_no_tag(filename, source_path) + elsif found == 1 + @stats.record_tag(filename) + else + raise("File contains #{found} license lines: #{source_path}") + end + end + + # This file matches at least one of the file-matching strings, and does not + # match any exceptions. Replace the magic string with the license text. + # + def copy_file_with_license(source_path, target_path, filename) + found = 0 + File.open(source_path) do |source_file| + File.open(target_path, "w") do |target_file| + source_file.each do |line| + if line.include?(MAGIC_STRING) + found += 1 + insert_license_text(target_file, line) + else + target_file.print line + end + end + end + end + + if found == 0 + @stats.record_no_tag(filename, source_path) + elsif found == 1 + @stats.record_tag(filename) + else + raise("File contains #{found} license lines: #{source_path}") + end + end + + # Figure out the comment characters and write the license text to the file. + # + def insert_license_text(target_file, line) + ends = line.split(MAGIC_STRING) + if ends.size != 2 + raise ("Can't parse this license line: #{line}") + end + + target_file.print "#{ends[0].strip}\n" + + @license_text.each do |text| + target_file.print "#{text.rstrip}\n" + end + + target_file.print "#{ends[1].strip}\n" + end + + # This file either doesn't match any of the file-matching strings, or + # matches an exception + # + def copy_file_without_license(source_path, target_path) + FileUtils.cp(source_path, target_path) + end + + # ------------------------------------------------------------------------------------ + public + # ------------------------------------------------------------------------------------ + + # Setup and get ready to process. + # + # * properties is a map of keys to values, probably parsed from a properties file. + # + def initialize(properties) + @scan_only_string = properties['scan_only'] + @scan_only = 'false' != @scan_only_string + + @file_match_list = properties['file_matchers'] + @skip_directories_list = properties['skip_directories'] + @report_level_string = properties['report_level'] + + # These properties contain paths, and if they are relative paths, they + # should be relative to the properties file itself. + @source_dir = relative_to_properties(properties, 'source_dir') + @target_dir = relative_to_properties(properties, 'target_dir') + + # These properties contain paths, and if they are relative paths, they + # should be relative to the source_directory. + @license_file = relative_to_source(properties, 'license_file') + @known_exceptions_file = relative_to_source(properties, 'known_exceptions') + + sanity_checks_on_parameters() + + @full_report = @report_level_string === 'full' + @short_report = @report_level_string === 'short' + @file_matchers = @file_match_list.strip.split(/,\s*/) + @skip_directories = @skip_directories_list.strip.split(/,\s*/) + @license_text = prepare_license_text(@license_file) + @known_exceptions = prepare_exception_globs(@known_exceptions_file, @source_dir) + + @stats = LicenserStats.new(@source_dir, @file_matchers, @full_report) + end + + # Start the recursive scanning (and copying). + def process() + scan_dir('.', '.') + end + + # Report the summary statistics + def report(properties) + verb = @scan_only ? "scanned" : "copied" + if (@short_report) + subs = 0 + @stats.substitutions.each {|line| subs += line[1] } + known = 0 + @stats.known_exceptions.each {|line| known += line[1] } + missing = 0 + @stats.missing_tags.each {|line| missing += line[1] } + + puts "Licenser: #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." + printf(" Substitutions: %5d\n", subs) + printf(" Known exceptions: %5d\n", known) + printf(" Missing tags: %5d\n", missing) + else + puts "Licenser: run completed at #{DateTime.now.strftime("%H:%M:%S on %b %d, %Y")}" + puts " #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." + puts + puts 'Substitutions' + @stats.substitutions.sort.each do |line| + printf("%5d %s\n", line[1], line[0]) + end + puts + puts 'Known non-licensed files' + @stats.known_exceptions.sort.each do |line| + printf("%5d %s\n", line[1], line[0]) + end + puts + puts 'Missing tags' + @stats.missing_tags.sort.each do |line| + printf("%5d %s\n", line[1], line[0]) + end + puts + puts 'properties:' + properties.each do |key, value| + puts " #{key} = #{value}" + end + end + end + + # Were we successful or not? + def success? + return @stats.missing_tags.empty? + end +end + +# +# +# ------------------------------------------------------------------------------------ +# Standalone calling. +# +# Do this if this program was called from the command line. That is, if the command +# expands to the path of this file. +# ------------------------------------------------------------------------------------ +# + +if File.expand_path($0) == File.expand_path(__FILE__) + if ARGV.length == 0 + raise("No arguments - usage is: ruby licenser.rb ") + end + if !File.file?(ARGV[0]) + raise "File does not exist: '#{ARGV[0]}'." + end + + properties = PropertyFileReader.read(ARGV[0]) + + l = Licenser.new(properties) + l.process + l.report(properties) + + if l.success? + puts "Licenser was successful." + exit 0 + else + puts "Licenser found problems." + exit 1 + end +end diff --git a/utilities/licenser/licenser_stats.rb b/utilities/licenser/licenser_stats.rb index cac01b42a..c2b1a259f 100644 --- a/utilities/licenser/licenser_stats.rb +++ b/utilities/licenser/licenser_stats.rb @@ -1,95 +1,95 @@ -=begin --------------------------------------------------------------------------------- - -Collect the statistics of a licenser run. - --------------------------------------------------------------------------------- -=end - -class LicenserStats - attr_reader :substitutions - attr_reader :missing_tags - attr_reader :known_exceptions - attr_reader :file_count - attr_reader :dir_count - - # ------------------------------------------------------------------------------------ - private - # ------------------------------------------------------------------------------------ - # - def which_match(filename) - @file_matchers.each do |matcher| - return matcher if File.fnmatch(matcher, filename) - end - raise("filename matches no matchers!: #{filename}") - end - - # ------------------------------------------------------------------------------------ - public - # ------------------------------------------------------------------------------------ - - def initialize(root_dir, file_matchers, full) - @root_dir = "#{root_dir}/".gsub('//', '/') - @file_matchers = file_matchers - @full = full - - # keep track of how many substitutions for all file types - @substitutions = Hash.new() - file_matchers.each do |matcher| - @substitutions[matcher] = 0 - end - - # keep track of missing tags, only in file types that have missing tags - @missing_tags = Hash.new(0) - - # keep track of how many known non-licensed files we encounter, and what types. - @known_exceptions = Hash.new(0) - - # keep track of how many files are copied - @file_count = 0 - - #keep track of how many directories are copied - @dir_count = 0 - end - - def enter_directory(path) - @dir_count += 1 - puts "Entering directory: #{path}" if @full - end - - def record_scan_non_matching(filename) - @file_count += 1 - puts " Scan without mods: #{filename}" if @full - end - - def record_copy_non_matching(filename) - @file_count += 1 - puts " Copy without mods: #{filename}" if @full - end - - def record_scan_matching(filename) - @file_count += 1 - puts " Scan with mods: #{filename}" if @full - end - - def record_copy_matching(filename) - @file_count += 1 - puts " Copy with mods: #{filename}" if @full - end - - def record_known_exception(filename) - @file_count += 1 - puts " Known exception: #{filename}" if @full - @known_exceptions[which_match(filename)] += 1 - end - - def record_tag(filename) - puts " Substituted license text into #{filename}" if @full - @substitutions[which_match(filename)] += 1 - end - - def record_no_tag(filename, source_path) - puts "ERROR: Found no license tag in #{source_path.sub(@root_dir, '')}" - @missing_tags[which_match(filename)] += 1 - end -end +=begin +-------------------------------------------------------------------------------- + +Collect the statistics of a licenser run. + +-------------------------------------------------------------------------------- +=end + +class LicenserStats + attr_reader :substitutions + attr_reader :missing_tags + attr_reader :known_exceptions + attr_reader :file_count + attr_reader :dir_count + + # ------------------------------------------------------------------------------------ + private + # ------------------------------------------------------------------------------------ + # + def which_match(filename) + @file_matchers.each do |matcher| + return matcher if File.fnmatch(matcher, filename) + end + raise("filename matches no matchers!: #{filename}") + end + + # ------------------------------------------------------------------------------------ + public + # ------------------------------------------------------------------------------------ + + def initialize(root_dir, file_matchers, full) + @root_dir = "#{root_dir}/".gsub('//', '/') + @file_matchers = file_matchers + @full = full + + # keep track of how many substitutions for all file types + @substitutions = Hash.new() + file_matchers.each do |matcher| + @substitutions[matcher] = 0 + end + + # keep track of missing tags, only in file types that have missing tags + @missing_tags = Hash.new(0) + + # keep track of how many known non-licensed files we encounter, and what types. + @known_exceptions = Hash.new(0) + + # keep track of how many files are copied + @file_count = 0 + + #keep track of how many directories are copied + @dir_count = 0 + end + + def enter_directory(path) + @dir_count += 1 + puts "Entering directory: #{path}" if @full + end + + def record_scan_non_matching(filename) + @file_count += 1 + puts " Scan without mods: #{filename}" if @full + end + + def record_copy_non_matching(filename) + @file_count += 1 + puts " Copy without mods: #{filename}" if @full + end + + def record_scan_matching(filename) + @file_count += 1 + puts " Scan with mods: #{filename}" if @full + end + + def record_copy_matching(filename) + @file_count += 1 + puts " Copy with mods: #{filename}" if @full + end + + def record_known_exception(filename) + @file_count += 1 + puts " Known exception: #{filename}" if @full + @known_exceptions[which_match(filename)] += 1 + end + + def record_tag(filename) + puts " Substituted license text into #{filename}" if @full + @substitutions[which_match(filename)] += 1 + end + + def record_no_tag(filename, source_path) + puts "ERROR: Found no license tag in #{source_path.sub(@root_dir, '')}" + @missing_tags[which_match(filename)] += 1 + end +end diff --git a/webapp/config/licenser/licenser.properties b/webapp/config/licenser/licenser.properties index 7d98dd3cd..5582ecbda 100644 --- a/webapp/config/licenser/licenser.properties +++ b/webapp/config/licenser/licenser.properties @@ -1,37 +1,37 @@ -# -------------------------------------------------------------------------- -# Properties for running the licenser utility in Vitro core. -# -------------------------------------------------------------------------- - -# The path to the top level directory to be scanned or copied -# (if relative, then relative to this file) -source_dir = ../../../ - -# The path to the top level directory to copy into (ignored if only scanning) -# (if relative, then relative to this file) -target_dir = - -# A list of filename globs that match the files we want to license, -# delimited by commas with optional white-space. -file_matchers = *.java, *.jsp, *.tld, *.xsl, *.xslt, *.css, *.js, *.ftl, *.xml - -# "globs" that describe paths that we won't follow for scanning OR FOR COPYING. -# (relative to the source_dir) -skip_directories = ./bin, ./.svn, ./**/.svn, ./webapp/.build - -# The path to a file containing filename/path globs that match the files that -# we know should have no license tags in them. -# The file contains one glob per line; blank lines and comments ("#") are ignored. -# (if relative, then relative to the source directory) -known_exceptions = webapp/config/licenser/known_exceptions.txt - -# The path to the text of the license agreement (ignored if only scanning) -# If the agreement contains a ${year} token, the current year will be substituted. -# (if relative, then relative to the source directory) -license_file = doc/license.txt - -# Set to 'full' for a full report, 'short' for a brief statment, or to anything -# else for a medium-length summary. -report_level = short - -# if true, we are just scanning, not copying. -scan_only = true +# -------------------------------------------------------------------------- +# Properties for running the licenser utility in Vitro core. +# -------------------------------------------------------------------------- + +# The path to the top level directory to be scanned or copied +# (if relative, then relative to this file) +source_dir = ../../../ + +# The path to the top level directory to copy into (ignored if only scanning) +# (if relative, then relative to this file) +target_dir = + +# A list of filename globs that match the files we want to license, +# delimited by commas with optional white-space. +file_matchers = *.java, *.jsp, *.tld, *.xsl, *.xslt, *.css, *.js, *.ftl, *.xml + +# "globs" that describe paths that we won't follow for scanning OR FOR COPYING. +# (relative to the source_dir) +skip_directories = ./bin, ./.svn, ./**/.svn, ./webapp/.build + +# The path to a file containing filename/path globs that match the files that +# we know should have no license tags in them. +# The file contains one glob per line; blank lines and comments ("#") are ignored. +# (if relative, then relative to the source directory) +known_exceptions = webapp/config/licenser/known_exceptions.txt + +# The path to the text of the license agreement (ignored if only scanning) +# If the agreement contains a ${year} token, the current year will be substituted. +# (if relative, then relative to the source directory) +license_file = doc/license.txt + +# Set to 'full' for a full report, 'short' for a brief statment, or to anything +# else for a medium-length summary. +report_level = short + +# if true, we are just scanning, not copying. +scan_only = true From d69bb824ac70d34adc4fef3d4c7a78bb26cf50f8 Mon Sep 17 00:00:00 2001 From: j2blake Date: Tue, 27 Aug 2013 17:26:24 -0400 Subject: [PATCH 27/46] VIVO-274 move permission_config.n3 to rdf/auth/everytime Get rid of the PermissionSetsLoader, keep the smoke tests. --- .../auth/everytime}/permission_config.n3 | 0 .../auth/permissions/PermissionSets.java | 20 + .../permissions/PermissionSetsLoader.java | 355 ------------------ .../permissions/PermissionSetsSmokeTest.java | 124 ++++++ .../vitro/webapp/beans/BaseResourceBean.java | 10 +- .../UserAccountsFirstTimeExternalPage.java | 4 +- .../webapp/servlet/setup/UserModelSetup.java | 12 +- .../authenticate/ProgramLoginTest.java | 4 +- .../controller/edit/AuthenticateTest.java | 4 +- .../WEB-INF/resources/startup_listeners.txt | 2 +- 10 files changed, 163 insertions(+), 372 deletions(-) rename webapp/{web/WEB-INF/resources => rdf/auth/everytime}/permission_config.n3 (100%) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSets.java delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsLoader.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsSmokeTest.java diff --git a/webapp/web/WEB-INF/resources/permission_config.n3 b/webapp/rdf/auth/everytime/permission_config.n3 similarity index 100% rename from webapp/web/WEB-INF/resources/permission_config.n3 rename to webapp/rdf/auth/everytime/permission_config.n3 diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSets.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSets.java new file mode 100644 index 000000000..f5931c7df --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSets.java @@ -0,0 +1,20 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.permissions; + +import static edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary.VITRO_AUTH; + +/** + * Constants and static methods to help manipulate PermissionSet instances. + */ +public class PermissionSets { + public static final String URI_SELF_EDITOR = VITRO_AUTH + "SELF_EDITOR"; + public static final String URI_EDITOR = VITRO_AUTH + "EDITOR"; + public static final String URI_CURATOR = VITRO_AUTH + "CURATOR"; + public static final String URI_DBA = VITRO_AUTH + "ADMIN"; + + /** No need to create an instance. */ + private PermissionSets() { + // Nothing to initialize. + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsLoader.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsLoader.java deleted file mode 100644 index cb2598e6f..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsLoader.java +++ /dev/null @@ -1,355 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.auth.permissions; - -import static edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary.VITRO_AUTH; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.hp.hpl.jena.ontology.OntModel; -import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.rdf.model.ModelFactory; -import com.hp.hpl.jena.rdf.model.Property; -import com.hp.hpl.jena.rdf.model.Resource; -import com.hp.hpl.jena.rdf.model.Selector; -import com.hp.hpl.jena.rdf.model.SimpleSelector; -import com.hp.hpl.jena.rdf.model.Statement; -import com.hp.hpl.jena.rdf.model.StmtIterator; -import com.hp.hpl.jena.shared.Lock; -import com.hp.hpl.jena.util.iterator.ClosableIterator; -import com.hp.hpl.jena.vocabulary.RDF; -import com.hp.hpl.jena.vocabulary.RDFS; - -import edu.cornell.mannlib.vitro.webapp.beans.PermissionSet; -import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; -import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; -import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao; -import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; -import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; -import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; - -/** - * Load the initial configuration of PermissionSets and Permissions. - * - * The UserAccounts model must be created before this runs. - * - * The PermissionRegistry must be created before this runs. - */ -public class PermissionSetsLoader implements ServletContextListener { - private static final Log log = LogFactory - .getLog(PermissionSetsLoader.class); - - public static final String FILE_OF_PERMISSION_SETS_INFO = "/WEB-INF/resources/permission_config.n3"; - - public static final String URI_SELF_EDITOR = VITRO_AUTH + "SELF_EDITOR"; - public static final String URI_EDITOR = VITRO_AUTH + "EDITOR"; - public static final String URI_CURATOR = VITRO_AUTH + "CURATOR"; - public static final String URI_DBA = VITRO_AUTH + "ADMIN"; - - @Override - public void contextInitialized(ServletContextEvent sce) { - ServletContext ctx = sce.getServletContext(); - StartupStatus ss = StartupStatus.getBean(ctx); - - try { - new Loader(this, ctx, ss).load(); - new SmokeTester(this, ctx, ss).test(); - } catch (Exception e) { - ss.fatal(this, "Failed to load the PermissionSets", e); - } - } - - @Override - public void contextDestroyed(ServletContextEvent sce) { - // Nothing to tear down. - } - - // ---------------------------------------------------------------------- - // Loader class - // ---------------------------------------------------------------------- - - private static class Loader { - private static final int MAX_STATEMENTS_IN_WARNING = 5; - - private ServletContextListener listener; - private final ServletContext ctx; - private final StartupStatus ss; - - private final OntModel userAccountsModel; - private final Property permissionSetType; - - private Model modelFromFile; - private Model filteredModel; - - private int howManyNewPermissionSets; - private int howManyOldPermissionSets; - - public Loader(ServletContextListener listener, ServletContext ctx, - StartupStatus ss) { - this.listener = listener; - this.ctx = ctx; - this.ss = ss; - - this.userAccountsModel = ModelAccess.on(ctx).getUserAccountsModel(); - this.permissionSetType = this.userAccountsModel - .getProperty(VitroVocabulary.PERMISSIONSET); - - } - - public void load() { - try { - createModelFromFile(); - filterModelFromFile(); - checkForLeftoverStatements(); - removeExistingPermissionSetsFromUserAccountsModel(); - addNewStatementsToUserAccountsModel(); - - ss.info(listener, buildInfoMessage()); - } catch (LoaderException e) { - Throwable cause = e.getCause(); - if (cause == null) { - ss.warning(listener, e.getMessage()); - } else { - ss.warning(listener, e.getMessage(), e.getCause()); - } - } - } - - private void createModelFromFile() throws LoaderException { - InputStream stream = ctx - .getResourceAsStream(FILE_OF_PERMISSION_SETS_INFO); - - if (stream == null) { - throw new LoaderException("The permission sets config file " - + "doesn't exist in the servlet context: '" - + FILE_OF_PERMISSION_SETS_INFO + "'"); - } - - try { - modelFromFile = ModelFactory.createDefaultModel(); - modelFromFile.read(stream, null, "N3"); - } finally { - try { - stream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - log.debug("Loaded " + modelFromFile.size() + " statements"); - } - - /** - * Move all statements that relate to PermissionSets from the loaded - * model to the filtered model. - */ - private void filterModelFromFile() { - filteredModel = ModelFactory.createDefaultModel(); - - for (Resource r : iterable(modelFromFile.listResourcesWithProperty( - RDF.type, permissionSetType))) { - moveStatementsToFilteredModel(r); - howManyNewPermissionSets++; - } - - log.debug("Filtered " + filteredModel.size() + " statements for " - + howManyNewPermissionSets + " PermissionSets; " - + modelFromFile.size() + " extraneous statements."); - } - - /** - * Move the statements about this PermissionSet from the loaded model to - * the filtered model. - */ - private void moveStatementsToFilteredModel(Resource ps) { - Selector sel = new SimpleSelector(ps, null, (String) null); - for (Statement stmt : iterable(modelFromFile.listStatements(sel))) { - filteredModel.add(stmt); - modelFromFile.remove(stmt); - } - } - - /** - * Complain about any statements that were not moved to the filtered - * model. - */ - private void checkForLeftoverStatements() { - List list = iterable(modelFromFile.listStatements()); - if (list.isEmpty()) { - return; - } - - String message = "The PermissionSets configuration file contained " - + list.size() - + " statements that didn't describe PermissionSets: "; - for (int i = 0; i < Math - .min(list.size(), MAX_STATEMENTS_IN_WARNING); i++) { - Statement stmt = list.get(i); - message += "(" + stmt.asTriple() + ") "; - } - if (list.size() > MAX_STATEMENTS_IN_WARNING) { - message += ", ..."; - } - - ss.warning(listener, message); - } - - private void removeExistingPermissionSetsFromUserAccountsModel() { - userAccountsModel.enterCriticalSection(Lock.WRITE); - try { - for (Resource r : iterable(userAccountsModel - .listResourcesWithProperty(RDF.type, permissionSetType))) { - Selector sel = new SimpleSelector(r, null, (String) null); - StmtIterator stmts = userAccountsModel.listStatements(sel); - userAccountsModel.remove(stmts); - howManyOldPermissionSets++; - } - } finally { - userAccountsModel.leaveCriticalSection(); - } - - log.debug("Deleted " + howManyOldPermissionSets - + " old PermissionSets from the user model."); - } - - private void addNewStatementsToUserAccountsModel() { - userAccountsModel.enterCriticalSection(Lock.WRITE); - try { - userAccountsModel.add(filteredModel); - } finally { - userAccountsModel.leaveCriticalSection(); - } - } - - private String buildInfoMessage() { - String message = "Loaded " + howManyNewPermissionSets - + " PermissionSets: "; - Selector sel = new SimpleSelector(null, RDFS.label, (String) null); - for (Statement stmt : iterable(filteredModel.listStatements(sel))) { - String label = stmt.getObject().asLiteral().getString(); - message += "'" + label + "' "; - } - return message; - } - - private List iterable(ClosableIterator iterator) { - List list = new ArrayList(); - try { - while (iterator.hasNext()) { - list.add(iterator.next()); - } - } finally { - iterator.close(); - } - return list; - } - - } - - // ---------------------------------------------------------------------- - // SmokeTester class - // ---------------------------------------------------------------------- - - private static class SmokeTester { - private ServletContextListener listener; - private final ServletContext ctx; - private final StartupStatus ss; - - private final UserAccountsDao uaDao; - - public SmokeTester(ServletContextListener listener, ServletContext ctx, - StartupStatus ss) { - this.listener = listener; - this.ctx = ctx; - this.ss = ss; - - WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory(); - if (wadf == null) { - throw new IllegalStateException( - "No webappDaoFactory on the servlet context"); - } - this.uaDao = wadf.getUserAccountsDao(); - } - - public void test() { - checkForPermissionSetsWithoutLabels(); - checkForReferencesToNonexistentPermissionSets(); - checkForReferencesToNonexistentPermissions(); - warnIfNoPermissionSetsForNewUsers(); - } - - private void checkForPermissionSetsWithoutLabels() { - for (PermissionSet ps : uaDao.getAllPermissionSets()) { - if (ps.getLabel().isEmpty()) { - ss.warning(listener, "This PermissionSet has no label: " - + ps.getUri()); - } - } - } - - private void checkForReferencesToNonexistentPermissionSets() { - for (UserAccount user : uaDao.getAllUserAccounts()) { - for (String psUri : user.getPermissionSetUris()) { - if (uaDao.getPermissionSetByUri(psUri) == null) { - ss.warning(listener, "The user '" + user.getFirstName() - + " " + user.getLastName() - + "' has the PermissionSet '" + psUri - + "', but the PermissionSet doesn't exist."); - } - } - } - } - - private void checkForReferencesToNonexistentPermissions() { - PermissionRegistry registry = PermissionRegistry.getRegistry(ctx); - for (PermissionSet ps : uaDao.getAllPermissionSets()) { - for (String pUri : ps.getPermissionUris()) { - if (!registry.isPermission(pUri)) { - ss.warning(listener, - "The PermissionSet '" + ps.getLabel() - + "' has the Permission '" + pUri - + "', but the Permission " - + "is not found in the registry."); - } - } - } - } - - private void warnIfNoPermissionSetsForNewUsers() { - for (PermissionSet ps : uaDao.getAllPermissionSets()) { - if (ps.isForNewUsers()) { - return; - } - } - ss.warning(listener, "No PermissionSet has been declared to be a " - + "PermissionSet for new users."); - } - - } - - // ---------------------------------------------------------------------- - // Handy dandy exception. - // ---------------------------------------------------------------------- - - private static class LoaderException extends Exception { - - public LoaderException(String message) { - super(message); - } - - public LoaderException(String message, Throwable cause) { - super(message, cause); - } - - } -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsSmokeTest.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsSmokeTest.java new file mode 100644 index 000000000..74c0f8c08 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsSmokeTest.java @@ -0,0 +1,124 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.permissions; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import edu.cornell.mannlib.vitro.webapp.beans.PermissionSet; +import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; +import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; +import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao; +import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; + +/** + * Load the initial configuration of PermissionSets and Permissions. + * + * The UserAccounts model must be created before this runs. + * + * The PermissionRegistry must be created before this runs. + */ +public class PermissionSetsSmokeTest implements ServletContextListener { + @SuppressWarnings("unused") + private static final Log log = LogFactory + .getLog(PermissionSetsSmokeTest.class); + + @Override + public void contextInitialized(ServletContextEvent sce) { + ServletContext ctx = sce.getServletContext(); + StartupStatus ss = StartupStatus.getBean(ctx); + + try { + new SmokeTester(this, ctx, ss).test(); + } catch (Exception e) { + ss.fatal(this, "Found a problem while testing the PermissionSets", + e); + } + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + // Nothing to tear down. + } + + // ---------------------------------------------------------------------- + // SmokeTester class + // ---------------------------------------------------------------------- + + private static class SmokeTester { + private ServletContextListener listener; + private final ServletContext ctx; + private final StartupStatus ss; + + private final UserAccountsDao uaDao; + + public SmokeTester(ServletContextListener listener, ServletContext ctx, + StartupStatus ss) { + this.listener = listener; + this.ctx = ctx; + this.ss = ss; + + this.uaDao = ModelAccess.on(ctx).getWebappDaoFactory() + .getUserAccountsDao(); + } + + public void test() { + checkForPermissionSetsWithoutLabels(); + checkForReferencesToNonexistentPermissionSets(); + checkForReferencesToNonexistentPermissions(); + warnIfNoPermissionSetsForNewUsers(); + } + + private void checkForPermissionSetsWithoutLabels() { + for (PermissionSet ps : uaDao.getAllPermissionSets()) { + if (ps.getLabel().isEmpty()) { + ss.warning(listener, "This PermissionSet has no label: " + + ps.getUri()); + } + } + } + + private void checkForReferencesToNonexistentPermissionSets() { + for (UserAccount user : uaDao.getAllUserAccounts()) { + for (String psUri : user.getPermissionSetUris()) { + if (uaDao.getPermissionSetByUri(psUri) == null) { + ss.warning(listener, "The user '" + user.getFirstName() + + " " + user.getLastName() + + "' has the PermissionSet '" + psUri + + "', but the PermissionSet doesn't exist."); + } + } + } + } + + private void checkForReferencesToNonexistentPermissions() { + PermissionRegistry registry = PermissionRegistry.getRegistry(ctx); + for (PermissionSet ps : uaDao.getAllPermissionSets()) { + for (String pUri : ps.getPermissionUris()) { + if (!registry.isPermission(pUri)) { + ss.warning(listener, + "The PermissionSet '" + ps.getLabel() + + "' has the Permission '" + pUri + + "', but the Permission " + + "is not found in the registry."); + } + } + } + } + + private void warnIfNoPermissionSetsForNewUsers() { + for (PermissionSet ps : uaDao.getAllPermissionSets()) { + if (ps.isForNewUsers()) { + return; + } + } + ss.warning(listener, "No PermissionSet has been declared to be a " + + "PermissionSet for new users."); + } + + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java index aee28c2d6..271fbfbd1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java @@ -13,7 +13,7 @@ import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.ResourceFactory; import edu.cornell.mannlib.vedit.beans.LoginStatusBean; -import edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSetsLoader; +import edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSets; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; public class BaseResourceBean implements ResourceBean { @@ -80,13 +80,13 @@ public class BaseResourceBean implements ResourceBean { } Set roles = u.getPermissionSetUris(); - if (roles.contains(PermissionSetsLoader.URI_DBA)) { + if (roles.contains(PermissionSets.URI_DBA)) { return DB_ADMIN; - } else if (roles.contains(PermissionSetsLoader.URI_CURATOR)) { + } else if (roles.contains(PermissionSets.URI_CURATOR)) { return CURATOR; - } else if (roles.contains(PermissionSetsLoader.URI_EDITOR)) { + } else if (roles.contains(PermissionSets.URI_EDITOR)) { return EDITOR; - } else if (roles.contains(PermissionSetsLoader.URI_SELF_EDITOR)) { + } else if (roles.contains(PermissionSets.URI_SELF_EDITOR)) { return SELF; } else { // Logged in but with no recognized role? Make them SELF diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsFirstTimeExternalPage.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsFirstTimeExternalPage.java index 7ae86c744..c48ba8691 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsFirstTimeExternalPage.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsFirstTimeExternalPage.java @@ -11,7 +11,7 @@ import javax.servlet.http.HttpSession; import org.apache.commons.lang.StringUtils; -import edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSetsLoader; +import edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSets; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount.Status; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; @@ -200,7 +200,7 @@ public class UserAccountsFirstTimeExternalPage extends UserAccountsPage { u.setLoginCount(0); u.setStatus(Status.ACTIVE); u.setPermissionSetUris(Collections - .singleton(PermissionSetsLoader.URI_SELF_EDITOR)); + .singleton(PermissionSets.URI_SELF_EDITOR)); userAccountsDao.insertUserAccount(u); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java index 121537b76..efbae4a80 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UserModelSetup.java @@ -57,15 +57,17 @@ public class UserModelSetup extends JenaDataSourceSetupBase implements OntModel userAccountsModel = ModelFactory .createOntologyModel(MEM_ONT_MODEL_SPEC); - // This is used in Selenium testing, to load accounts from a file. - RDFFilesLoader.loadFirstTimeFiles(ctx, "auth", userAccountsDbModel, - userAccountsDbModel.isEmpty()); - userAccountsModel.add(userAccountsDbModel); userAccountsModel.getBaseModel().register( new ModelSynchronizer(userAccountsDbModel)); - ModelAccess.on(ctx).setUserAccountsModel(userAccountsModel); + // This is used in Selenium testing, to load accounts from a file. + RDFFilesLoader.loadFirstTimeFiles(ctx, "auth", userAccountsModel, + userAccountsDbModel.isEmpty()); + // This gets the permissions configuration. + RDFFilesLoader.loadEveryTimeFiles(ctx, "auth", userAccountsModel); + + ModelAccess.on(ctx).setUserAccountsModel(userAccountsModel); } catch (Throwable t) { log.error("Unable to load user accounts model from DB", t); ss.fatal(this, "Unable to load user accounts model from DB", t); diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/authenticate/ProgramLoginTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/authenticate/ProgramLoginTest.java index 8f071ee3c..3bcfee593 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/authenticate/ProgramLoginTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/authenticate/ProgramLoginTest.java @@ -27,7 +27,7 @@ import stubs.javax.servlet.http.HttpServletResponseStub; import stubs.javax.servlet.http.HttpSessionStub; import edu.cornell.mannlib.vedit.beans.LoginStatusBean; import edu.cornell.mannlib.vitro.testing.AbstractTestClass; -import edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSetsLoader; +import edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSets; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; /** @@ -97,7 +97,7 @@ public class ProgramLoginTest extends AbstractTestClass { user.setEmailAddress(name); user.setUri(uri); user.setPermissionSetUris(Collections - .singleton(PermissionSetsLoader.URI_DBA)); + .singleton(PermissionSets.URI_DBA)); user.setMd5Password(Authenticator.applyMd5Encoding(password)); user.setLoginCount(loginCount); user.setPasswordChangeRequired(loginCount == 0); diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/AuthenticateTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/AuthenticateTest.java index 2e98b283d..9c5dcfbb6 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/AuthenticateTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/AuthenticateTest.java @@ -2,8 +2,8 @@ package edu.cornell.mannlib.vitro.webapp.controller.edit; -import static edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSetsLoader.URI_DBA; -import static edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSetsLoader.URI_SELF_EDITOR; +import static edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSets.URI_DBA; +import static edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSets.URI_SELF_EDITOR; import static edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State.FORCED_PASSWORD_CHANGE; import static edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State.LOGGING_IN; import static org.junit.Assert.assertEquals; diff --git a/webapp/web/WEB-INF/resources/startup_listeners.txt b/webapp/web/WEB-INF/resources/startup_listeners.txt index 7f83a702a..98a3fac21 100644 --- a/webapp/web/WEB-INF/resources/startup_listeners.txt +++ b/webapp/web/WEB-INF/resources/startup_listeners.txt @@ -43,7 +43,7 @@ edu.cornell.mannlib.vitro.webapp.servlet.setup.ThemeInfoSetup edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionRegistry$Setup -edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSetsLoader +edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionSetsSmokeTest edu.cornell.mannlib.vitro.webapp.auth.policy.bean.PropertyRestrictionPolicyHelper$Setup From ab11fff370f50208c8a5dff61385ed2ebbcd6051 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Wed, 28 Aug 2013 11:18:33 -0400 Subject: [PATCH 28/46] Adding serialization support or JSON-LD to indivdiual controller. VIVO-255 --- .../webapp/controller/VitroHttpServlet.java | 1 + .../freemarker/FreemarkerHttpServlet.java | 37 ++++++++++++++----- .../individual/IndividualController.java | 2 + .../individual/IndividualRequestAnalyzer.java | 10 ++++- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroHttpServlet.java index dd25369b9..df1e29eee 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroHttpServlet.java @@ -45,6 +45,7 @@ public class VitroHttpServlet extends HttpServlet { public final static String HTML_MIMETYPE = "text/html"; public final static String RDFXML_MIMETYPE = "application/rdf+xml"; + public final static String JSON_MIMETYPE = "application/json"; public final static String N3_MIMETYPE = "text/n3"; // unofficial and unregistered public final static String TTL_MIMETYPE = "text/turtle"; // unofficial and unregistered diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java index 71eeaf006..1530aaeee 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java @@ -20,10 +20,14 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import com.github.jsonldjava.core.JSONLD; +import com.github.jsonldjava.core.JSONLDProcessingError; +import com.github.jsonldjava.impl.JenaRDFParser; +import com.github.jsonldjava.utils.JSONUtils; + import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission; import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; -import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequiresActions; import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean; import edu.cornell.mannlib.vitro.webapp.beans.DisplayMessage; import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet; @@ -39,6 +43,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.Tem import edu.cornell.mannlib.vitro.webapp.email.FreemarkerEmailFactory; import edu.cornell.mannlib.vitro.webapp.email.FreemarkerEmailMessage; import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.Tags; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.User; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.menu.MainMenu; @@ -308,17 +313,29 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { String mediaType = values.getContentType().getMediaType(); response.setContentType(mediaType); - - String format = ""; - if ( RDFXML_MIMETYPE.equals(mediaType)) { - format = "RDF/XML"; - } else if( N3_MIMETYPE.equals(mediaType)) { - format = "N3"; - } else if ( TTL_MIMETYPE.equals(mediaType)) { - format ="TTL"; + + if ( JSON_MIMETYPE.equals(mediaType)){ + //json-ld is not supported by jena v2.6.4 + try { + JenaRDFParser parser = new JenaRDFParser(); + Object json = JSONLD.fromRDF( values.getModel() , parser); + JSONUtils.write(response.getWriter(), json); + } catch (JSONLDProcessingError e) { + throw new IOException("Could not convert from Jena model to JSON-LD", e); + } + }else{ + String format = ""; + if ( RDFXML_MIMETYPE.equals(mediaType)) { + format = "RDF/XML"; + } else if( N3_MIMETYPE.equals(mediaType)) { + format = "N3"; + } else if ( TTL_MIMETYPE.equals(mediaType)) { + format ="TTL"; + } + values.getModel().write( response.getOutputStream(), format ); } - values.getModel().write( response.getOutputStream(), format ); + } protected void doException(VitroRequest vreq, HttpServletResponse response, diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualController.java index 2e632159f..8c10623b2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualController.java @@ -39,6 +39,8 @@ public class IndividualController extends FreemarkerHttpServlet { map.put(HTML_MIMETYPE, 0.5f); map.put(XHTML_MIMETYPE, 0.5f); map.put("application/xml", 0.5f); + map.put(JSON_MIMETYPE, 1.0f); + map.put(RDFXML_MIMETYPE, 1.0f); map.put(RDFXML_MIMETYPE, 1.0f); map.put(N3_MIMETYPE, 1.0f); map.put(TTL_MIMETYPE, 1.0f); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRequestAnalyzer.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRequestAnalyzer.java index 3b3c6d091..d89766164 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRequestAnalyzer.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRequestAnalyzer.java @@ -5,6 +5,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.individual; import static edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet.N3_MIMETYPE; import static edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet.RDFXML_MIMETYPE; import static edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet.TTL_MIMETYPE; +import static edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet.JSON_MIMETYPE; import java.util.Map; import java.util.regex.Matcher; @@ -117,7 +118,9 @@ public class IndividualRequestAnalyzer { return "/individual/" + m.group(1) + "/" + m.group(1) + ".n3"; } else if (TTL_MIMETYPE.equals(mediaType)) { return "/individual/" + m.group(1) + "/" + m.group(1) + ".ttl"; - } + } else if (JSON_MIMETYPE.equals(mediaType)){ + return "/individual/" + m.group(1) + "/" + m.group(1) + ".jsonld"; + } } // or redirect to the canonical URL for HTML representation. return "/display/" + m.group(1); @@ -244,7 +247,10 @@ public class IndividualRequestAnalyzer { if (formatParam.contains("ttl")) { return ContentType.TURTLE; } - + if (formatParam.contains("jsonld") || formatParam.contains("json")){ + return ContentType.JSON; + } + /* * Check for parts of URL that indicate request for RDF. Examples: * http://vivo.cornell.edu/individual/n23/n23.rdf From aab7ad8798e91ec36b9ba83d75233f4f7218cf2a Mon Sep 17 00:00:00 2001 From: j2blake Date: Wed, 28 Aug 2013 11:54:10 -0400 Subject: [PATCH 29/46] Show only a summary of licensing info. --- webapp/config/licenser/licenser.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapp/config/licenser/licenser.properties b/webapp/config/licenser/licenser.properties index 0fab7f165..1b0aaa076 100644 --- a/webapp/config/licenser/licenser.properties +++ b/webapp/config/licenser/licenser.properties @@ -31,5 +31,4 @@ license_file = doc/license.txt # Set to 'full' for a full report, 'short' for a brief statment, or to anything # else for a medium-length summary. -#report_level = short -report_level = medium +report_level = short From 314a4e638bbe49f47fc2333363d4ab703d2fb10d Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Wed, 28 Aug 2013 14:08:05 -0400 Subject: [PATCH 30/46] Adding license text to new files --- .../vitro/webapp/auth/policy/CompositPolicyDecision.java | 2 ++ .../vitro/webapp/auth/requestedAction/AllRequestedAction.java | 2 ++ .../vitro/webapp/auth/requestedAction/AnyRequestedAction.java | 2 ++ .../vitro/webapp/auth/requestedAction/AuthorizedAction.java | 2 ++ .../vitro/webapp/auth/requestedAction/UnauthorizedAction.java | 2 ++ .../webapp/auth/requestedAction/ifaces/RequiresActions.java | 2 ++ .../mannlib/vitro/webapp/auth/policy/PolicyListTest.java | 2 ++ .../mannlib/vitro/webapp/controller/SparqlQueryServletTest.java | 2 ++ 8 files changed, 16 insertions(+) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/CompositPolicyDecision.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/CompositPolicyDecision.java index c0e9b1045..538ea6a76 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/CompositPolicyDecision.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/CompositPolicyDecision.java @@ -1,3 +1,5 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + package edu.cornell.mannlib.vitro.webapp.auth.policy; import java.util.List; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AllRequestedAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AllRequestedAction.java index 9863ca81d..19408d57c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AllRequestedAction.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AllRequestedAction.java @@ -1,3 +1,5 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + package edu.cornell.mannlib.vitro.webapp.auth.requestedAction; import java.util.Arrays; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AnyRequestedAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AnyRequestedAction.java index 6b00dfa4c..e90eb2d95 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AnyRequestedAction.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AnyRequestedAction.java @@ -1,3 +1,5 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + package edu.cornell.mannlib.vitro.webapp.auth.requestedAction; import java.util.Arrays; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AuthorizedAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AuthorizedAction.java index c8b9acfb7..6fed03dc1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AuthorizedAction.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/AuthorizedAction.java @@ -1,3 +1,5 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + package edu.cornell.mannlib.vitro.webapp.auth.requestedAction; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/UnauthorizedAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/UnauthorizedAction.java index 7f5a220d4..011da2862 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/UnauthorizedAction.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/UnauthorizedAction.java @@ -1,3 +1,5 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + package edu.cornell.mannlib.vitro.webapp.auth.requestedAction; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/ifaces/RequiresActions.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/ifaces/RequiresActions.java index b5dbad51f..625e48a80 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/ifaces/RequiresActions.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/ifaces/RequiresActions.java @@ -1,3 +1,5 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + package edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyListTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyListTest.java index 855e368ad..4b056db87 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyListTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/policy/PolicyListTest.java @@ -1,3 +1,5 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + package edu.cornell.mannlib.vitro.webapp.auth.policy; import java.util.ArrayList; diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServletTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServletTest.java index 0ea095a69..a03d3b9a7 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServletTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/SparqlQueryServletTest.java @@ -1,3 +1,5 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + package edu.cornell.mannlib.vitro.webapp.controller; import static org.junit.Assert.*; From 9f4ea054acfab932ea953b2389b0966be71c1e7f Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Wed, 28 Aug 2013 14:37:05 -0400 Subject: [PATCH 31/46] Removing some iso-8859 conversions. VIVO-81 --- .../controller/edit/ClassgroupRetryController.java | 11 ++++------- .../controller/edit/PropertyGroupRetryController.java | 9 +++------ .../freemarker/config/FreemarkerConfiguration.java | 2 +- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/ClassgroupRetryController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/ClassgroupRetryController.java index c11f66c96..236c2c38f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/ClassgroupRetryController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/ClassgroupRetryController.java @@ -65,13 +65,10 @@ public class ClassgroupRetryController extends BaseEditController { } catch (NullPointerException e) { log.error("Need to implement 'record not found' error message."); } - if (vclassGroupForEditing == null) { - try { - String uriToFind = new String(request.getParameter("uri").getBytes("ISO-8859-1"),"UTF-8"); - vclassGroupForEditing = (VClassGroup)cgDao.getGroupByURI(uriToFind); - } catch (java.io.UnsupportedEncodingException uee) { - // forget it - } + if (vclassGroupForEditing == null) { + //UTF-8 expected due to URIEncoding on Connector in server.xml + String uriToFind = new String(request.getParameter("uri")); + vclassGroupForEditing = (VClassGroup)cgDao.getGroupByURI(uriToFind); } } else { vclassGroupForEditing = new VClassGroup(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyGroupRetryController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyGroupRetryController.java index 362457344..0eeb5dc28 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyGroupRetryController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyGroupRetryController.java @@ -65,12 +65,9 @@ public class PropertyGroupRetryController extends BaseEditController { log.error("Need to implement 'record not found' error message."); } if (propertyGroupForEditing == null) { - try { - String uriToFind = new String(request.getParameter("uri").getBytes("ISO-8859-1"),"UTF-8"); - propertyGroupForEditing = (PropertyGroup)pgDao.getGroupByURI(uriToFind); - } catch (java.io.UnsupportedEncodingException uee) { - // forget it - } + // UTF-8 expected due to URIEncoding on Connector element in server.xml + String uriToFind = new String(request.getParameter("uri")); + propertyGroupForEditing = (PropertyGroup)pgDao.getGroupByURI(uriToFind); } } else { propertyGroupForEditing = new PropertyGroup(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java index fe7555d35..17ad1fd0b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java @@ -242,7 +242,7 @@ public abstract class FreemarkerConfiguration { * URL? */ try { - c.setSetting("url_escaping_charset", "ISO-8859-1"); + c.setSetting("url_escaping_charset", "UTF-8"); } catch (TemplateException e) { log.error("Error setting value for url_escaping_charset."); } From bbfd68ef4d02c3acfa700d52bf541caf84467c24 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Wed, 28 Aug 2013 16:21:59 -0400 Subject: [PATCH 32/46] combined addedTBoxStatement and removedTBoxStatement, VIVO-110 --- .../vitro/webapp/reasoner/SimpleReasoner.java | 563 +++++++++--------- 1 file changed, 289 insertions(+), 274 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java index b83ae68e4..167888227 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java @@ -63,8 +63,11 @@ public class SimpleReasoner extends StatementListener { private OntModel fullModel; // contains at least the // asserted and inferred ABox - private static final String mostSpecificTypePropertyURI = "http://vitro.mannlib.cornell.edu/ns/vitro/0.7#mostSpecificType"; - private static final AnnotationProperty mostSpecificType = (ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM)).createAnnotationProperty(mostSpecificTypePropertyURI); + private static final String mostSpecificTypePropertyURI = + "http://vitro.mannlib.cornell.edu/ns/vitro/0.7#mostSpecificType"; + private static final AnnotationProperty mostSpecificType = + (ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM)) + .createAnnotationProperty(mostSpecificTypePropertyURI); // DeltaComputer private CumulativeDeltaModeler aBoxDeltaModeler1 = null; @@ -77,13 +80,18 @@ public class SimpleReasoner extends StatementListener { private boolean stopRequested = false; private List pluginList = new CopyOnWriteArrayList(); + + private boolean doSameAs = true; /** * @param tboxModel - input. This model contains both asserted and inferred TBox axioms * @param aboxModel - input. This model contains asserted ABox statements - * @param inferenceModel - output. This is the model in which inferred (materialized) ABox statements are maintained (added or retracted). - * @param inferenceRebuildModel - output. This the model is temporarily used when the whole ABox inference model is rebuilt - * @param inferenceScratchpadModel - output. This the model is temporarily used when the whole ABox inference model is rebuilt + * @param inferenceModel - output. This is the model in which inferred (materialized) + * ABox statements are maintained (added or retracted). + * @param inferenceRebuildModel - output. This the model is temporarily used when the + * whole ABox inference model is rebuilt + * @param inferenceScratchpadModel - output. This the model is temporarily used when + * the whole ABox inference model is rebuilt */ public SimpleReasoner(OntModel tboxModel, RDFService rdfService, @@ -125,7 +133,8 @@ public class SimpleReasoner extends StatementListener { * * @param tboxModel - input. This model contains both asserted and inferred TBox axioms * @param aboxModel - input. This model contains asserted ABox statements - * @param inferenceModel - output. This is the model in which inferred (materialized) ABox statements are maintained (added or retracted). + * @param inferenceModel - output. This is the model in which inferred (materialized) + * ABox statements are maintained (added or retracted). */ public SimpleReasoner(OntModel tboxModel, OntModel aboxModel, Model inferenceModel) { this.tboxModel = tboxModel; @@ -148,7 +157,11 @@ public class SimpleReasoner extends StatementListener { public List getPluginList() { return this.pluginList; } - + + public void doSameAs( boolean tf){ + this.doSameAs = tf; + } + /* * Performs incremental ABox reasoning based * on the addition of a new statement @@ -158,9 +171,9 @@ public class SimpleReasoner extends StatementListener { public void addedStatement(Statement stmt) { try { if (stmt.getPredicate().equals(RDF.type)) { - addedABoxTypeAssertion(stmt, inferenceModel, new HashSet()); + addedABoxTypeAssertion(stmt, inferenceModel, new HashSet()); setMostSpecificTypes(stmt.getSubject(), inferenceModel, new HashSet()); - } else if (stmt.getPredicate().equals(OWL.sameAs)) { + } else if ( doSameAs && stmt.getPredicate().equals(OWL.sameAs)) { addedABoxSameAsAssertion(stmt, inferenceModel); } else { addedABoxAssertion(stmt, inferenceModel); @@ -168,8 +181,7 @@ public class SimpleReasoner extends StatementListener { doPlugins(ModelUpdate.Operation.ADD,stmt); - } catch (Exception e) { - // don't stop the edit if there's an exception + } catch (Exception e) { // don't stop the edit if there's an exception log.error("Exception while computing inferences: " + e.getMessage()); } } @@ -180,20 +192,16 @@ public class SimpleReasoner extends StatementListener { * from the ABox. */ @Override - public void removedStatement(Statement stmt) { - + public void removedStatement(Statement stmt) { try { - handleRemovedStatement(stmt); - - } catch (Exception e) { - // don't stop the edit if there's an exception + handleRemovedStatement(stmt); + } catch (Exception e) { // don't stop the edit if there's an exception log.error("Exception while retracting inferences: ", e); } } /* - * Synchronized part of removedStatement. Interacts - * with DeltaComputer. + * Synchronized part of removedStatement. Interacts with DeltaComputer. */ protected synchronized void handleRemovedStatement(Statement stmt) { if (batchMode == 1) { @@ -204,7 +212,7 @@ public class SimpleReasoner extends StatementListener { if (stmt.getPredicate().equals(RDF.type)) { removedABoxTypeAssertion(stmt, inferenceModel); setMostSpecificTypes(stmt.getSubject(), inferenceModel, new HashSet()); - } else if (stmt.getPredicate().equals(OWL.sameAs)) { + } else if ( doSameAs && stmt.getPredicate().equals(OWL.sameAs)) { removedABoxSameAsAssertion(stmt, inferenceModel); } else { removedABoxAssertion(stmt, inferenceModel); @@ -212,16 +220,16 @@ public class SimpleReasoner extends StatementListener { doPlugins(ModelUpdate.Operation.RETRACT,stmt); } } - - /* - * Performs incremental ABox reasoning based - * on changes to the class hierarchy. - * - * Handles rdfs:subclassOf, owl:equivalentClass, and owl:inverseOf - */ - public void addedTBoxStatement(Statement stmt) { - try { - if (!(stmt.getPredicate().equals(RDFS.subClassOf) || stmt.getPredicate().equals(OWL.equivalentClass) || stmt.getPredicate().equals(OWL.inverseOf))) { + + /** + * addedTBoxStatement and removedTBoxStatement use the + * same tests so the are merged into this method. + */ + protected void changedTBoxStatement( Statement stmt , boolean add){ + try { + if (!(stmt.getPredicate().equals(RDFS.subClassOf) + || stmt.getPredicate().equals(OWL.equivalentClass) + || stmt.getPredicate().equals(OWL.inverseOf))) { return; } @@ -230,7 +238,9 @@ public class SimpleReasoner extends StatementListener { return; } - if (stmt.getPredicate().equals(RDFS.subClassOf) || stmt.getPredicate().equals(OWL.equivalentClass)) { + if (stmt.getPredicate().equals(RDFS.subClassOf) + || stmt.getPredicate().equals(OWL.equivalentClass)) { + // ignore anonymous classes if (stmt.getSubject().isAnon() || stmt.getObject().isAnon()) { return; @@ -238,22 +248,33 @@ public class SimpleReasoner extends StatementListener { OntClass subject = tboxModel.getOntClass((stmt.getSubject()).getURI()); if (subject == null) { - log.debug("didn't find subject class in the tbox: " + (stmt.getSubject()).getURI()); + log.debug("didn't find subject class in the tbox: " + + (stmt.getSubject()).getURI()); return; } OntClass object = tboxModel.getOntClass(((Resource)stmt.getObject()).getURI()); if (object == null) { - log.debug("didn't find object class in the tbox: " + ((Resource)stmt.getObject()).getURI()); + log.debug("didn't find object class in the tbox: " + + ((Resource)stmt.getObject()).getURI()); return; } if (stmt.getPredicate().equals(RDFS.subClassOf)) { + if( add ){ addedSubClass(subject,object,inferenceModel); + }else{ + removedSubClass( subject,object,inferenceModel); + } } else { // equivalent class is the same as subclass in both directions - addedSubClass(subject,object,inferenceModel); - addedSubClass(object,subject,inferenceModel); + if(add){ + addedSubClass(subject,object,inferenceModel); + addedSubClass(object,subject,inferenceModel); + }else{ + removedSubClass( subject,object,inferenceModel); + removedSubClass(object,subject,inferenceModel); + } } } else { if ( stmt.getObject().asResource().getURI() == null ) { @@ -268,22 +289,37 @@ public class SimpleReasoner extends StatementListener { OntProperty prop1 = tboxModel.getOntProperty((stmt.getSubject()).getURI()); if (prop1 == null) { - log.debug("didn't find subject property in the tbox: " + (stmt.getSubject()).getURI()); + log.debug("didn't find subject property in the tbox: " + + (stmt.getSubject()).getURI()); return; } OntProperty prop2 = tboxModel.getOntProperty(((Resource)stmt.getObject()).getURI()); if (prop2 == null) { - log.debug("didn't find object property in the tbox: " + ((Resource)stmt.getObject()).getURI()); + log.debug("didn't find object property in the tbox: " + + ((Resource)stmt.getObject()).getURI()); return; } - addedInverseProperty(prop1, prop2, inferenceModel); + if( add ){ + addedInverseProperty(prop1, prop2, inferenceModel); + } else { + removedInverseProperty(prop1,prop2,inferenceModel); + } } - } catch (Exception e) { - // don't stop the edit if there's an exception - log.error("Exception while adding inference(s)",e); - } + } catch (Exception e) { // don't stop the edit if there's an exception + log.error("Exception while " + (add?"adding":"removing") + " inference(s)",e); + } + } + + /* + * Performs incremental ABox reasoning based + * on changes to the class hierarchy. + * + * Handles rdfs:subclassOf, owl:equivalentClass, and owl:inverseOf + */ + public void addedTBoxStatement(Statement stmt) { + changedTBoxStatement( stmt, true); } /* @@ -293,71 +329,7 @@ public class SimpleReasoner extends StatementListener { * Handles rdfs:subclassOf, owl:equivalentClass, and owl:inverseOf */ public void removedTBoxStatement(Statement stmt) { - try { - if (!(stmt.getPredicate().equals(RDFS.subClassOf) || stmt.getPredicate().equals(OWL.equivalentClass) || stmt.getPredicate().equals(OWL.inverseOf))) { - return; - } - - if (!stmt.getObject().isResource()) { - log.warn("The object of this assertion is not a resource: " + stmtString(stmt)); - return; - } - - if ( stmt.getPredicate().equals(RDFS.subClassOf) || stmt.getPredicate().equals(OWL.equivalentClass) ) { - - // ignore anonymous classes - if (stmt.getSubject().isAnon() || stmt.getObject().isAnon()) { - return; - } - - OntClass subject = tboxModel.getOntClass((stmt.getSubject()).getURI()); - if (subject == null) { - log.debug("didn't find subject class in the tbox: " + (stmt.getSubject()).getURI()); - return; - } - - OntClass object = tboxModel.getOntClass(((Resource)stmt.getObject()).getURI()); - if (object == null) { - log.debug("didn't find object class in the tbox: " + ((Resource)stmt.getObject()).getURI()); - return; - } - - if (stmt.getPredicate().equals(RDFS.subClassOf)) { - removedSubClass(subject,object,inferenceModel); - } else { - // equivalent class is the same as subclass in both directions - removedSubClass(subject,object,inferenceModel); - removedSubClass(object,subject,inferenceModel); - } - } else { - if ( stmt.getObject().asResource().getURI() == null ) { - log.warn("The object of this assertion has a null URI: " + stmtString(stmt)); - return; - } - - if ( stmt.getSubject().getURI() == null ) { - log.warn("The subject of this assertion has a null URI: " + stmtString(stmt)); - return; - } - - OntProperty prop1 = tboxModel.getOntProperty((stmt.getSubject()).getURI()); - if (prop1 == null) { - log.debug("didn't find subject property in the tbox: " + (stmt.getSubject()).getURI()); - return; - } - - OntProperty prop2 = tboxModel.getOntProperty(((Resource)stmt.getObject()).getURI()); - if (prop2 == null) { - log.debug("didn't find object property in the tbox: " + ((Resource)stmt.getObject()).getURI()); - return; - } - - removedInverseProperty(prop1, prop2, inferenceModel); - } - } catch (Exception e) { - // don't stop the edit if there's an exception - log.error("Exception while removing inference(s)",e); - } + changedTBoxStatement(stmt, false); } /* @@ -368,7 +340,9 @@ public class SimpleReasoner extends StatementListener { * If it is added that B is of type A, then for each superclass of * A assert that B is of that type. */ - protected void addedABoxTypeAssertion(Statement stmt, Model inferenceModel, HashSet unknownTypes) { + protected void addedABoxTypeAssertion(Statement stmt, + Model inferenceModel, + HashSet unknownTypes) { tboxModel.enterCriticalSection(Lock.READ); try { @@ -391,7 +365,9 @@ public class SimpleReasoner extends StatementListener { // of classes not individuals. if (parentClass.isAnon()) continue; - Statement infStmt = ResourceFactory.createStatement(stmt.getSubject(), RDF.type, parentClass); + Statement infStmt = + ResourceFactory.createStatement(stmt.getSubject(), + RDF.type, parentClass); addInference(infStmt,inferenceModel,true); } } @@ -399,13 +375,17 @@ public class SimpleReasoner extends StatementListener { if ( !(stmt.getObject().asResource().getNameSpace()).equals(OWL.NS)) { if (!unknownTypes.contains(stmt.getObject().asResource().getURI())) { unknownTypes.add(stmt.getObject().asResource().getURI()); - log.warn("Didn't find the target class (the object of an added rdf:type statement) in the TBox: " + - (stmt.getObject().asResource()).getURI() + ". No class subsumption reasoning will be done based on type assertions of this type."); + log.warn("Didn't find the target class (the object of an added " + + "rdf:type statement) in the TBox: " + + (stmt.getObject().asResource()).getURI() + + ". No class subsumption reasoning will be done " + + "based on type assertions of this type."); } } } } else { - log.debug("The object of this rdf:type assertion has a null URI, no reasoning will be done based on this assertion: " + stmtString(stmt)); + log.debug("The object of this rdf:type assertion has a null URI, no reasoning" + + " will be done based on this assertion: " + stmtString(stmt)); return; } } finally { @@ -442,7 +422,9 @@ public class SimpleReasoner extends StatementListener { * improvement when this method is called repeatedly for the same subject. * */ - protected void removedABoxTypeAssertion(Statement stmt, Model inferenceModel, List remainingTypeURIs) { + protected void removedABoxTypeAssertion(Statement stmt, + Model inferenceModel, + List remainingTypeURIs) { tboxModel.enterCriticalSection(Lock.READ); try { Resource cls = null; @@ -469,22 +451,27 @@ public class SimpleReasoner extends StatementListener { // of classes not individuals. if (parentClass.isAnon()) continue; - List typeURIs = (remainingTypeURIs == null) ? getRemainingAssertedTypeURIs(stmt.getSubject()) : remainingTypeURIs; + List typeURIs = (remainingTypeURIs == null) + ? getRemainingAssertedTypeURIs(stmt.getSubject()) : remainingTypeURIs; if (entailedType(stmt.getSubject(),parentClass, typeURIs)) { continue; // if a type is still entailed without the } - // removed statement, then don't remove it - // from the inferences + // removed statement, then don't remove it + // from the inferences - Statement infStmt = ResourceFactory.createStatement(stmt.getSubject(), RDF.type, parentClass); + Statement infStmt = + ResourceFactory.createStatement(stmt.getSubject(), RDF.type, parentClass); removeInference(infStmt,inferenceModel,true,false); } } else { - log.warn("Didn't find target class (the object of the removed rdf:type statement) in the TBox: " - + ((Resource)stmt.getObject()).getURI() + ". No class subsumption reasoning will be performed based on the removal of this assertion."); + log.warn("Didn't find target class (the object of the removed rdf:type" + + "statement) in the TBox: " + + ((Resource)stmt.getObject()).getURI() + ". No class subsumption" + +" reasoning will be performed based on the removal of this assertion."); } } else { - log.warn("The object of this rdf:type assertion has a null URI: " + stmtString(stmt)); + log.warn("The object of this rdf:type assertion has a null URI: " + + stmtString(stmt)); } } catch (Exception e) { log.warn("exception while removing abox type assertions: " + e.getMessage()); @@ -493,145 +480,9 @@ public class SimpleReasoner extends StatementListener { } } - /* - * Materializes inferences based on the owl:sameAs relationship. - * - * If it is added that x owl:sameAs y, then all asserted and inferred - * statements about x will become inferred about y if they are not already - * asserted about y, and vice versa. - */ - protected void addedABoxSameAsAssertion(Statement stmt, Model inferenceModel) { - Resource subject = null; - Resource object = null; - - if (stmt.getSubject().isResource()) { - subject = stmt.getSubject().asResource(); - if (tboxModel.containsResource(subject) || subject.isAnon()) { - log.debug("the subject of this sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); - return; - } - } else { - log.warn("the subject of this sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); - return; - } - if (stmt.getObject().isResource()) { - object = stmt.getObject().asResource(); - if (tboxModel.containsResource(object) || object.isAnon()) { - log.debug("the object of this sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); - return; - } - } else { - log.warn("the object of this sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); - return; - } - inferenceModel.enterCriticalSection(Lock.WRITE); - try { - if (inferenceModel.contains(stmt)) { - inferenceModel.remove(stmt); - } - } finally { - inferenceModel.leaveCriticalSection(); - } - - Statement opposite = ResourceFactory.createStatement(object, OWL.sameAs, subject); - addInference(opposite,inferenceModel,true); - - generateSameAsInferences(subject, object, inferenceModel); - generateSameAsInferences(object, subject, inferenceModel); - } - /* - * Materializes inferences based on the owl:sameAs relationship. - * - * If it is removed that x is sameAs y, then remove y sameAs x from - * the inference graph and then recompute the inferences for x and - * y based on their respective assertions. - * that x owl:sameAs y, then all asserted and inferred - */ - protected void removedABoxSameAsAssertion(Statement stmt, Model inferenceModel) { - Resource subject = null; - Resource object = null; - - if (stmt.getSubject().isResource()) { - subject = stmt.getSubject().asResource(); - if (tboxModel.containsResource(subject) || subject.isAnon()) { - log.debug("the subject of this removed sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); - return; - } - } else { - log.warn("the subject of this removed sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); - return; - } - - if (stmt.getObject().isResource()) { - object = stmt.getObject().asResource(); - if (tboxModel.containsResource(object) || object.isAnon()) { - log.debug("the object of this removed sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); - return; - } - } else { - log.warn("the object of this removed sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); - return; - } - - List sameIndividuals = getSameIndividuals(subject,inferenceModel); - sameIndividuals.addAll(getSameIndividuals(object, inferenceModel)); - - Iterator sIter1 = sameIndividuals.iterator(); - while (sIter1.hasNext()) { - removeInferencesForIndividual(sIter1.next(), inferenceModel); - } - - Iterator sIter2 = sameIndividuals.iterator(); - while (sIter2.hasNext()) { - computeInferencesForIndividual(sIter2.next(), inferenceModel); - } - } - - /* - * - * Materializes inferences based on the owl:inverseOf relationship. - * and owl:sameAs - * - * If it is added that x prop1 y, and prop2 is an inverseOf prop1 - * then add y prop2 x to the inference graph, if it is not already in - * the assertions graph. - * - */ - protected void addedABoxAssertion(Statement stmt, Model inferenceModel) { - - if (!stmt.getObject().isLiteral()) { - List inverseProperties = getInverseProperties(stmt); - Iterator inverseIter = inverseProperties.iterator(); - - while (inverseIter.hasNext()) { - Property inverseProp = inverseIter.next(); - Statement infStmt = ResourceFactory.createStatement( - stmt.getObject().asResource(), inverseProp, stmt.getSubject()); - addInference(infStmt,inferenceModel,true); - } - } - - List sameIndividuals = getSameIndividuals(stmt.getSubject().asResource(), inferenceModel); - Iterator sameIter = sameIndividuals.iterator(); - while (sameIter.hasNext()) { - Resource subject = sameIter.next(); - Statement sameStmt = ResourceFactory.createStatement(subject,stmt.getPredicate(),stmt.getObject()); - addInference(sameStmt,inferenceModel,false); - } - - inferenceModel.enterCriticalSection(Lock.WRITE); - try { - if (inferenceModel.contains(stmt)) { - inferenceModel.remove(stmt); - } - } finally { - inferenceModel.leaveCriticalSection(); - } - } - /* * Performs incremental property-based reasoning. * @@ -655,14 +506,9 @@ public class SimpleReasoner extends StatementListener { removeInference(infStmt,inferenceModel); } } - - List sameIndividuals = getSameIndividuals(stmt.getSubject().asResource(), inferenceModel); - Iterator sameIter = sameIndividuals.iterator(); - while (sameIter.hasNext()) { - Statement stmtSame = ResourceFactory.createStatement(sameIter.next(), stmt.getPredicate(), stmt.getObject()); - removeInference(stmtSame,inferenceModel,false,true); - } - + + doSameAsForRemovedABoxAssertion( stmt, inferenceModel ); + // if a statement has been removed that is otherwise entailed, // add it to the inference graph. inferenceModel.enterCriticalSection(Lock.WRITE); @@ -672,9 +518,10 @@ public class SimpleReasoner extends StatementListener { } } finally { inferenceModel.leaveCriticalSection(); - } + } } + /* * If it is added that B is a subClass of A, then for each * individual that is typed as B, either in the ABox or in the @@ -1228,6 +1075,7 @@ public class SimpleReasoner extends StatementListener { } } + /* * Find the most specific types (classes) of an individual and * infer them for the individual with the mostSpecificType @@ -1481,15 +1329,7 @@ public class SimpleReasoner extends StatementListener { this.stopRequested = true; } - /* - * Utility method for logging - */ - public static String stmtString(Statement statement) { - return " [subject = " + statement.getSubject().getURI() + - "] [property = " + statement.getPredicate().getURI() + - "] [object = " + (statement.getObject().isLiteral() ? ((Literal)statement.getObject()).getLexicalForm() + " (Literal)" - : ((Resource)statement.getObject()).getURI() + " (Resource)") + "]"; - } + // DeltaComputer /* @@ -1685,4 +1525,179 @@ public class SimpleReasoner extends StatementListener { log.info("ending DeltaComputer.run. batchMode = " + batchMode); } } + + + + /* **** sameAs below this line **** */ + + /* + * Materializes inferences based on the owl:sameAs relationship. + * + * If it is added that x owl:sameAs y, then all asserted and inferred + * statements about x will become inferred about y if they are not already + * asserted about y, and vice versa. + */ + protected void addedABoxSameAsAssertion(Statement stmt, Model inferenceModel) { + Resource subject = null; + Resource object = null; + + if (stmt.getSubject().isResource()) { + subject = stmt.getSubject().asResource(); + if (tboxModel.containsResource(subject) || subject.isAnon()) { + log.debug("the subject of this sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); + return; + } + } else { + log.warn("the subject of this sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); + return; + } + + if (stmt.getObject().isResource()) { + object = stmt.getObject().asResource(); + if (tboxModel.containsResource(object) || object.isAnon()) { + log.debug("the object of this sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); + return; + } + } else { + log.warn("the object of this sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); + return; + } + + inferenceModel.enterCriticalSection(Lock.WRITE); + try { + if (inferenceModel.contains(stmt)) { + inferenceModel.remove(stmt); + } + } finally { + inferenceModel.leaveCriticalSection(); + } + + Statement opposite = ResourceFactory.createStatement(object, OWL.sameAs, subject); + addInference(opposite,inferenceModel,true); + + generateSameAsInferences(subject, object, inferenceModel); + generateSameAsInferences(object, subject, inferenceModel); + } + + /* + * Materializes inferences based on the owl:sameAs relationship. + * + * If it is removed that x is sameAs y, then remove y sameAs x from + * the inference graph and then recompute the inferences for x and + * y based on their respective assertions. + * that x owl:sameAs y, then all asserted and inferred + */ + protected void removedABoxSameAsAssertion(Statement stmt, Model inferenceModel) { + Resource subject = null; + Resource object = null; + + if (stmt.getSubject().isResource()) { + subject = stmt.getSubject().asResource(); + if (tboxModel.containsResource(subject) || subject.isAnon()) { + log.debug("the subject of this removed sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); + return; + } + } else { + log.warn("the subject of this removed sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); + return; + } + + if (stmt.getObject().isResource()) { + object = stmt.getObject().asResource(); + if (tboxModel.containsResource(object) || object.isAnon()) { + log.debug("the object of this removed sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); + return; + } + } else { + log.warn("the object of this removed sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); + return; + } + + List sameIndividuals = getSameIndividuals(subject,inferenceModel); + sameIndividuals.addAll(getSameIndividuals(object, inferenceModel)); + + Iterator sIter1 = sameIndividuals.iterator(); + while (sIter1.hasNext()) { + removeInferencesForIndividual(sIter1.next(), inferenceModel); + } + + Iterator sIter2 = sameIndividuals.iterator(); + while (sIter2.hasNext()) { + computeInferencesForIndividual(sIter2.next(), inferenceModel); + } + } + protected void doSameAsForAddedABoxAssertion(Statement stmt, Model inferenceModel){ + List sameIndividuals = + getSameIndividuals(stmt.getSubject().asResource(), inferenceModel); + + Iterator sameIter = sameIndividuals.iterator(); + while (sameIter.hasNext()) { + Resource subject = sameIter.next(); + Statement sameStmt = + ResourceFactory.createStatement(subject,stmt.getPredicate(),stmt.getObject()); + addInference(sameStmt,inferenceModel,false); + } + + inferenceModel.enterCriticalSection(Lock.WRITE); + try { + if (inferenceModel.contains(stmt)) { + inferenceModel.remove(stmt); + } + } finally { + inferenceModel.leaveCriticalSection(); + } + } + + + /* + * + * Materializes inferences based on the owl:inverseOf relationship. + * and owl:sameAs + * + * If it is added that x prop1 y, and prop2 is an inverseOf prop1 + * then add y prop2 x to the inference graph, if it is not already in + * the assertions graph. + * + */ + protected void addedABoxAssertion(Statement stmt, Model inferenceModel) { + + if (!stmt.getObject().isLiteral()) { + List inverseProperties = getInverseProperties(stmt); + Iterator inverseIter = inverseProperties.iterator(); + + while (inverseIter.hasNext()) { + Property inverseProp = inverseIter.next(); + Statement infStmt = ResourceFactory.createStatement( + stmt.getObject().asResource(), inverseProp, stmt.getSubject()); + addInference(infStmt,inferenceModel,true); + } + } + + doSameAsForAddedABoxAssertion( stmt, inferenceModel); + } + + void doSameAsForRemovedABoxAssertion(Statement stmt, Model inferenceModel){ + List sameIndividuals = + getSameIndividuals(stmt.getSubject().asResource(), inferenceModel); + Iterator sameIter = sameIndividuals.iterator(); + while (sameIter.hasNext()) { + Statement stmtSame = + ResourceFactory.createStatement(sameIter.next(), + stmt.getPredicate(), + stmt.getObject()); + removeInference(stmtSame,inferenceModel,false,true); + } + } + + /* + * Utility method for logging + */ + public static String stmtString(Statement statement) { + return " [subject = " + statement.getSubject().getURI() + + "] [property = " + statement.getPredicate().getURI() + + "] [object = " + (statement.getObject().isLiteral() + ? ((Literal)statement.getObject()).getLexicalForm() + " (Literal)" + : ((Resource)statement.getObject()).getURI() + " (Resource)") + "]"; + } + } From 05917378ccf177f666d00a045d887d6ba5f01e7c Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Wed, 28 Aug 2013 17:25:09 -0400 Subject: [PATCH 33/46] Adding ability to disable sameAs in SimpleReasoner. VIVO-110 --- .../vitro/webapp/reasoner/SimpleReasoner.java | 497 ++++++++++-------- .../reasoner/SimpleReasonerSameAsTest.java | 121 ++++- 2 files changed, 385 insertions(+), 233 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java index 167888227..b0cb19d29 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java @@ -158,7 +158,7 @@ public class SimpleReasoner extends StatementListener { return this.pluginList; } - public void doSameAs( boolean tf){ + public void setSameAsEnabled( boolean tf){ this.doSameAs = tf; } @@ -222,9 +222,14 @@ public class SimpleReasoner extends StatementListener { } /** + * Performs incremental ABox reasoning based + * on changes to the class hierarchy. + * * addedTBoxStatement and removedTBoxStatement use the * same tests so the are merged into this method. - */ + * + * Handles rdfs:subclassOf, owl:equivalentClass, and owl:inverseOf + */ protected void changedTBoxStatement( Statement stmt , boolean add){ try { if (!(stmt.getPredicate().equals(RDFS.subClassOf) @@ -312,7 +317,7 @@ public class SimpleReasoner extends StatementListener { } } - /* + /** * Performs incremental ABox reasoning based * on changes to the class hierarchy. * @@ -322,7 +327,7 @@ public class SimpleReasoner extends StatementListener { changedTBoxStatement( stmt, true); } - /* + /** * Performs incremental ABox reasoning based * on changes to the class hierarchy. * @@ -332,7 +337,7 @@ public class SimpleReasoner extends StatementListener { changedTBoxStatement(stmt, false); } - /* + /** * Performs incremental reasoning based on a new type assertion * added to the ABox (assertion that an individual is of a certain * type). @@ -402,7 +407,7 @@ public class SimpleReasoner extends StatementListener { } } - /* + /** * If it is removed that B is of type A, then for each superclass of A remove * the inferred statement that B is of that type UNLESS it is otherwise entailed * that B is of that type. @@ -412,7 +417,7 @@ public class SimpleReasoner extends StatementListener { removedABoxTypeAssertion(stmt, inferenceModel, null); } - /* + /** * If it is removed that B is of type A, then for each superclass of A remove * the inferred statement that B is of that type UNLESS it is otherwise entailed * that B is of that type. @@ -480,10 +485,7 @@ public class SimpleReasoner extends StatementListener { } } - - - - /* + /** * Performs incremental property-based reasoning. * * Retracts inferences based on the owl:inverseOf relationship. @@ -507,7 +509,8 @@ public class SimpleReasoner extends StatementListener { } } - doSameAsForRemovedABoxAssertion( stmt, inferenceModel ); + if( doSameAs ) + doSameAsForRemovedABoxAssertion( stmt, inferenceModel ); // if a statement has been removed that is otherwise entailed, // add it to the inference graph. @@ -522,7 +525,7 @@ public class SimpleReasoner extends StatementListener { } - /* + /** * If it is added that B is a subClass of A, then for each * individual that is typed as B, either in the ABox or in the * inferred model, infer that it is of type A. @@ -551,7 +554,7 @@ public class SimpleReasoner extends StatementListener { } } - /* + /** * If removed that B is a subclass of A, then for each individual * that is of type B, either inferred or in the ABox, remove the * assertion that it is of type A from the inferred model, @@ -593,7 +596,7 @@ public class SimpleReasoner extends StatementListener { } } - /* + /** * If it is added that P is an inverse of Q, then: * 1. For each statement involving predicate P in * the assertions model add the inverse statement @@ -624,7 +627,7 @@ public class SimpleReasoner extends StatementListener { } } - /* + /** * If it is removed that P is an inverse of Q, then: * 1. For each statement involving predicate P in * the abox assertions model remove the inverse @@ -659,7 +662,7 @@ public class SimpleReasoner extends StatementListener { } } - /* + /** * Get a list of individuals the same as the given individual */ protected List getSameIndividuals(Resource ind, Model inferenceModel) { @@ -669,8 +672,11 @@ public class SimpleReasoner extends StatementListener { Iterator iter = fullModel.listStatements(ind, OWL.sameAs, (RDFNode) null); while (iter.hasNext()) { Statement stmt = iter.next(); - if (stmt.getObject() == null || !stmt.getObject().isResource() || stmt.getObject().asResource().getURI() == null) continue; - sameIndividuals.add(stmt.getObject().asResource()); + if (stmt.getObject() != null + && stmt.getObject().isResource() + && stmt.getObject().asResource().getURI() != null) { + sameIndividuals.add(stmt.getObject().asResource()); + } } } finally { fullModel.leaveCriticalSection(); @@ -678,6 +684,164 @@ public class SimpleReasoner extends StatementListener { return sameIndividuals; } + /** + * Materializes inferences based on the owl:sameAs relationship. + * + * If it is added that x owl:sameAs y, then all asserted and inferred + * statements about x will become inferred about y if they are not already + * asserted about y, and vice versa. + */ + protected void addedABoxSameAsAssertion(Statement stmt, Model inferenceModel) { + Resource subject = null; + Resource object = null; + + if (stmt.getSubject().isResource()) { + subject = stmt.getSubject().asResource(); + if (tboxModel.containsResource(subject) || subject.isAnon()) { + log.debug("the subject of this sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); + return; + } + } else { + log.warn("the subject of this sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); + return; + } + + if (stmt.getObject().isResource()) { + object = stmt.getObject().asResource(); + if (tboxModel.containsResource(object) || object.isAnon()) { + log.debug("the object of this sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); + return; + } + } else { + log.warn("the object of this sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); + return; + } + + inferenceModel.enterCriticalSection(Lock.WRITE); + try { + if (inferenceModel.contains(stmt)) { + inferenceModel.remove(stmt); + } + } finally { + inferenceModel.leaveCriticalSection(); + } + + Statement opposite = ResourceFactory.createStatement(object, OWL.sameAs, subject); + addInference(opposite,inferenceModel,true); + + generateSameAsInferences(subject, object, inferenceModel); + generateSameAsInferences(object, subject, inferenceModel); + } + + /** + * Materializes inferences based on the owl:sameAs relationship. + * + * If it is removed that x is sameAs y, then remove y sameAs x from + * the inference graph and then recompute the inferences for x and + * y based on their respective assertions. + * that x owl:sameAs y, then all asserted and inferred + */ + protected void removedABoxSameAsAssertion(Statement stmt, Model inferenceModel) { + Resource subject = null; + Resource object = null; + + if (stmt.getSubject().isResource()) { + subject = stmt.getSubject().asResource(); + if (tboxModel.containsResource(subject) || subject.isAnon()) { + log.debug("the subject of this removed sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); + return; + } + } else { + log.warn("the subject of this removed sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); + return; + } + + if (stmt.getObject().isResource()) { + object = stmt.getObject().asResource(); + if (tboxModel.containsResource(object) || object.isAnon()) { + log.debug("the object of this removed sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); + return; + } + } else { + log.warn("the object of this removed sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); + return; + } + + List sameIndividuals = getSameIndividuals(subject,inferenceModel); + sameIndividuals.addAll(getSameIndividuals(object, inferenceModel)); + + Iterator sIter1 = sameIndividuals.iterator(); + while (sIter1.hasNext()) { + removeInferencesForIndividual(sIter1.next(), inferenceModel); + } + + Iterator sIter2 = sameIndividuals.iterator(); + while (sIter2.hasNext()) { + computeInferencesForIndividual(sIter2.next(), inferenceModel); + } + } + protected void doSameAsForAddedABoxAssertion(Statement stmt, Model inferenceModel){ + List sameIndividuals = + getSameIndividuals(stmt.getSubject().asResource(), inferenceModel); + + Iterator sameIter = sameIndividuals.iterator(); + while (sameIter.hasNext()) { + Resource subject = sameIter.next(); + Statement sameStmt = + ResourceFactory.createStatement(subject,stmt.getPredicate(),stmt.getObject()); + addInference(sameStmt,inferenceModel,false); + } + + inferenceModel.enterCriticalSection(Lock.WRITE); + try { + if (inferenceModel.contains(stmt)) { + inferenceModel.remove(stmt); + } + } finally { + inferenceModel.leaveCriticalSection(); + } + } + + + /** + * Materializes inferences based on the owl:inverseOf relationship. + * and owl:sameAs + * + * If it is added that x prop1 y, and prop2 is an inverseOf prop1 + * then add y prop2 x to the inference graph, if it is not already in + * the assertions graph. + * + */ + protected void addedABoxAssertion(Statement stmt, Model inferenceModel) { + + if (!stmt.getObject().isLiteral()) { + List inverseProperties = getInverseProperties(stmt); + Iterator inverseIter = inverseProperties.iterator(); + + while (inverseIter.hasNext()) { + Property inverseProp = inverseIter.next(); + Statement infStmt = ResourceFactory.createStatement( + stmt.getObject().asResource(), inverseProp, stmt.getSubject()); + addInference(infStmt,inferenceModel,true); + } + } + + doSameAsForAddedABoxAssertion( stmt, inferenceModel); + } + + void doSameAsForRemovedABoxAssertion(Statement stmt, Model inferenceModel){ + List sameIndividuals = + getSameIndividuals(stmt.getSubject().asResource(), inferenceModel); + Iterator sameIter = sameIndividuals.iterator(); + while (sameIter.hasNext()) { + Statement stmtSame = + ResourceFactory.createStatement(sameIter.next(), + stmt.getPredicate(), + stmt.getObject()); + removeInference(stmtSame,inferenceModel,false,true); + } + } + protected void generateSameAsInferences(Resource ind1, Resource ind2, Model inferenceModel) { OntModel unionModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); @@ -686,11 +850,13 @@ public class SimpleReasoner extends StatementListener { aboxModel.enterCriticalSection(Lock.READ); try { - Iterator iter = unionModel.listStatements(ind1, (Property) null, (RDFNode) null); + Iterator iter = + unionModel.listStatements(ind1, (Property) null, (RDFNode) null); while (iter.hasNext()) { Statement stmt = iter.next(); if (stmt.getObject() == null) continue; - Statement infStmt = ResourceFactory.createStatement(ind2,stmt.getPredicate(),stmt.getObject()); + Statement infStmt = + ResourceFactory.createStatement(ind2,stmt.getPredicate(),stmt.getObject()); addInference(infStmt, inferenceModel,true); } } finally { @@ -700,7 +866,7 @@ public class SimpleReasoner extends StatementListener { return; } - /* + /** * Remove inferences for individual */ protected void removeInferencesForIndividual(Resource ind, Model inferenceModel) { @@ -709,7 +875,8 @@ public class SimpleReasoner extends StatementListener { inferenceModel.enterCriticalSection(Lock.READ); try { - Iterator iter = inferenceModel.listStatements(ind, (Property) null, (RDFNode) null); + Iterator iter = + inferenceModel.listStatements(ind, (Property) null, (RDFNode) null); while (iter.hasNext()) { individualInferences.add(iter.next()); @@ -728,7 +895,7 @@ public class SimpleReasoner extends StatementListener { return; } - /* + /** * compute inferences for individual */ protected void computeInferencesForIndividual(Resource ind, Model inferenceModel) { @@ -749,17 +916,21 @@ public class SimpleReasoner extends StatementListener { return; } - // Returns true if it is entailed by class subsumption that - // subject is of type cls; otherwise returns false. + /** + * Returns true if it is entailed by class subsumption that + * subject is of type cls; otherwise returns false. + */ protected boolean entailedType(Resource subject, Resource cls) { return entailedType(subject, cls, null); } - // Returns true if it is entailed by class subsumption that - // subject is of type cls; otherwise returns false. - // remainingTypeURIs is an optional list of asserted type URIs for the subject - // resource, and may be null. Supplying a precompiled list can yield performance - // improvement when this method is called repeatedly for the same subject. + /** + * Returns true if it is entailed by class subsumption that + * subject is of type cls; otherwise returns false. + * remainingTypeURIs is an optional list of asserted type URIs for the subject + * resource, and may be null. Supplying a precompiled list can yield performance + * improvement when this method is called repeatedly for the same subject. + */ protected boolean entailedType(Resource subject, Resource cls, List remainingTypeURIs) { List subClasses = getSubClasses(cls); @@ -770,7 +941,8 @@ public class SimpleReasoner extends StatementListener { } } - List typeURIs = (remainingTypeURIs == null) ? getRemainingAssertedTypeURIs(subject) : remainingTypeURIs; + List typeURIs = (remainingTypeURIs == null) ? + getRemainingAssertedTypeURIs(subject) : remainingTypeURIs; for (String typeURI : typeURIs) { if (!typeURI.equals(cls.getURI()) && subClassURIs.contains(typeURI)) { @@ -814,10 +986,12 @@ public class SimpleReasoner extends StatementListener { List subClasses = new ArrayList(); tboxModel.enterCriticalSection(Lock.READ); try { - Iterator iter = tboxModel.listStatements((Resource) null, RDFS.subClassOf, cls); + Iterator iter = + tboxModel.listStatements((Resource) null, RDFS.subClassOf, cls); while (iter.hasNext()) { Statement stmt = iter.next(); - if (stmt.getSubject() == null || stmt.getSubject().asResource().getURI() == null) continue; + if (stmt.getSubject() == null + || stmt.getSubject().asResource().getURI() == null) continue; if (!subClasses.contains(stmt.getSubject())) { subClasses.add(stmt.getSubject()); } @@ -859,7 +1033,8 @@ public class SimpleReasoner extends StatementListener { iter = tboxModel.listStatements((Resource) null, OWL.equivalentClass, cls); while (iter.hasNext()) { Statement stmt = iter.next(); - if (stmt.getSubject() == null || stmt.getSubject().asResource().getURI() == null) continue; + if (stmt.getSubject() == null + || stmt.getSubject().asResource().getURI() == null) continue; if (!superClasses.contains(stmt.getSubject())) { superClasses.add(stmt.getSubject()); } @@ -870,8 +1045,10 @@ public class SimpleReasoner extends StatementListener { } } - // Returns true if the triple is entailed by inverse property - // reasoning or sameAs reasoning; otherwise returns false. + /** + * Returns true if the triple is entailed by inverse property + * reasoning or sameAs reasoning; otherwise returns false. + */ protected boolean entailedStatement(Statement stmt) { //TODO think about checking class subsumption here (for convenience) @@ -883,8 +1060,9 @@ public class SimpleReasoner extends StatementListener { try { while (iIter.hasNext()) { Property invProp = iIter.next(); - - Statement invStmt = ResourceFactory.createStatement(stmt.getObject().asResource(), invProp, stmt.getSubject()); + Statement invStmt = + ResourceFactory.createStatement(stmt.getObject().asResource(), + invProp, stmt.getSubject()); if (aboxModel.contains(invStmt)) { return true; } @@ -895,27 +1073,30 @@ public class SimpleReasoner extends StatementListener { } // individuals sameAs each other - List sameIndividuals = getSameIndividuals(stmt.getSubject().asResource(),inferenceModel); - Iterator rIter = sameIndividuals.iterator(); - if (rIter.hasNext()) { - aboxModel.enterCriticalSection(Lock.READ); - try { - while (rIter.hasNext()) { - Resource subject = rIter.next(); + if( doSameAs ){ + List sameIndividuals = + getSameIndividuals(stmt.getSubject().asResource(),inferenceModel); + Iterator rIter = sameIndividuals.iterator(); + if (rIter.hasNext()) { + aboxModel.enterCriticalSection(Lock.READ); + try { + while (rIter.hasNext()) { + Resource subject = rIter.next(); - if (aboxModel.contains(subject, stmt.getPredicate(), stmt.getObject())) { - return true; - } - } - } finally { - aboxModel.leaveCriticalSection(); - } - } + if (aboxModel.contains(subject, stmt.getPredicate(), stmt.getObject())) { + return true; + } + } + } finally { + aboxModel.leaveCriticalSection(); + } + } + } return false; } - /* + /** * Returns a list of properties that are inverses of the property * in the given statement. */ @@ -938,7 +1119,8 @@ public class SimpleReasoner extends StatementListener { } if (!stmt.getObject().isResource()) { - log.debug("The predicate of this statement is an object property, but the object is not a resource."); + log.debug("The predicate of this statement is an object property, " + +"but the object is not a resource."); return inverses; } @@ -978,7 +1160,9 @@ public class SimpleReasoner extends StatementListener { while (iter.hasNext()) { Statement stmt = iter.next(); if (!stmt.getObject().isResource()) continue; - Statement infStmt = ResourceFactory.createStatement(stmt.getObject().asResource(), inverseProp, stmt.getSubject()); + Statement infStmt = + ResourceFactory.createStatement(stmt.getObject().asResource(), + inverseProp, stmt.getSubject()); inferences.add(infStmt); } } finally { @@ -988,7 +1172,7 @@ public class SimpleReasoner extends StatementListener { return inferences; } - /* + /** * Add an inference from the inference model * * Adds the inference to the inference model if it is not already in @@ -1010,17 +1194,22 @@ public class SimpleReasoner extends StatementListener { } if (handleSameAs) { - List sameIndividuals = getSameIndividuals(infStmt.getSubject().asResource(), inferenceModel); + List sameIndividuals = + getSameIndividuals(infStmt.getSubject().asResource(), inferenceModel); Iterator sameIter = sameIndividuals.iterator(); while (sameIter.hasNext()) { Resource subject = sameIter.next(); - Statement sameStmt = ResourceFactory.createStatement(subject,infStmt.getPredicate(),infStmt.getObject()); - if (subject.equals(infStmt.getObject()) && OWL.sameAs.equals(infStmt.getPredicate())) { + Statement sameStmt = + ResourceFactory.createStatement(subject,infStmt.getPredicate(), + infStmt.getObject()); + if (subject.equals(infStmt.getObject()) + && OWL.sameAs.equals(infStmt.getPredicate())) { continue; } - if (!inferenceModel.contains(sameStmt) && !aboxModel.contains(sameStmt)) { + if (!inferenceModel.contains(sameStmt) + && !aboxModel.contains(sameStmt)) { inferenceModel.add(sameStmt); } } @@ -1033,7 +1222,7 @@ public class SimpleReasoner extends StatementListener { } } - /* + /** * Remove an inference from the inference model * * Removes the inference if it is not entailed by the abox model @@ -1050,7 +1239,9 @@ public class SimpleReasoner extends StatementListener { inferenceModel.enterCriticalSection(Lock.WRITE); try { - if ( (!checkEntailment || !entailedStatement(infStmt)) && inferenceModel.contains(infStmt)) { + if ( (!checkEntailment + || !entailedStatement(infStmt)) + && inferenceModel.contains(infStmt)) { inferenceModel.remove(infStmt); } } finally { @@ -1060,12 +1251,17 @@ public class SimpleReasoner extends StatementListener { if (handleSameAs) { inferenceModel.enterCriticalSection(Lock.WRITE); try { - List sameIndividuals = getSameIndividuals(infStmt.getSubject().asResource(), inferenceModel); + List sameIndividuals = + getSameIndividuals(infStmt.getSubject().asResource(), inferenceModel); Iterator sameIter = sameIndividuals.iterator(); while (sameIter.hasNext()) { - Statement infStmtSame = ResourceFactory.createStatement(sameIter.next(), infStmt.getPredicate(), infStmt.getObject()); - if ((!checkEntailment || !entailedStatement(infStmtSame)) && inferenceModel.contains(infStmtSame)) { + Statement infStmtSame = + ResourceFactory.createStatement(sameIter.next(), + infStmt.getPredicate(), infStmt.getObject()); + if ((!checkEntailment + || !entailedStatement(infStmtSame)) + && inferenceModel.contains(infStmtSame)) { inferenceModel.remove(infStmtSame); } } @@ -1076,7 +1272,7 @@ public class SimpleReasoner extends StatementListener { } - /* + /** * Find the most specific types (classes) of an individual and * infer them for the individual with the mostSpecificType * annotation. @@ -1332,7 +1528,7 @@ public class SimpleReasoner extends StatementListener { // DeltaComputer - /* + /** * Asynchronous reasoning mode (DeltaComputer) is used in the case of batch removals. */ public boolean isABoxReasoningAsynchronous() { @@ -1528,168 +1724,7 @@ public class SimpleReasoner extends StatementListener { - /* **** sameAs below this line **** */ - - /* - * Materializes inferences based on the owl:sameAs relationship. - * - * If it is added that x owl:sameAs y, then all asserted and inferred - * statements about x will become inferred about y if they are not already - * asserted about y, and vice versa. - */ - protected void addedABoxSameAsAssertion(Statement stmt, Model inferenceModel) { - Resource subject = null; - Resource object = null; - - if (stmt.getSubject().isResource()) { - subject = stmt.getSubject().asResource(); - if (tboxModel.containsResource(subject) || subject.isAnon()) { - log.debug("the subject of this sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); - return; - } - } else { - log.warn("the subject of this sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); - return; - } - - if (stmt.getObject().isResource()) { - object = stmt.getObject().asResource(); - if (tboxModel.containsResource(object) || object.isAnon()) { - log.debug("the object of this sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); - return; - } - } else { - log.warn("the object of this sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); - return; - } - - inferenceModel.enterCriticalSection(Lock.WRITE); - try { - if (inferenceModel.contains(stmt)) { - inferenceModel.remove(stmt); - } - } finally { - inferenceModel.leaveCriticalSection(); - } - - Statement opposite = ResourceFactory.createStatement(object, OWL.sameAs, subject); - addInference(opposite,inferenceModel,true); - - generateSameAsInferences(subject, object, inferenceModel); - generateSameAsInferences(object, subject, inferenceModel); - } - - /* - * Materializes inferences based on the owl:sameAs relationship. - * - * If it is removed that x is sameAs y, then remove y sameAs x from - * the inference graph and then recompute the inferences for x and - * y based on their respective assertions. - * that x owl:sameAs y, then all asserted and inferred - */ - protected void removedABoxSameAsAssertion(Statement stmt, Model inferenceModel) { - Resource subject = null; - Resource object = null; - - if (stmt.getSubject().isResource()) { - subject = stmt.getSubject().asResource(); - if (tboxModel.containsResource(subject) || subject.isAnon()) { - log.debug("the subject of this removed sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); - return; - } - } else { - log.warn("the subject of this removed sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); - return; - } - - if (stmt.getObject().isResource()) { - object = stmt.getObject().asResource(); - if (tboxModel.containsResource(object) || object.isAnon()) { - log.debug("the object of this removed sameAs statement is either in the tbox or an anonymous node, no reasoning will be done: " + stmtString(stmt)); - return; - } - } else { - log.warn("the object of this removed sameAs statement is not a resource, no reasoning will be done: " + stmtString(stmt)); - return; - } - - List sameIndividuals = getSameIndividuals(subject,inferenceModel); - sameIndividuals.addAll(getSameIndividuals(object, inferenceModel)); - - Iterator sIter1 = sameIndividuals.iterator(); - while (sIter1.hasNext()) { - removeInferencesForIndividual(sIter1.next(), inferenceModel); - } - - Iterator sIter2 = sameIndividuals.iterator(); - while (sIter2.hasNext()) { - computeInferencesForIndividual(sIter2.next(), inferenceModel); - } - } - protected void doSameAsForAddedABoxAssertion(Statement stmt, Model inferenceModel){ - List sameIndividuals = - getSameIndividuals(stmt.getSubject().asResource(), inferenceModel); - - Iterator sameIter = sameIndividuals.iterator(); - while (sameIter.hasNext()) { - Resource subject = sameIter.next(); - Statement sameStmt = - ResourceFactory.createStatement(subject,stmt.getPredicate(),stmt.getObject()); - addInference(sameStmt,inferenceModel,false); - } - - inferenceModel.enterCriticalSection(Lock.WRITE); - try { - if (inferenceModel.contains(stmt)) { - inferenceModel.remove(stmt); - } - } finally { - inferenceModel.leaveCriticalSection(); - } - } - - - /* - * - * Materializes inferences based on the owl:inverseOf relationship. - * and owl:sameAs - * - * If it is added that x prop1 y, and prop2 is an inverseOf prop1 - * then add y prop2 x to the inference graph, if it is not already in - * the assertions graph. - * - */ - protected void addedABoxAssertion(Statement stmt, Model inferenceModel) { - - if (!stmt.getObject().isLiteral()) { - List inverseProperties = getInverseProperties(stmt); - Iterator inverseIter = inverseProperties.iterator(); - - while (inverseIter.hasNext()) { - Property inverseProp = inverseIter.next(); - Statement infStmt = ResourceFactory.createStatement( - stmt.getObject().asResource(), inverseProp, stmt.getSubject()); - addInference(infStmt,inferenceModel,true); - } - } - - doSameAsForAddedABoxAssertion( stmt, inferenceModel); - } - - void doSameAsForRemovedABoxAssertion(Statement stmt, Model inferenceModel){ - List sameIndividuals = - getSameIndividuals(stmt.getSubject().asResource(), inferenceModel); - Iterator sameIter = sameIndividuals.iterator(); - while (sameIter.hasNext()) { - Statement stmtSame = - ResourceFactory.createStatement(sameIter.next(), - stmt.getPredicate(), - stmt.getObject()); - removeInference(stmtSame,inferenceModel,false,true); - } - } - - /* + /** * Utility method for logging */ public static String stmtString(Statement statement) { diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerSameAsTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerSameAsTest.java index 493a7d60a..c3b485803 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerSameAsTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerSameAsTest.java @@ -91,6 +91,37 @@ public class SimpleReasonerSameAsTest extends AbstractTestClass { Assert.assertFalse(aBox.contains(b,S,literal1)); Assert.assertFalse(aBox.contains(a,Q,d)); Assert.assertFalse(aBox.contains(a,T,literal2)); + + //run same test with sameAs = false + inf = ModelFactory.createDefaultModel(); + aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); + SimpleReasoner sres = new SimpleReasoner(tBox,aBox,inf); + sres.setSameAsEnabled( false ); + aBox.register(sres); + + a = aBox.createResource("http://test.vivo/a"); + b = aBox.createResource("http://test.vivo/b"); + c = aBox.createResource("http://test.vivo/c"); + d = aBox.createResource("http://test.vivo/d"); + + aBox.add(a,P,c); + aBox.add(a,S,literal1); + aBox.add(b,Q,d); + aBox.add(b,T,literal2); + aBox.add(a,OWL.sameAs,b); + + //these are now false since sameAs is off + Assert.assertFalse(inf.contains(b,OWL.sameAs,a)); + Assert.assertFalse(inf.contains(b,P,c)); + Assert.assertFalse(inf.contains(b,S,literal1)); + Assert.assertFalse(inf.contains(a,Q,d)); + Assert.assertFalse(inf.contains(a,T,literal2)); + //these still shouldn't be in the abox + Assert.assertFalse(aBox.contains(b,OWL.sameAs,a)); + Assert.assertFalse(aBox.contains(b,P,c)); + Assert.assertFalse(aBox.contains(b,S,literal1)); + Assert.assertFalse(aBox.contains(a,Q,d)); + Assert.assertFalse(aBox.contains(a,T,literal2)); } /* @@ -246,7 +277,93 @@ public class SimpleReasonerSameAsTest extends AbstractTestClass { Assert.assertFalse(inf.contains(f,Q,d)); Assert.assertFalse(inf.contains(f,T,literal2)); } - + + /** + * test of enableSameAs( false ) + */ + @Test + public void disabledSameAs() { + + OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); + + OntProperty P = tBox.createObjectProperty("http://test.vivo/P"); + P.setLabel("property P", "en-US"); + + OntProperty Q = tBox.createObjectProperty("http://test.vivo/Q"); + Q.setLabel("property Q", "en-US"); + + OntProperty S = tBox.createDatatypeProperty("http://test.vivo/"); + S.setLabel("property S", "en-US"); + + OntProperty T = tBox.createDatatypeProperty("http://test.vivo/"); + T.setLabel("property T", "en-US"); + + Literal literal1 = tBox.createLiteral("Literal value 1"); + Literal literal2 = tBox.createLiteral("Literal value 2"); + + // this is the model to receive inferences + Model inf = ModelFactory.createDefaultModel(); + + // create an ABox and register the SimpleReasoner listener with it + OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); + aBox.register(new SimpleReasoner(tBox, aBox, inf)); + + // Individuals a, b, c and d + Resource a = aBox.createResource("http://test.vivo/a"); + Resource b = aBox.createResource("http://test.vivo/b"); + Resource c = aBox.createResource("http://test.vivo/c"); + Resource d = aBox.createResource("http://test.vivo/d"); + + aBox.add(a,P,c); + aBox.add(a,S,literal1); + aBox.add(b,Q,d); + aBox.add(b,T,literal2); + aBox.add(a,OWL.sameAs,b); + + Assert.assertTrue(inf.contains(b,OWL.sameAs,a)); + Assert.assertTrue(inf.contains(b,P,c)); + Assert.assertTrue(inf.contains(b,S,literal1)); + Assert.assertTrue(inf.contains(a,Q,d)); + Assert.assertTrue(inf.contains(a,T,literal2)); + + Assert.assertFalse(aBox.contains(b,OWL.sameAs,a)); + Assert.assertFalse(aBox.contains(b,P,c)); + Assert.assertFalse(aBox.contains(b,S,literal1)); + Assert.assertFalse(aBox.contains(a,Q,d)); + Assert.assertFalse(aBox.contains(a,T,literal2)); + + //run same test with sameAs = false + inf = ModelFactory.createDefaultModel(); + aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); + SimpleReasoner sres = new SimpleReasoner(tBox,aBox,inf); + sres.setSameAsEnabled( false ); + aBox.register(sres); + + a = aBox.createResource("http://test.vivo/a"); + b = aBox.createResource("http://test.vivo/b"); + c = aBox.createResource("http://test.vivo/c"); + d = aBox.createResource("http://test.vivo/d"); + + aBox.add(a,P,c); + aBox.add(a,S,literal1); + aBox.add(b,Q,d); + aBox.add(b,T,literal2); + aBox.add(a,OWL.sameAs,b); + + //these are now false since sameAs is off + Assert.assertFalse(inf.contains(b,OWL.sameAs,a)); + Assert.assertFalse(inf.contains(b,P,c)); + Assert.assertFalse(inf.contains(b,S,literal1)); + Assert.assertFalse(inf.contains(a,Q,d)); + Assert.assertFalse(inf.contains(a,T,literal2)); + //these still shouldn't be in the abox + Assert.assertFalse(aBox.contains(b,OWL.sameAs,a)); + Assert.assertFalse(aBox.contains(b,P,c)); + Assert.assertFalse(aBox.contains(b,S,literal1)); + Assert.assertFalse(aBox.contains(a,Q,d)); + Assert.assertFalse(aBox.contains(a,T,literal2)); + } + /* * sameAs with datatype properties */ @@ -723,4 +840,4 @@ public class SimpleReasonerSameAsTest extends AbstractTestClass { ontModel.writeAll(System.out,"N3",null); } -} \ No newline at end of file +} From 446df7c09410004c4a735255dbf68c064a2568d4 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Thu, 29 Aug 2013 13:14:15 -0400 Subject: [PATCH 34/46] Adding more tests of SimpleReasoner with sameAs disabled. VIVO-110 --- .../SimpleReasonerInversePropertyTest.java | 174 ++++++++++++--- .../webapp/reasoner/SimpleReasonerTest.java | 203 ++++++++++++++---- 2 files changed, 303 insertions(+), 74 deletions(-) diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerInversePropertyTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerInversePropertyTest.java index de3b0ff0b..e0f81bb74 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerInversePropertyTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerInversePropertyTest.java @@ -31,6 +31,16 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { setLoggerLevel(ABoxRecomputer.class, Level.OFF); } + @Test + public void addABoxAssertion1Test(){ + addABoxAssertion1(true); + } + + @Test + public void addABoxAssertion1NoSameAsTest(){ + addABoxAssertion1(false); + } + /* * basic scenarios around adding abox data * @@ -40,8 +50,7 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { * Add a statement c Q d and verify that d Q c * is inferred. */ - @Test - public void addABoxAssertion1() { + public void addABoxAssertion1(boolean sameAs ) { // set up the tbox OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -57,7 +66,11 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { // create an abox and register the SimpleReasoner listener with it OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - aBox.register(new SimpleReasoner(tBox, aBox, inf)); + + SimpleReasoner sr = new SimpleReasoner(tBox,aBox,inf); + sr.setSameAsEnabled( sameAs ); + + aBox.register( sr ); // add assertions to the abox and verify inferences Resource a = aBox.createResource("http://test.vivo/a"); @@ -68,15 +81,24 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { aBox.add(a,P,b); Assert.assertTrue(inf.contains(b,Q,a)); aBox.add(c,Q,d); - Assert.assertTrue(inf.contains(d,P,c)); + Assert.assertTrue(inf.contains(d,P,c)); } - + + @Test + public void addABoxAssertion2Test() { + addABoxAssertion2(true); + } + + @Test + public void addABoxAssertion2NoSameAsTest() { + addABoxAssertion2(false); + } + /* * don't infer statements already in the abox * (never infer because it's in the abox already) */ - @Test - public void addABoxAssertion2() { + public void addABoxAssertion2(boolean sameAs ) { // set up the tbox OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -107,12 +129,20 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { Assert.assertFalse(inf.contains(b,Q,a)); } + @Test + public void addABoxAssertion3Test() { + addABoxAssertion3(true); + } + @Test + public void addABoxAssertion3NoSameAsTest(){ + addABoxAssertion3(false); + } + /* * don't infer statements already in the abox * (remove the inference when it is asserted) */ - @Test - public void addABoxAssertion3() { + public void addABoxAssertion3(boolean sameAs) { // set up the tbox OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -127,7 +157,11 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { // create abox and register SimpleReasoner OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - aBox.register(new SimpleReasoner(tBox, aBox, inf)); + + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( sameAs ); + + aBox.register( sr ); // add statements to the abox and verify inferences Resource a = aBox.createResource("http://test.vivo/a"); @@ -138,13 +172,21 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { aBox.add(b,Q,a); // this should cause the inference to be removed Assert.assertFalse(inf.contains(b,Q,a)); } - + + @Test + public void addABoxAssertion4Test() { + addABoxAssertion4(true); + } + @Test + public void addABoxAssertion4NoSameAsTest() { + addABoxAssertion4(false); + } + /* * adding abox data where the property has an inverse and * and equivalent property. */ - @Test - public void addABoxAssertion4() { + public void addABoxAssertion4( boolean sameAs ) { // set up the tbox OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -163,7 +205,10 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { // create an ABox and register the SimpleReasoner with it OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - aBox.register(new SimpleReasoner(tBox, aBox, inf)); + + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( sameAs ); + aBox.register( sr ); // add abox statements and verify inferences Resource a = aBox.createResource("http://test.vivo/a"); @@ -179,13 +224,22 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { Assert.assertTrue(inf.contains(d,R,c)); } + @Test + public void removedABoxAssertion1Test(){ + removedABoxAssertion1(true); + } + + @Test + public void removedABoxAssertion1NoSameAsTest(){ + removedABoxAssertion1(false); + } + /* * basic scenarios around removing abox data * don't remove an inference if it's still * entailed by something else in the abox. */ - @Test - public void removedABoxAssertion1() { + public void removedABoxAssertion1(boolean sameAs) { // set up the tbox OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -203,7 +257,9 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { // create an ABox and register the SimpleReasoner with it OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - aBox.register(new SimpleReasoner(tBox, aBox, inf)); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( sameAs ); + aBox.register( sr ); // add statements to the abox and verify inferences Resource a = aBox.createResource("http://test.vivo/a"); @@ -226,12 +282,21 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { Assert.assertTrue(inf.contains(d,P,c)); // still inferred from c T d } + @Test + public void removedABoxAssertion2Test(){ + removedABoxAssertion2(true); + } + + @Test + public void removedABoxAssertion2NoSameAsTest(){ + removedABoxAssertion2(false); + } + /* * removing abox data with equivalent and inverse properties * don't remove inference if it's still inferred. */ - @Test - public void removedABoxAssertion2() { + public void removedABoxAssertion2(boolean sameAs) { // set up the tbox OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -253,7 +318,9 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { // create an abox and register the SimpleReasoner listener with it OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - aBox.register(new SimpleReasoner(tBox, aBox, inf)); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( sameAs ); + aBox.register( sr ); // add abox data and verify inferences Resource a = aBox.createResource("http://test.vivo/a"); @@ -270,11 +337,20 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { Assert.assertTrue(inf.contains(b,Q,a)); } + @Test + public void removedABoxAssertion3Test(){ + removedABoxAssertion3(true); + } + + @Test + public void removedABoxAssertion3NoSameAsTest(){ + removedABoxAssertion3(false); + } + /* * removing abox data with equivalent and inverse properties */ - @Test - public void removedABoxAssertion3() { + public void removedABoxAssertion3(boolean sameAs) { //set up the tbox OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -297,7 +373,9 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { aBox.add(a,P,b); // register the SimpleReasoner - aBox.register(new SimpleReasoner(tBox, aBox, inf)); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( sameAs ); + aBox.register( sr ); // add abox statements and verify inferences aBox.add(b,Q,a); @@ -309,11 +387,20 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { // when it's removed from the abox } + @Test + public void addTBoxInverseAssertion1Test() throws InterruptedException { + addTBoxInverseAssertion1(true); + } + + @Test + public void addTBoxInverseAssertion1NoSameAsTest() throws InterruptedException { + addTBoxInverseAssertion1(false); + } + /* * adding an inverseOf assertion to the tbox */ - @Test - public void addTBoxInverseAssertion1() throws InterruptedException { + public void addTBoxInverseAssertion1(boolean sameAs) throws InterruptedException { // Set up the TBox. OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -330,7 +417,8 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { // set up SimpleReasoner and register it with abox. register // SimpleReasonerTBoxListener with the tbox. - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf ); + simpleReasoner.setSameAsEnabled( sameAs ); aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -361,12 +449,21 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { simpleReasonerTBoxListener.setStopRequested(); } - + + @Test + public void removeTBoxInverseAssertion1Test() throws InterruptedException { + removeTBoxInverseAssertion1(true); + } + + @Test + public void removeTBoxInverseAssertion1NoSameAsTest() throws InterruptedException { + removeTBoxInverseAssertion1(false); + } + /* * removing an inverseOf assertion from the tbox */ - @Test - public void removeTBoxInverseAssertion1() throws InterruptedException { + public void removeTBoxInverseAssertion1(boolean sameAs) throws InterruptedException { // set up the tbox. OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -385,7 +482,8 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { // set up SimpleReasoner and SimpleReasonerTBox listener, // register them with abox and tbox - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + simpleReasoner.setSameAsEnabled( sameAs ); aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -411,11 +509,20 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { simpleReasonerTBoxListener.setStopRequested(); } + @Test + public void recomputeABox1Test() throws InterruptedException { + recomputeABox1(true); + } + + @Test + public void recomputeABox1NoSameAsTest() throws InterruptedException { + recomputeABox1(false); + } + /* * Basic scenario around recomputing the ABox inferences */ - @Test - public void recomputeABox1() throws InterruptedException { + public void recomputeABox1(boolean sameAs) throws InterruptedException { // set up tbox OntModel tBox = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); @@ -437,6 +544,7 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + simpleReasoner.setSameAsEnabled( sameAs ); aBox.register(simpleReasoner); // abox statements @@ -487,4 +595,4 @@ public class SimpleReasonerInversePropertyTest extends AbstractTestClass { ontModel.writeAll(System.out,"N3",null); } -} \ No newline at end of file +} diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerTest.java index 0c6427377..7b17d1303 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasonerTest.java @@ -2,10 +2,10 @@ package edu.cornell.mannlib.vitro.webapp.reasoner; - import org.apache.log4j.Level; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.mindswap.pellet.jena.PelletReasonerFactory; @@ -38,12 +38,20 @@ public class SimpleReasonerTest extends AbstractTestClass { setLoggerLevel(SimpleReasonerTBoxListener.class, Level.OFF); } + @Test + public void addABoxTypeAssertion1Test(){ + addABoxTypeAssertion1(true); + } + + @Test + public void addABoxTypeAssertion1NoSameAsTest(){ + addABoxTypeAssertion1(false); + } /* * Test that when an individual is asserted to be of a type, * its asserted type is not added to the inference graph */ - @Test - public void addABoxTypeAssertion1(){ + public void addABoxTypeAssertion1( boolean sameAsEnabled ){ // Create a Tbox with a simple class hierarchy. B is a subclass of A. // Pellet will compute TBox inferences @@ -62,7 +70,9 @@ public class SimpleReasonerTest extends AbstractTestClass { // create an ABox and register the SimpleReasoner listener with it OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - aBox.register(new SimpleReasoner(tBox, aBox, inf)); + SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + simpleReasoner.setSameAsEnabled( sameAsEnabled ); + aBox.register(simpleReasoner); // Individual x Resource ind_x = aBox.createResource("http://test.vivo/x"); @@ -75,13 +85,20 @@ public class SimpleReasonerTest extends AbstractTestClass { Assert.assertFalse(inf.contains(xisb)); } + @Test + public void addABoxTypeAssertion2Test(){ + addABoxTypeAssertion2(true); + } + @Test + public void addABoxTypeAssertion2NoSameAs(){ + addABoxTypeAssertion2(false); + } /* * Test that when an individual is asserted have a type, * that inferences are materialized that it has the types * of its superclasses */ - @Test - public void addABoxTypeAssertion2(){ + public void addABoxTypeAssertion2(boolean enableSameAs){ // Create a Tbox with a simple class hierarchy. D and E are subclasses // of C. B and C are subclasses of A. Pellet will compute TBox inferences. @@ -113,7 +130,9 @@ public class SimpleReasonerTest extends AbstractTestClass { // create an Abox and register the SimpleReasoner listener with it OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - aBox.register(new SimpleReasoner(tBox, aBox, inf)); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + aBox.register( sr ); // add a statement to the ABox that individual x is of type E. Resource ind_x = aBox.createResource("http://test.vivo/x"); @@ -128,11 +147,18 @@ public class SimpleReasonerTest extends AbstractTestClass { Assert.assertTrue(inf.contains(xisa)); } + @Test + public void addABoxTypeAssertion3Test() throws InterruptedException{ + addABoxTypeAssertion3(true); + } + @Test + public void addABoxTypeAssertion3NoSameAs() throws InterruptedException{ + addABoxTypeAssertion3(false); + } /* * Test inference based on class equivalence */ - @Test - public void addABoxTypeAssertion3() throws InterruptedException { + public void addABoxTypeAssertion3(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox @@ -142,7 +168,9 @@ public class SimpleReasonerTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + SimpleReasoner simpleReasoner = sr ; aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -182,11 +210,18 @@ public class SimpleReasonerTest extends AbstractTestClass { simpleReasonerTBoxListener.setStopRequested();; } + @Test + public void addABoxTypeAssertion4Test()throws InterruptedException{ + addABoxTypeAssertion4(true); + } + @Test + public void addABoxTypeAssertion4NoSameAs()throws InterruptedException{ + addABoxTypeAssertion4(false); + } /* * Test inference based on class equivalence */ - @Test - public void addABoxTypeAssertion4() throws InterruptedException { + public void addABoxTypeAssertion4(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox @@ -196,7 +231,9 @@ public class SimpleReasonerTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + SimpleReasoner simpleReasoner = sr ; aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -228,11 +265,18 @@ public class SimpleReasonerTest extends AbstractTestClass { } + @Test + public void addABoxTypeAssertion5Test()throws InterruptedException{ + addABoxTypeAssertion5(true); + } + @Test + public void addABoxTypeAssertion5NoSameAs()throws InterruptedException{ + addABoxTypeAssertion5(false); + } /* * Test inference based on class equivalence */ - @Test - public void addABoxTypeAssertion5() throws InterruptedException { + public void addABoxTypeAssertion5(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox @@ -242,7 +286,9 @@ public class SimpleReasonerTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + SimpleReasoner simpleReasoner = sr ; aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -279,6 +325,14 @@ public class SimpleReasonerTest extends AbstractTestClass { simpleReasonerTBoxListener.setStopRequested(); } + @Test + public void removeABoxTypeAssertion1Test()throws InterruptedException{ + removeABoxTypeAssertion1(true); + } + @Test + public void removeABoxTypeAssertion1NoSameAs()throws InterruptedException{ + removeABoxTypeAssertion1(false); + } /* * Test that when it is retracted that an individual is of a type, * that the inferences that it is of the type of all superclasses @@ -287,8 +341,7 @@ public class SimpleReasonerTest extends AbstractTestClass { * TBox, ABox and inference graph minus the retracted type statement) * should not be retracted. */ - @Test - public void removeABoxTypeAssertion1(){ + public void removeABoxTypeAssertion1(boolean enableSameAs){ // Create a Tbox with a simple class hierarchy. C is a subclass of B // and B is a subclass of A. Pellet will compute TBox inferences. @@ -312,7 +365,9 @@ public class SimpleReasonerTest extends AbstractTestClass { // create an Abox and register the SimpleReasoner listener with it OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); - aBox.register(new SimpleReasoner(tBox, aBox, inf)); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + aBox.register( sr ); // add a statement to the ABox that individual x is of type C. Resource ind_x = aBox.createResource("http://test.vivo/x"); @@ -335,6 +390,14 @@ public class SimpleReasonerTest extends AbstractTestClass { } + @Test + public void addTBoxSubClassAssertion1Test()throws InterruptedException{ + addTBoxSubClassAssertion1(true); + } + @Test + public void addTBoxSubClassAssertion1NoSameAs()throws InterruptedException{ + addTBoxSubClassAssertion1(false); + } /* * Test the addition of a subClassOf statement to * the TBox. The instance data that is the basis @@ -351,8 +414,7 @@ public class SimpleReasonerTest extends AbstractTestClass { * rdfs:subClassOf statement, this test serves * as a test of equivalentClass statements also. */ - @Test - public void addTBoxSubClassAssertion1() throws InterruptedException { + public void addTBoxSubClassAssertion1(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox @@ -362,7 +424,9 @@ public class SimpleReasonerTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + SimpleReasoner simpleReasoner = sr ; aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -408,6 +472,14 @@ public class SimpleReasonerTest extends AbstractTestClass { simpleReasonerTBoxListener.setStopRequested(); } + @Test + public void addTBoxSubClassAssertion2Test()throws InterruptedException{ + addTBoxSubClassAssertion2(true); + } + @Test + public void addTBoxSubClassAssertion2NoSameAs()throws InterruptedException{ + addTBoxSubClassAssertion2(false); + } /* * Test the addition of a subClassOf statement to * the TBox. The instance data that is the basis @@ -424,8 +496,7 @@ public class SimpleReasonerTest extends AbstractTestClass { * as some test of equivalentClass statements also. * */ - @Test - public void addTBoxSubClassAssertion2() throws InterruptedException { + public void addTBoxSubClassAssertion2(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox @@ -435,7 +506,9 @@ public class SimpleReasonerTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + SimpleReasoner simpleReasoner = sr ; aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -480,6 +553,14 @@ public class SimpleReasonerTest extends AbstractTestClass { } + @Test + public void removeTBoxSubClassAssertion1Test()throws InterruptedException{ + removeTBoxSubClassAssertion1(true); + } + @Test + public void removeTBoxSubClassAssertion1NoSameAs()throws InterruptedException{ + removeTBoxSubClassAssertion1(false); + } /* * Test the removal of a subClassOf statement from * the TBox. The instance data that is the basis @@ -487,8 +568,7 @@ public class SimpleReasonerTest extends AbstractTestClass { * inference graph. * */ - @Test - public void removeTBoxSubClassAssertion1() throws InterruptedException { + public void removeTBoxSubClassAssertion1(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox // Pellet will compute TBox inferences @@ -497,7 +577,9 @@ public class SimpleReasonerTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + SimpleReasoner simpleReasoner = sr ; aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -582,6 +664,17 @@ public class SimpleReasonerTest extends AbstractTestClass { simpleReasonerTBoxListener.setStopRequested(); } + @Ignore(" needs PelletListener infrastructure which is not in this suite.") + @Test + public void bcdTest()throws InterruptedException{ + bcd(true); + } + + @Ignore(" needs PelletListener infrastructure which is not in this suite.") + @Test + public void bcdNoSameAsTest()throws InterruptedException{ + bcd(false); + } /* * Test the removal of a subClassOf statement from * the TBox. The instance data that is the basis @@ -589,12 +682,12 @@ public class SimpleReasonerTest extends AbstractTestClass { * inference graph. * */ - //@Test - this test would need PelletListener infrastructure, which we're not + // this test would need PelletListener infrastructure, which we're not // testing in this suite. The reason it doesn't work as it is because // the SimpleReasonerTBoxListener is not listening to the tBox inference // model as Pellet is updating it. I could simulate it by adding to the // tBox assertions what we can count on Pellet to infer. - public void bcdTest() throws InterruptedException { + public void bcd(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox // Pellet will compute TBox inferences @@ -604,6 +697,7 @@ public class SimpleReasonerTest extends AbstractTestClass { Model inf = ModelFactory.createDefaultModel(); SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + simpleReasoner.setSameAsEnabled( enableSameAs ); aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -654,12 +748,19 @@ public class SimpleReasonerTest extends AbstractTestClass { simpleReasonerTBoxListener.setStopRequested(); } + @Test + public void mstTest1Test()throws InterruptedException{ + mstTest1(true); + } + @Test + public void mstTest1NoSameAs()throws InterruptedException{ + mstTest1(false); + } /* * Test computation of mostSpecificType annotations in response * to an added/removed ABox type assertion. */ - @Test - public void mstTest1() throws InterruptedException { + public void mstTest1(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox // Pellet will compute TBox inferences @@ -668,7 +769,9 @@ public class SimpleReasonerTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + SimpleReasoner simpleReasoner = sr ; aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -732,12 +835,19 @@ public class SimpleReasonerTest extends AbstractTestClass { } + @Test + public void mstTest2Test()throws InterruptedException{ + mstTest2(true); + } + @Test + public void mstTest2NoSameAs()throws InterruptedException{ + mstTest2(false); + } /* * Test computation of mostSpecificType annotations in response * to an added ABox type assertion. */ - @Test - public void mstTest2() throws InterruptedException { + public void mstTest2(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox // Pellet will compute TBox inferences @@ -746,7 +856,9 @@ public class SimpleReasonerTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + SimpleReasoner simpleReasoner = sr ; aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -785,13 +897,20 @@ public class SimpleReasonerTest extends AbstractTestClass { simpleReasonerTBoxListener.setStopRequested(); } - + + @Test + public void mstTest3Test()throws InterruptedException{ + mstTest3(true); + } + @Test + public void mstTest3NoSameAs()throws InterruptedException{ + mstTest3(false); + } /* * Test computation of mostSpecificType annotations in response * to an added/removed TBox assertions. */ - @Test - public void mstTest3() throws InterruptedException { + public void mstTest3(boolean enableSameAs) throws InterruptedException { // Create TBox, ABox and Inference models and register // the ABox reasoner listeners with the ABox and TBox // Pellet will compute TBox inferences @@ -800,7 +919,9 @@ public class SimpleReasonerTest extends AbstractTestClass { OntModel aBox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); Model inf = ModelFactory.createDefaultModel(); - SimpleReasoner simpleReasoner = new SimpleReasoner(tBox, aBox, inf); + SimpleReasoner sr = new SimpleReasoner(tBox, aBox, inf); + sr.setSameAsEnabled( enableSameAs ); + SimpleReasoner simpleReasoner = sr ; aBox.register(simpleReasoner); SimpleReasonerTBoxListener simpleReasonerTBoxListener = getTBoxListener(simpleReasoner); tBox.register(simpleReasonerTBoxListener); @@ -906,4 +1027,4 @@ public class SimpleReasonerTest extends AbstractTestClass { ontModel.writeAll(System.out,"N3",null); } -} \ No newline at end of file +} From 3431e64ae87366e0efea8e308c85c75b718cc4de Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Thu, 29 Aug 2013 13:20:10 -0400 Subject: [PATCH 35/46] Adding plugin to disable sameAs in SimpleReasoner. VIVO-110 --- .../webapp/reasoner/plugin/DisableSameAs.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/plugin/DisableSameAs.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/plugin/DisableSameAs.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/plugin/DisableSameAs.java new file mode 100644 index 000000000..15c34a98b --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/plugin/DisableSameAs.java @@ -0,0 +1,54 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.reasoner.plugin; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import edu.cornell.mannlib.vitro.webapp.reasoner.ReasonerPlugin; +import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasoner; + +/** + * Disables sameAs in associated SimpleReasoner. + */ +public abstract class DisableSameAs implements ReasonerPlugin { + + private static final Log log = LogFactory.getLog(DisableSameAs.class); + + private SimpleReasoner simpleReasoner; + + public void setSimpleReasoner(SimpleReasoner simpleReasoner) { + this.simpleReasoner = simpleReasoner; + this.simpleReasoner.setSameAsEnabled( false ); + log.info("owl:sameAs disabled in SimpleReasoner."); + } + + public SimpleReasoner getSimpleReasoner() { + return this.simpleReasoner; + } + + public boolean isInterestedInAddedStatement(Statement stmt) { + return false; + } + + public boolean isInterestedInRemovedStatement(Statement stmt) { + return false; + } + + public void addedABoxStatement(Statement stmt, + Model aboxAssertionsModel, + Model aboxInferencesModel, + OntModel TBoxInferencesModel) { + return; + } + + + public void removedABoxStatement(Statement stmt, + Model aboxAssertionsModel, + Model aboxInferencesModel, + OntModel TBoxInferencesModel) { + return; + } + +} + From fd8dcf6dffaaa59a1d1023e10b1da51aa62727c9 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Thu, 29 Aug 2013 14:56:20 -0400 Subject: [PATCH 36/46] fixing compile problem. issue-vivo-110 --- .../vitro/webapp/controller/freemarker/UrlBuilderTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java index 9f3e87004..56ee04719 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java @@ -76,4 +76,6 @@ public class UrlBuilderTest extends AbstractTestClass { String vClassUriEncoded = "http%3A%2F%2Fvivoweb.org%2Fontology%2Fcore%23FacultyMember%E2%98%85"; Assert.assertEquals(vClassUri, UrlBuilder.urlDecode(vClassUriEncoded)); } + + } From 535500dd410d2ff20b32362406835b53591fd28d Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Thu, 29 Aug 2013 15:08:45 -0400 Subject: [PATCH 37/46] fixing compile problem. issue-vivo-110 --- .../mannlib/vitro/webapp/reasoner/plugin/DisableSameAs.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/plugin/DisableSameAs.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/plugin/DisableSameAs.java index 15c34a98b..009f0b409 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/plugin/DisableSameAs.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/plugin/DisableSameAs.java @@ -5,6 +5,10 @@ package edu.cornell.mannlib.vitro.webapp.reasoner.plugin; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.Statement; + import edu.cornell.mannlib.vitro.webapp.reasoner.ReasonerPlugin; import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasoner; From 7129912e43543088817126375a1ec28399909555 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Fri, 30 Aug 2013 14:19:13 -0400 Subject: [PATCH 38/46] Adding unit tests, adding easymock library, Fixed problem with URIs with localnames that start with a digit. VIVO-13 --- webapp/lib/easymock-3.2.jar | Bin 0 -> 119780 bytes .../controller/freemarker/UrlBuilder.java | 72 +++++++++------ .../controller/freemarker/UrlBuilderTest.java | 84 ++++++++++++++++++ 3 files changed, 130 insertions(+), 26 deletions(-) create mode 100644 webapp/lib/easymock-3.2.jar diff --git a/webapp/lib/easymock-3.2.jar b/webapp/lib/easymock-3.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..7c439f82c181b1961326623d7dabfc295b016d3c GIT binary patch literal 119780 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

    (Q2tT-P`F88e&BTlZb~o5T26 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 G1?7KN!RTNB literal 0 HcmV?d00001 diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java index 80994386c..ed3a6430a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java @@ -242,23 +242,12 @@ public class UrlBuilder { } public static String getIndividualProfileUrl(Individual individual, VitroRequest vreq) { - return getIndividualProfileUrl(individual, individual.getURI(),vreq); - } - - public static String getIndividualProfileUrl(String individualUri, VitroRequest vreq) { - Individual individual = new IndividualImpl(individualUri); - return getIndividualProfileUrl(individual, individualUri, vreq); - } - - private static String getIndividualProfileUrl(Individual individual, String individualUri, VitroRequest vreq) { WebappDaoFactory wadf = vreq.getWebappDaoFactory(); String profileUrl = null; try { - URI uri = new URIImpl(individualUri); // throws exception if individualUri is invalid - String namespace = uri.getNamespace(); - String defaultNamespace = wadf.getDefaultNamespace(); - String localName = individual.getLocalName(); + String namespace = individual.getNamespace(); + String defaultNamespace = wadf.getDefaultNamespace(); if (defaultNamespace.equals(namespace)) { profileUrl = getUrl(Route.INDIVIDUAL.path() + "/" + localName); @@ -267,7 +256,7 @@ public class UrlBuilder { log.debug("Found externally linked namespace " + namespace); profileUrl = namespace + localName; } else { - ParamMap params = new ParamMap("uri", individualUri); + ParamMap params = new ParamMap("uri", individual.getURI()); profileUrl = getUrl("/individual", params); } } @@ -276,25 +265,56 @@ public class UrlBuilder { return null; } - if (profileUrl != null) { - LinkedHashMap specialParams = getModelParams(vreq); - if(specialParams.size() != 0) { - profileUrl = addParams(profileUrl, new ParamMap(specialParams)); - } - } - - return profileUrl; + if (profileUrl != null) { + LinkedHashMap specialParams = getModelParams(vreq); + if(specialParams.size() != 0) { + profileUrl = addParams(profileUrl, new ParamMap(specialParams)); + } + } + + return profileUrl; } + /** + * If you already have an Individual object around, + * call getIndividualProfileUrl(Individual, VitroRequest) + * instead of this method. + */ + public static String getIndividualProfileUrl(String individualUri, VitroRequest vreq) { + return getIndividualProfileUrl(new IndividualImpl(individualUri), vreq); + } + + protected static String getIndividualProfileUrl( + String individualUri, + String namespace, String localName, + String defaultNamespace){ + String profileUrl = ""; + try{ + if ( isUriInDefaultNamespace( individualUri, defaultNamespace) ) { + profileUrl = getUrl(Route.INDIVIDUAL.path() + "/" + localName); + } else { + ParamMap params = new ParamMap("uri", individualUri); + profileUrl = getUrl("/individual", params); + } + } catch (Exception e) { + log.warn(e); + return null; + } + return profileUrl; + } + public static boolean isUriInDefaultNamespace(String individualUri, VitroRequest vreq) { return isUriInDefaultNamespace(individualUri, vreq.getWebappDaoFactory()); } - public static boolean isUriInDefaultNamespace(String individualUri, WebappDaoFactory wadf) { + public static boolean isUriInDefaultNamespace(String individualUri, WebappDaoFactory wadf) { + return isUriInDefaultNamespace( individualUri, wadf.getDefaultNamespace()); + } + + public static boolean isUriInDefaultNamespace(String individualUri, String defaultNamespace){ try { - URI uri = new URIImpl(individualUri); // throws exception if individualUri is invalid - String namespace = uri.getNamespace(); - String defaultNamespace = wadf.getDefaultNamespace(); + Individual ind = new IndividualImpl(individualUri); + String namespace = ind.getNamespace(); return defaultNamespace.equals(namespace); } catch (Exception e) { log.warn(e); diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java index 56ee04719..7cc7b9508 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java @@ -3,12 +3,21 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; +import static org.easymock.EasyMock.*; + +import javax.servlet.http.HttpServletRequest; + import junit.framework.Assert; import org.junit.Test; +import stubs.edu.cornell.mannlib.vitro.webapp.dao.ApplicationDaoStub; +import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub; import edu.cornell.mannlib.vitro.testing.AbstractTestClass; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.web.URLEncoder; public class UrlBuilderTest extends AbstractTestClass { @@ -77,5 +86,80 @@ public class UrlBuilderTest extends AbstractTestClass { Assert.assertEquals(vClassUri, UrlBuilder.urlDecode(vClassUriEncoded)); } + + @Test + public void testGetIndividualProfileURI(){ + VitroRequest vreq = makeMockVitroRequest( "http://example.com/individual/"); + UrlBuilder.contextPath = "http://example.com"; + + String uri = "http://example.com/individual/n2343"; + String url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual/n2343", url); + + uri = "http://example.com/individual/bob"; + url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual/bob",url); + + uri = "http://nondefaultNS.com/individual/n2343"; + url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual?uri=" + URLEncoder.encode(uri), url); + + uri = "http://example.com/individual#n2343"; + url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual?uri=" + URLEncoder.encode(uri), url); + + uri = "http://example.com/individual/5LNCannotStartWithNumber"; + url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual?uri=" + URLEncoder.encode(uri), url); + } + + protected VitroRequest makeMockVitroRequest( final String defaultNS){ + HttpServletRequest req = createMock( HttpServletRequest.class ); + return new VitroRequest(req){ + + @Override + public String getParameter(String key){ return null; } + + @Override + public WebappDaoFactory getWebappDaoFactory(){ + return makeMockWDF(defaultNS); + } + }; + } + protected WebappDaoFactoryStub makeMockWDF( String defaultNS){ + WebappDaoFactoryStub wdf = new WebappDaoFactoryStub(); + wdf.setDefaultNamespace("http://example.com/individual/"); + ApplicationDaoStub aDao = new ApplicationDaoStub(){ + @Override + public boolean isExternallyLinkedNamespace(String ns){ + return false; + } + }; + wdf.setApplicationDao( aDao ); + return wdf; + } + + @Test + public void testIsUriInDefaultNamespace(){ + String[][] examples = { + { "http://example.com/individual/n3234", "http://example.com/individual/"}, + { "http://example.com/individual#n3234", "http://example.com/individual#"}, + { "http://example.com:8080/individual/n3234", "http://example.com:8080/individual/"}, + { "http://example.com:8080/individual#n3234", "http://example.com:8080/individual#"} + }; + + for( String[] example : examples ){ + Assert.assertTrue("expected '"+ example[0] + "' to be in the default NS of '"+example[1]+"'", + UrlBuilder.isUriInDefaultNamespace(example[0], example[1])); + } + + String[][] counterExamples = { + { "http://example.com/individual/5LNCannotStartWithNumber", "http://example.com/individual/" } + }; + for( String[] example : counterExamples ){ + Assert.assertFalse("expected '"+ example[0] + "' to NOT be in the default NS of '"+example[1]+"'", + UrlBuilder.isUriInDefaultNamespace(example[0], example[1])); + } + } } From 7ff02342e437803df2614d3bc9e4458a466963f9 Mon Sep 17 00:00:00 2001 From: Brian Caruso Date: Fri, 30 Aug 2013 15:34:18 -0400 Subject: [PATCH 39/46] Fixing problem where deletes of obj prop stmts created modTime stms in asserted tbox. VIVO-142 --- .../dao/jena/PropertyInstanceDaoJena.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJena.java index e03271273..19cbdffeb 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJena.java @@ -12,6 +12,7 @@ import java.util.List; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntProperty; +import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.ResourceFactory; @@ -39,7 +40,8 @@ public class PropertyInstanceDaoJena extends PropertyDaoJena implements deleteObjectPropertyStatement(subjectURI, propertyURI, objectURI, getOntModelSelector()); } - public void deleteObjectPropertyStatement(String subjectURI, String propertyURI, String objectURI, OntModelSelector ontModelSelector) { + public void deleteObjectPropertyStatement(String subjectURI, String propertyURI, String objectURI, + OntModelSelector ontModelSelector) { OntModel ontModel = ontModelSelector.getABoxModel(); OntModel tboxModel = ontModelSelector.getTBoxModel(); ontModel.enterCriticalSection(Lock.WRITE); @@ -51,29 +53,31 @@ public class PropertyInstanceDaoJena extends PropertyDaoJena implements invPred = pred.as(OntProperty.class).getInverse(); } Resource objRes = ontModel.getResource(objectURI); + Model baseModel = getOntModel().getBaseModel(); + String userUri = getWebappDaoFactory().getUserURI(); if ( (subjRes != null) && (pred != null) && (objRes != null) ) { - getOntModel().getBaseModel().notifyEvent(new IndividualUpdateEvent(getWebappDaoFactory().getUserURI(),true,subjectURI)); + baseModel.notifyEvent(new IndividualUpdateEvent(userUri,true,subjectURI)); try { - ontModel.remove(subjRes,pred,objRes); - - updatePropertyDateTimeValue(subjRes,MODTIME,Calendar.getInstance().getTime(),getOntModel()); + ontModel.remove(subjRes,pred,objRes); + updatePropertyDateTimeValue(subjRes,MODTIME,Calendar.getInstance().getTime(),ontModel); } finally { - getOntModel().getBaseModel().notifyEvent(new IndividualUpdateEvent(getWebappDaoFactory().getUserURI(),false,subjectURI)); + baseModel.notifyEvent(new IndividualUpdateEvent(userUri,false,subjectURI)); } try{ - getOntModel().getBaseModel().notifyEvent(new IndividualDeletionEvent(getWebappDaoFactory().getUserURI(),true,objectURI)); - List depResStmts = DependentResourceDeleteJena.getDependentResourceDeleteList(ResourceFactory.createStatement(subjRes, pred, objRes),ontModel); - getOntModel().remove(depResStmts); + baseModel.notifyEvent(new IndividualDeletionEvent(userUri,true,objectURI)); + List depResStmts = DependentResourceDeleteJena + .getDependentResourceDeleteList(ResourceFactory.createStatement(subjRes, pred, objRes),ontModel); + ontModel.remove(depResStmts); } finally { - getOntModel().getBaseModel().notifyEvent(new IndividualDeletionEvent(getWebappDaoFactory().getUserURI(),false,objectURI)); + baseModel.notifyEvent(new IndividualDeletionEvent(userUri,false,objectURI)); } if (invPred != null) { - getOntModel().getBaseModel().notifyEvent(new IndividualUpdateEvent(getWebappDaoFactory().getUserURI(),true,objectURI)); + baseModel.notifyEvent(new IndividualUpdateEvent(userUri,true,objectURI)); try { ontModel.remove(objRes,invPred,subjRes); - updatePropertyDateTimeValue(objRes,MODTIME,Calendar.getInstance().getTime(),getOntModel()); + updatePropertyDateTimeValue(objRes,MODTIME,Calendar.getInstance().getTime(),ontModel); } finally { - getOntModel().getBaseModel().notifyEvent(new IndividualUpdateEvent(getWebappDaoFactory().getUserURI(),false,subjectURI)); + baseModel.notifyEvent(new IndividualUpdateEvent(userUri,false,subjectURI)); } } } From 3314e5a4b09fe721400583d64416ac80eb9070f7 Mon Sep 17 00:00:00 2001 From: hudajkhan Date: Tue, 3 Sep 2013 15:34:02 -0400 Subject: [PATCH 40/46] updates for label management --- .../individual/IndividualResponseBuilder.java | 4 +- .../ManageLabelsForIndividualGenerator.java | 574 ++++++++++++++++++ .../ConceptSparqlUpdatePreprocessor.java | 129 ++++ .../FoafNameToRdfsLabelPreprocessor.java | 17 +- ...ManageLabelsForIndividualPreprocessor.java | 111 ++++ webapp/web/i18n/all.properties | 3 +- .../individual/manageLabelsForIndividual.js | 223 ++++++- .../individual/manageLabelsForIndividual.ftl | 107 ++-- .../manageLabelsForIndividualAddForm.ftl | 29 + .../manageLabelsForIndividualMacros.ftl | 79 +++ ...ageLabelsForIndividualSubmissionErrors.ftl | 14 + .../freemarker/lib/lib-properties.ftl | 11 +- 12 files changed, 1226 insertions(+), 75 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManageLabelsForIndividualGenerator.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSparqlUpdatePreprocessor.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManageLabelsForIndividualPreprocessor.java create mode 100644 webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualAddForm.ftl create mode 100644 webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualMacros.ftl create mode 100644 webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualSubmissionErrors.ftl diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualResponseBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualResponseBuilder.java index e63791df5..2ddca87c2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualResponseBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualResponseBuilder.java @@ -279,7 +279,9 @@ class IndividualResponseBuilder { log.debug("queryStr = " + queryStr); int theCount = 0; try { - ResultSet results = QueryUtils.getQueryResults(queryStr, vreq); + //ResultSet results = QueryUtils.getQueryResults(queryStr, vreq); + //Get query results across all languages in order for template to show manage labels link correctly + ResultSet results = QueryUtils.getLanguageNeutralQueryResults(queryStr, vreq); if (results.hasNext()) { QuerySolution soln = results.nextSolution(); String countStr = soln.get("labelCount").toString(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManageLabelsForIndividualGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManageLabelsForIndividualGenerator.java new file mode 100644 index 000000000..a9cb131d7 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManageLabelsForIndividualGenerator.java @@ -0,0 +1,574 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators; + +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.query.Dataset; +import com.hp.hpl.jena.query.QueryExecution; +import com.hp.hpl.jena.query.QueryExecutionFactory; +import com.hp.hpl.jena.query.QuerySolution; +import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.shared.Lock; +import com.hp.hpl.jena.sparql.resultset.ResultSetMem; +import com.hp.hpl.jena.vocabulary.RDFS; +import com.hp.hpl.jena.vocabulary.XSD; + +import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestActionConstants; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddDataPropertyStatement; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddObjectPropertyStatement; +import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; +import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement; +import edu.cornell.mannlib.vitro.webapp.beans.Individual; +import edu.cornell.mannlib.vitro.webapp.beans.VClass; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap; +import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.FoafNameToRdfsLabelPreprocessor; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.ManageLabelsForIndividualPreprocessor; +import edu.cornell.mannlib.vitro.webapp.i18n.selection.LocaleSelectionDataGetter; +import edu.cornell.mannlib.vitro.webapp.i18n.selection.LocaleSelectorUtilities; +import edu.cornell.mannlib.vitro.webapp.i18n.selection.SelectedLocale; +import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.DataPropertyStatementTemplateModel; + +/** + *This allows the page to show all the labels for a particular individual and sets up code + *enabling the addition of a new label. Links on the page will allow for removal or editing of a given label. + */ +public class ManageLabelsForIndividualGenerator extends BaseEditConfigurationGenerator implements EditConfigurationGenerator { + public static Log log = LogFactory.getLog(ManageLabelsForIndividualGenerator.class); + private static String template = "manageLabelsForIndividual.ftl"; + private HashMap> labelsSortedByLanguage = null; + private List existingLabelLiterals = null; + //list of language names sorted alphabetically + private List existingSortedLanguageNameList = null; + //This would be for the full list and can be used for the existing labels list as well + + private HashMap fullLanguageNameToCodeMap = null; + private static String predicateUri = RDFS.label.getURI(); + @Override + public EditConfigurationVTwo getEditConfiguration(VitroRequest vreq, HttpSession session) { + + EditConfigurationVTwo config = new EditConfigurationVTwo(); + config.setTemplate(this.getTemplate()); + + initBasics(config, vreq); + initPropertyParameters(vreq, session, config); + + //This form is technically not an object property form in the true sense + //or a data property form because it is used to list the various labels + //and allow for adding new labels + //URL to return to is the same page once addition is complete + this.setUrlToReturnTo(config, vreq); + + config.setSubjectUri(EditConfigurationUtils.getSubjectUri(vreq)); + + setVarNames(config); + config.setDatapropKey( EditConfigurationUtils.getDataHash(vreq) ); + //Add n3, fields, etc. in the case where the user wants to add a label + //N3 required should be empty since the addition of a label is optional in this case + config.setN3Required(this.generateN3Required(vreq)); + config.setN3Optional(this.generateN3Optional(vreq)); + this.setUrisAndLiteralsOnForm(config, vreq); + setUrisAndLiteralsInScope(config); + this.setFields(config, vreq, EditConfigurationUtils + .getPredicateUri(vreq)); + + //Get existing labels + //this.initExistingLabels(config, vreq); + + //Add form specific data used to populate template + addFormSpecificData(config, vreq); + //This preprocessor handles getting the correct label language and putting the attribute on the label + config.addEditSubmissionPreprocessor( + new ManageLabelsForIndividualPreprocessor(config)); + //This will handle generating the label from the first name and last name and also make sure to associate + //a language with that label + config.addModelChangePreprocessor(new FoafNameToRdfsLabelPreprocessor()); + + prepare(vreq, config); + return config; + } + + private void setUrlToReturnTo(EditConfigurationVTwo editConfiguration, VitroRequest vreq) { + editConfiguration.setUrlPatternToReturnTo(EditConfigurationUtils.getFormUrlWithoutContext(vreq)); + } + + private void setVarNames(EditConfigurationVTwo editConfiguration) { + editConfiguration.setVarNameForSubject("subject"); + editConfiguration.setVarNameForPredicate("predicate"); + + } + + + private List generateN3Required(VitroRequest vreq) { + List n3Required = new ArrayList(); + return n3Required; + } + + private List generateN3Optional(VitroRequest vreq) { + List n3Optional = new ArrayList(); + String predicateUri = EditConfigurationUtils.getPredicateUri(vreq); + String n3 = "?subject <" + predicateUri + "> ?label "; + //n3 used if the subject is a person + String personN3 = this.N3_PREFIX + "?subject foaf:firstName ?firstName ; foaf:lastName ?lastName ."; + n3Optional.add(n3); + n3Optional.add(personN3); + return n3Optional; + } + + + + private void setFields(EditConfigurationVTwo editConfiguration, VitroRequest vreq, String predicateUri) { + Map fields = new HashMap(); + editConfiguration.setFields(fields); + editConfiguration.addField(new FieldVTwo(). + setName("label"). + setValidators(getLabelValidators(vreq, editConfiguration))); + editConfiguration.addField(new FieldVTwo( + ).setName("newLabelLanguage")); + //no validators since all of this is optional + //there should be error-checking client side though + editConfiguration.addField(new FieldVTwo(). + setName("firstName"). + setValidators(getFirstNameValidators(vreq, editConfiguration))); + + editConfiguration.addField(new FieldVTwo(). + setName("lastName"). + setValidators(getLastNameValidators(vreq, editConfiguration))); + } + + //first and last name have validators if is person is true + private List getFirstNameValidators(VitroRequest vreq, EditConfigurationVTwo config) { + List validators = new ArrayList(); + if(isPersonType(vreq, config)) { + validators.add("nonempty"); + } + return validators; + } + + private List getLastNameValidators(VitroRequest vreq, EditConfigurationVTwo config) { + List validators = new ArrayList(); + if(isPersonType(vreq, config)) { + validators.add("nonempty"); + } + return validators; + } + + //validate label if person is not true + private List getLabelValidators(VitroRequest vreq, EditConfigurationVTwo config) { + List validators = new ArrayList(); + if(!isPersonType(vreq, config)) { + validators.add("nonempty"); + } + return validators; + } + + + + private void setUrisAndLiteralsOnForm(EditConfigurationVTwo config, + VitroRequest vreq) { + List literalsOnForm = new ArrayList(); + literalsOnForm.add("label"); + literalsOnForm.add("newLabelLanguage"); + //optional for person + literalsOnForm.add("firstName"); + literalsOnForm.add("lastName"); + config.setLiteralsOnForm(literalsOnForm); + + } + + + private void setUrisAndLiteralsInScope(EditConfigurationVTwo editConfiguration) { + HashMap> urisInScope = new HashMap>(); + //note that at this point the subject, predicate, and object var parameters have already been processed + urisInScope.put(editConfiguration.getVarNameForSubject(), + Arrays.asList(new String[]{editConfiguration.getSubjectUri()})); + urisInScope.put(editConfiguration.getVarNameForPredicate(), + Arrays.asList(new String[]{editConfiguration.getPredicateUri()})); + editConfiguration.setUrisInScope(urisInScope); + //Uris in scope include subject, predicate, and object var + + editConfiguration.setLiteralsInScope(new HashMap>()); + } + + private void initExistingLabels(EditConfigurationVTwo config, + VitroRequest vreq) { + this.existingLabelLiterals = this.getExistingLabels(config.getSubjectUri(), vreq); + // this.labelsSortedByLanguage = this.getLabelsSortedByLanguage(config,vreq); + //language names sorted for the existing languages + // this.existingSortedLanguageNameList = getExistingSortedLanguageNamesList(); + + //Generate a label to language code hash map + //TODO: + + //HashMap labelToLanguageCode = new HashMap(); + + //this.labels = getExistingLabels(config.getSubjectUri(), vreq); + //this.labelsSortedByLanguage = getLabelsSortedByLanguage(config.getSubjectUri(), vreq); + + } + + + private List getExistingSortedLanguageNamesList() { + HashSet existingLanguages = new HashSet(); + for(Literal l: this.existingLabelLiterals) { + String language = l.getLanguage(); + if(!existingLanguages.contains(language)) { + existingLanguages.add(language); + } + } + List sortedNames = new ArrayList(existingLanguages); + //sort alphabetically + Collections.sort(sortedNames); + return sortedNames; + } + + + private void addFormSpecificData(EditConfigurationVTwo config, + VitroRequest vreq) { + //Get all language codes/labels in the system, and this list is sorted by language name + List> locales = this.getLocales(vreq); + //Get code to label hashmap - we use this to get the language name for the language code returned in the rdf literal + HashMap localeCodeToNameMap = this.getFullCodeToLanguageNameMap(locales); + //the labels already added by the user + ArrayList existingLabels = this.getExistingLabels(config.getSubjectUri(), vreq); + //existing labels keyed by language name and each of the list of labels is sorted by language name + HashMap> existingLabelsByLanguageName = this.getLabelsSortedByLanguageName(existingLabels, localeCodeToNameMap, config, vreq); + //Get available locales for the drop down for adding a new label, also sorted by language name + HashSet existingLanguageNames = new HashSet(existingLabelsByLanguageName.keySet()); + List> availableLocalesForAdd = getAvailableLocales(locales, existingLanguageNames); + + + //Save all locales + config.addFormSpecificData("selectLocaleFullList", locales); + //Save labels sorted by language name, untyped have "untyped" as the language name value + config.addFormSpecificData("labelsSortedByLanguageName", existingLabelsByLanguageName); + config.addFormSpecificData("selectLocale",availableLocalesForAdd); + + + //How do we edit? Will need to see + config.addFormSpecificData("deleteWebpageUrl", "/edit/primitiveDelete"); + + + Individual subject = vreq.getWebappDaoFactory().getIndividualDao().getIndividualByURI(config.getSubjectUri()); + if( subject != null && subject.getName() != null ){ + config.addFormSpecificData("subjectName", subject.getName()); + }else{ + config.addFormSpecificData("subjectName", null); + } + + //Put in whether or not person type + if(isPersonType(vreq, config)) { + //Doing this b/c unsure how freemarker will handle boolean value from JAVA + config.addFormSpecificData("isPersonType", "true"); + } else { + config.addFormSpecificData("isPersonType", "false"); + + } + + //Include whether or not editable to enable edit/remove links and add to show up + config.addFormSpecificData("editable", isEditable(vreq, config)); + } + + + + //Based on what locales have already been selected for labels, return a list of + //locales for which new labels can be added and have these sorted by the name of the language + private List> getAvailableLocales(List> allLocales, + HashSet existingLabelsLanguageNames) { + List> availableLocales = new ArrayList>(); + for(HashMap localeInfo: allLocales) { + String languageName = (String) localeInfo.get("label"); + //If this language label is NOT in the labels sorted by language, then available + //for selection when creating a new label + //The assumption here is we don't want to allow the user to add a new label when a label + //already exists in that language + if(languageName != "untyped" && !existingLabelsLanguageNames.contains(languageName)) { + availableLocales.add(localeInfo); + } + } + //Sort list by language label and return + Collections.sort(availableLocales, new Comparator>() { + public int compare(HashMap h1, HashMap h2) { + String languageName1 = (String) h1.get("label"); + String languageName2 = (String) h2.get("label"); + return languageName1.compareTo(languageName2); + } + }); + + return availableLocales; + } + + + private Object isEditable(VitroRequest vreq, EditConfigurationVTwo config) { + Individual individual = EditConfigurationUtils.getIndividual(vreq, config.getSubjectUri()); + AddDataPropertyStatement adps = new AddDataPropertyStatement( + vreq.getJenaOntModel(), individual.getURI(), + RequestActionConstants.SOME_URI); + AddObjectPropertyStatement aops = new AddObjectPropertyStatement( + vreq.getJenaOntModel(), individual.getURI(), + RequestActionConstants.SOME_URI, + RequestActionConstants.SOME_URI); + return PolicyHelper.isAuthorizedForActions(vreq, new Actions(adps).or(aops)); + } + + + //Copied from NewIndividualFormGenerator + //TODO: Refactor so common code can be used by both generators + public String getFOAFPersonClassURI() { + return "http://xmlns.com/foaf/0.1/Person"; + } + + public boolean isPersonType(VitroRequest vreq, EditConfigurationVTwo config) { + WebappDaoFactory wdf = vreq.getWebappDaoFactory(); + Boolean isPersonType = Boolean.FALSE; + String foafPersonType = getFOAFPersonClassURI(); + List vclasses = this.getVClasses(config, vreq); + if( vclasses != null ){ + for( VClass v: vclasses){ + String typeUri = v.getURI(); + if( foafPersonType.equals(typeUri)) { + isPersonType = Boolean.TRUE; + break; + } + } + } + return isPersonType; + } + + //how to get the type of the individual in question + public List getVClasses(EditConfigurationVTwo config, VitroRequest vreq) { + Individual subject = EditConfigurationUtils.getIndividual(vreq, config.getSubjectUri()); + //Get the vclasses appropriate for this subject + return subject.getVClasses(); + } + + //Languages sorted by language name + private HashMap> getLabelsSortedByLanguageName(List labels, Map localeCodeToNameMap, EditConfigurationVTwo config, + VitroRequest vreq) { + String subjectUri = config.getSubjectUri(); + String propertyUri = config.getPredicateUri(); + + + //Iterate through the labels and create a hashmap + HashMap> labelsHash= new HashMap>(); + + for(Literal l: labels) { + String languageTag = l.getLanguage(); + String languageName = ""; + if(languageTag == "") { + languageName = "untyped"; + } + else if(localeCodeToNameMap.containsKey(languageTag)) { + languageName = localeCodeToNameMap.get(languageTag); + } else { + log.warn("This language tag " + languageTag + " does not have corresponding name in the system and was not processed"); + } + + if(languageName != "") { + if(!labelsHash.containsKey(languageName)) { + labelsHash.put(languageName, new ArrayList()); + } + ArrayList labelsList = (ArrayList)labelsHash.get(languageName); + //This should put the label in the list + //Create label information instance with the required information + //To generate link + DataPropertyStatementTemplateModel dpstm = new DataPropertyStatementTemplateModel(subjectUri, propertyUri, l, + template, vreq); + labelsList.add(new LabelInformation( + l, dpstm.getEditUrl(), dpstm.getDeleteUrl(), languageTag, languageName)); + } + } + + //Sort each label list + LabelInformationComparator lic = new LabelInformationComparator(); + for(String languageName: labelsHash.keySet()) { + List labelInfo = labelsHash.get(languageName); + Collections.sort(labelInfo, lic); + } + return labelsHash; + + } + + + public static class LabelInformationComparator implements Comparator { + + public int compare(LabelInformation l1, LabelInformation l2) { + return l1.getLabelStringValue().compareTo(l2.getLabelStringValue()); + } + } + + + private static String LABEL_QUERY = "" + + "PREFIX rdfs: \n" + + "SELECT DISTINCT ?label WHERE { \n" + + " ?subject rdfs:label ?label \n" + + "} ORDER BY ?label"; + + + private ArrayList getExistingLabels(String subjectUri, VitroRequest vreq) { + String queryStr = QueryUtils.subUriForQueryVar(LABEL_QUERY, "subject", subjectUri); + log.debug("queryStr = " + queryStr); + + ArrayList labels = new ArrayList(); + try { + //We want to get the labels for all the languages, not just the display language + ResultSet results = QueryUtils.getLanguageNeutralQueryResults(queryStr, vreq); + while (results.hasNext()) { + QuerySolution soln = results.nextSolution(); + Literal nodeLiteral = soln.get("label").asLiteral(); + labels.add(nodeLiteral); + + + } + } catch (Exception e) { + log.error(e, e); + } + return labels; +} + + + + //Putting this into a method allows overriding it in subclasses + protected String getEditForm() { + return null; + //return AddEditWebpageFormGenerator.class.getName(); + } + + + protected String getTemplate() { + return template; + } + + + + //get locales + public List> getLocales(VitroRequest vreq) { + List selectables = SelectedLocale.getSelectableLocales(vreq); + if (selectables.isEmpty()) { + return Collections.emptyList(); + } + List> list = new ArrayList>(); + Locale currentLocale = SelectedLocale.getCurrentLocale(vreq); + for (Locale locale : selectables) { + try { + list.add(buildLocaleMap(locale, currentLocale)); + } catch (FileNotFoundException e) { + log.warn("Can't show the Locale selector for '" + locale + + "': " + e); + } + } + + return list; + } + + + + public HashMap getFullCodeToLanguageNameMap(List> localesList) { + HashMap codeToLanguageMap = new HashMap(); + for(Map locale: localesList) { + String code = (String) locale.get("code"); + String label = (String) locale.get("label"); + if(!codeToLanguageMap.containsKey(code)) { + codeToLanguageMap.put(code, label); + } + else { + log.warn("Language code " + code + " for " + label + " was not associated in map becayse label already exists"); + } + } + return codeToLanguageMap; + } + + public List getFullLanguagesNamesSortedList(List> localesList) { + HashSet languageNamesSet = new HashSet(); + for(Map locale: localesList) { + String label = (String) locale.get("label"); + if(!languageNamesSet.contains(label)) { + languageNamesSet.add(label); + } + + } + List languageNames = new ArrayList(languageNamesSet); + Collections.sort(languageNames); + return languageNames; + } + + //copied from locale selection data getter but don't need all this information + private HashMap buildLocaleMap(Locale locale, + Locale currentLocale) throws FileNotFoundException { + HashMap map = new HashMap(); + //Replacing the underscore with a hyphen because that is what is represented in the actual literals + map.put("code", locale.toString().replace("_", "-")); + map.put("label", locale.getDisplayName(currentLocale)); + return map; + } + + //Class used to store the information needed for the template, such as the labels, their languages, their edit links + public class LabelInformation { + private Literal labelLiteral = null; + private String editLinkURL; + private String deleteLinkURL; + private String languageCode; //languageCode + private String languageName; + public LabelInformation(Literal inputLiteral, String inputEditLinkURL, String inputDeleteLinkURL, String inputLanguageCode, String inputLanguageName) { + this.labelLiteral = inputLiteral; + this.editLinkURL = inputEditLinkURL; + this.deleteLinkURL = inputDeleteLinkURL; + this.languageCode = inputLanguageCode; + this.languageName = inputLanguageName; + } + + + public Literal getLabelLiteral() { + return this.labelLiteral; + } + + public String getLabelStringValue() { + return this.labelLiteral.getString(); + } + + public String getEditLinkURL() { + return this.editLinkURL; + } + + public String getDeleteLinkURL() { + return this.deleteLinkURL; + } + public String getLanguageCode() { + return this.languageCode; + } + + public String getLanguageName() { + return this.languageName; + } + } + + private String N3_PREFIX = "@prefix foaf: .\n"; + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSparqlUpdatePreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSparqlUpdatePreprocessor.java new file mode 100644 index 000000000..04b2d3cad --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSparqlUpdatePreprocessor.java @@ -0,0 +1,129 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.query.Dataset; +import com.hp.hpl.jena.query.Query; +import com.hp.hpl.jena.query.QueryExecution; +import com.hp.hpl.jena.query.QueryExecutionFactory; +import com.hp.hpl.jena.query.QueryFactory; +import com.hp.hpl.jena.query.QuerySolutionMap; +import com.hp.hpl.jena.query.Syntax; +import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.Property; +import com.hp.hpl.jena.rdf.model.ResIterator; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.shared.Lock; +import com.hp.hpl.jena.vocabulary.RDF; +import com.hp.hpl.jena.vocabulary.RDFS; + +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; +import edu.cornell.mannlib.vitro.webapp.dao.jena.DatasetWrapper; +import edu.cornell.mannlib.vitro.webapp.dao.jena.DatasetWrapperFactory; + +//We are representing semantic types from the UMLS Semantic Network as OWL Classes +//and this preprocessor will add the appropriate class information to the TBox + +public class ConceptSparqlUpdatePreprocessor implements ModelChangePreprocessor { + + private static String VIVOCore = "http://vivoweb.org/ontology/core#"; + private static String SKOSConceptType = "http://www.w3.org/2004/02/skos/core#Concept"; + private Log log = LogFactory.getLog(ConceptSparqlUpdatePreprocessor.class); + + private OntModel toUpdateModel = null; + private DatasetWrapperFactory dwf = null; + + //Custom constructor + public ConceptSparqlUpdatePreprocessor(OntModel updateModel, DatasetWrapperFactory inputDwf) { + this.toUpdateModel = updateModel; + this.dwf = inputDwf; + } + + @Override + public void preprocess(Model retractionsModel, Model additionsModel, + HttpServletRequest request) { + //Run a construct query against the additions model + String prefixes = "PREFIX RDFS:<" + RDFS.getURI() + "> " + + "PREFIX OWL: " + + "PREFIX RDF:<" + RDF.getURI() + ">"; + String constructQuery = prefixes + " CONSTRUCT { " + + "?semanticType rdf:type OWL:Class. { " + + "?semanticType rdfs:subClassOf SKOS:Concept . { " + + "?semanticType rdfs:label ?label. { " + + "} WHERE { " + + "?concept rdf:type ?semanticType. { " + + "?semanticType rdfs:label ?label .{ " + + "?semanticType rdfs:subClassOf SKOS:Concept .{ " + + "}"; + + //Execute construct query + Model constructedModel = ModelFactory.createDefaultModel(); + + + log.debug("CONSTRUCT query string " + constructQuery); + + Query query = null; + try { + query = QueryFactory.create(constructQuery, Syntax.syntaxARQ); + } catch(Throwable th){ + log.error("Could not create CONSTRUCT SPARQL query for query " + + "string. " + th.getMessage()); + log.error(constructQuery); + return; + } + + + + DatasetWrapper w = dwf.getDatasetWrapper(); + Dataset dataset = w.getDataset(); + dataset.getLock().enterCriticalSection(Lock.READ); + QueryExecution qe = null; + try { + qe = QueryExecutionFactory.create( + query, dataset); + qe.execConstruct(constructedModel); + } catch (Exception e) { + log.error("Error getting constructed model for query string " + constructQuery); + } finally { + if (qe != null) { + qe.close(); + } + dataset.getLock().leaveCriticalSection(); + w.close(); + } + + //Add constructed model to the designated update model + toUpdateModel.enterCriticalSection(Lock.WRITE); + try { + toUpdateModel.add(constructedModel); + } catch (Exception e) { + log.error("Error adding statements to update model for " + constructQuery); + } finally { + toUpdateModel.leaveCriticalSection(); + } + + //Take this constructed model and remove from the additions model + additionsModel.enterCriticalSection(Lock.WRITE); + try { + additionsModel.remove(constructedModel.listStatements().toList()); + } catch (Exception e) { + log.error("Error removing statements from additions model for " + constructQuery); + } finally { + additionsModel.leaveCriticalSection(); + } + + } + + + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/FoafNameToRdfsLabelPreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/FoafNameToRdfsLabelPreprocessor.java index 49e979740..bbb280f2a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/FoafNameToRdfsLabelPreprocessor.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/FoafNameToRdfsLabelPreprocessor.java @@ -4,6 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocess import javax.servlet.http.HttpServletRequest; +import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.ResIterator; @@ -30,7 +31,21 @@ public class FoafNameToRdfsLabelPreprocessor implements ModelChangePreprocessor Statement fname = sub.getProperty( firstNameP ); Statement lname = sub.getProperty( lastNameP ); if( fname != null && lname != null && fname.getString() != null && lname.getString() != null ){ - additionsModel.add(sub, rdfsLabelP, lname.getString() + ", " + fname.getString() ); + //Check if there are languages associated with first name and last name and add the language + //attribute to the label + //This preprocessor is used in multiple places, including for managing labels + Literal firstNameLiteral = fname.getLiteral(); + Literal lastNameLiteral = lname.getLiteral(); + String firstNameLanguage = firstNameLiteral.getLanguage(); + String lastNameLanguage = lastNameLiteral.getLanguage(); + String newLabel = lname.getString() + ", " + fname.getString(); + if(firstNameLanguage != null && lastNameLanguage != null && firstNameLanguage.equals(lastNameLanguage)) { + //create a literal with the appropriate value and the language + Literal labelWithLanguage = additionsModel.createLiteral(newLabel, firstNameLanguage); + additionsModel.add(sub, rdfsLabelP, labelWithLanguage); + } else { + additionsModel.add(sub, rdfsLabelP, newLabel ); + } } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManageLabelsForIndividualPreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManageLabelsForIndividualPreprocessor.java new file mode 100644 index 000000000..bb7967d64 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManageLabelsForIndividualPreprocessor.java @@ -0,0 +1,111 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.Property; +import com.hp.hpl.jena.rdf.model.ResIterator; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.Statement; + +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; +/* + * This preprocessor is used to set the language attribute on the label based on the user selection + * on the manage labels page when adding a new label. + */ +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.BaseEditSubmissionPreprocessorVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo; +import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.MultiValueEditSubmission; + +public class ManageLabelsForIndividualPreprocessor extends BaseEditSubmissionPreprocessorVTwo { + + + + + public ManageLabelsForIndividualPreprocessor(EditConfigurationVTwo editConfig) { + super(editConfig); + + } + + @Override + public void preprocess(MultiValueEditSubmission inputSubmission) { + //Check and see if a language was selected by the user, and this is the regular label submission + //TODO: Check if firstname and lastname should be changed here or elsewhere + if(inputSubmission.hasLiteralValue("label") && inputSubmission.hasLiteralValue("newLabelLanguage")) { + Map> literalsFromForm = inputSubmission.getLiteralsFromForm(); + List newLabelLanguages = literalsFromForm.get("newLabelLanguage"); + List labels = literalsFromForm.get("label"); + + //Expecting only one language + if(labels.size() > 0 && newLabelLanguages.size() > 0) { + Literal newLabelLanguage = newLabelLanguages.get(0); + Literal labelLiteral = labels.get(0); + //Get the string + String lang = this.getLanguage(newLabelLanguage.getString()); + String label = labelLiteral.getString(); + //Now add the language category to the literal + Literal labelWithLanguage = inputSubmission.createLiteral(label, + newLabelLanguage.getDatatypeURI(), + lang); + labels = new ArrayList(); + labels.add(labelWithLanguage); + //replace the label with one with language, again assuming only one label being returned + literalsFromForm.put("label", labels); + inputSubmission.setLiteralsFromForm(literalsFromForm); + } + } + //First name and last name would also have a language selected so make sure those literals are also + //correctly typed + if(inputSubmission.hasLiteralValue("firstName") && inputSubmission.hasLiteralValue("lastName") && inputSubmission.hasLiteralValue("newLabelLanguage")) { + Map> literalsFromForm = inputSubmission.getLiteralsFromForm(); + List newLabelLanguages = literalsFromForm.get("newLabelLanguage"); + List firstNames = literalsFromForm.get("firstName"); + List lastNames = literalsFromForm.get("lastName"); + + //Expecting only one language + if(firstNames.size() > 0 && lastNames.size() > 0 && newLabelLanguages.size() > 0) { + Literal newLabelLanguage = newLabelLanguages.get(0); + Literal firstNameLiteral = firstNames.get(0); + Literal lastNameLiteral = lastNames.get(0); + //Get the string + String lang = this.getLanguage(newLabelLanguage.getString()); + String firstNameValue = firstNameLiteral.getString(); + String lastNameValue = lastNameLiteral.getString(); + //Now add the language category to the literal + Literal firstNameWithLanguage = inputSubmission.createLiteral(firstNameValue, + null, + lang); + Literal lastNameWithLanguage = inputSubmission.createLiteral(lastNameValue, + null, + lang); + firstNames = new ArrayList(); + lastNames = new ArrayList(); + firstNames.add(firstNameWithLanguage); + lastNames.add(lastNameWithLanguage); + //replace the label with one with language, again assuming only one label being returned + literalsFromForm.put("firstName", firstNames); + literalsFromForm.put("lastName", lastNames); + inputSubmission.setLiteralsFromForm(literalsFromForm); + } + } + + } + + //The language code returned from JAVA locales has an underscore whereas we need a hyphen + private String getLanguage(String inputLanguageCode) { + if(inputLanguageCode.contains("_")) { + return inputLanguageCode.replace("_", "-"); + } + return inputLanguageCode; + } + +} diff --git a/webapp/web/i18n/all.properties b/webapp/web/i18n/all.properties index 6fb58986b..7980d00a9 100644 --- a/webapp/web/i18n/all.properties +++ b/webapp/web/i18n/all.properties @@ -675,7 +675,8 @@ photo = Photo no_image = no image placeholder_image = placeholder image manage_labels = manage labels - +add_label = Add Label +add_label_for_language = Language unsupported_ie_version = This form is not supported in versions of Internet Explorer below version 8. Please upgrade your browser, or switch to another browser, such as FireFox. # diff --git a/webapp/web/js/individual/manageLabelsForIndividual.js b/webapp/web/js/individual/manageLabelsForIndividual.js index cd91e9033..7eb54c92e 100644 --- a/webapp/web/js/individual/manageLabelsForIndividual.js +++ b/webapp/web/js/individual/manageLabelsForIndividual.js @@ -6,9 +6,10 @@ var manageLabels = { onLoad: function() { - this.mixIn(); + this.mixIn(); + this.initObjects(); this.initPage(); - + var selectedRadio; }, @@ -18,24 +19,86 @@ var manageLabels = { $.extend(this, customFormData); $.extend(this, i18nStrings); }, + + initObjects:function() { + this.addLabelForm = $('#addLabelForm'); + this.showFormButtonWrapper = $('#showAddForm'); + this.showFormButton = $("#showAddFormButton"); + this.addLabelCancel = this.addLabelForm.find(".cancel"); + this.submit = this.addLabelForm.find('input#submit'); + this.labelLanguage = this.addLabelForm.find("#newLabelLanguage"); + this.existingLabelsList = $("#existingLabelsList"); + }, // Initial page setup. Called only at page load. initPage: function() { + //disable submit until user selects a language + this.submit.attr('disabled', 'disabled'); + this.submit.addClass('disabledSubmit'); + if(this.submissionErrorsExist == "false") { + //hide the form to add label + this.addLabelForm.hide(); + //the cancel in add label can be unbound until the form is visible + //this.addLabelCancel.unbind("click"); + } else { + //Display the form + this.onShowAddForm(); - $('input#submit').attr('disabled', 'disabled'); - $('input#submit').addClass('disabledSubmit'); + } + + this.bindEventListeners(); }, bindEventListeners: function() { - $('input:radio').click( function() { - manageLabels.selectedRadio = $(this); - $('input#submit').attr('disabled', ''); - $('input#submit').removeClass('disabledSubmit'); + this.labelLanguage.change( function() { + //if language selected, allow submission, otherwise disallow + var selectedLanguage = manageLabels.labelLanguage.val(); + if(selectedLanguage != "") { + manageLabels.submit.attr('disabled', ''); + manageLabels.submit.removeClass('disabledSubmit'); + } else { + manageLabels.submit.attr('disabled', 'disabled'); + manageLabels.submit.addClass('disabledSubmit'); + } + }); + + //enable form to add label to be displayed or hidden + this.showFormButton.click(function() { + //clear the inputs for the label if the button is being clicked + manageLabels.clearAddForm(); + manageLabels.onShowAddForm(); + }); + + //Check for clicking on existing labels list remove links + //Note addition will refresh the page and removing will remove the item so adding event listeners + //to remove links should keep remove link events in synch with page + + this.existingLabelsList.find("a.remove").click(function(event) { + var message = "Are you sure you wish to delete this label?" + if (!confirm(message)) { + return false; + } + + //First check with confirmation whether or not they want to delete + manageLabels.processLabelDeletion(this); + return false; + }); + + + this.addLabelForm.find("a.cancel").click(function(){ + //clear the add form + manageLabels.clearAddForm(); + //hide the add form + manageLabels.onHideAddForm(); + }); + //TODO: Add method to check that language is selected on submission + + /* $('input#submit').click( function() { manageLabels.processLabel(manageLabels.selectedRadio); $('span.or').hide(); @@ -43,24 +106,47 @@ var manageLabels = { $('span#indicator').removeClass('hidden'); $('input.submit').addClass('disabledSubmit'); $('input.submit').attr('disabled', 'disabled'); - }); + });*/ }, - - processLabel: function(selectedRadio) { - + clearAddForm:function() { + //clear inputs and select + manageLabels.addLabelForm.find("input[type='text'],select").val(""); + //set the button for save to be disabled again + manageLabels.submit.attr('disabled', 'disabled'); + manageLabels.submit.addClass('disabledSubmit'); + }, + onShowAddForm:function() { + manageLabels.addLabelForm.show(); + manageLabels.showFormButtonWrapper.hide(); + manageLabels.addLabelCancel.click(function(){ + //Canceling the add label form will hide the form + manageLabels.addLabelForm.hide(); + manageLabels.showFormButtonWrapper.show(); + }); + }, + + onHideAddForm:function() { + manageLabels.addLabelForm.hide(); + manageLabels.showFormButtonWrapper.show(); + //manageLabels.addLabelCancel.unbind("click"); + }, + //Remove label + processLabelDeletion: function(selectedLink) { + // PrimitiveDelete only handles one statement, so we have to use PrimitiveRdfEdit to handle multiple // retractions if they exist. But PrimitiveRdfEdit also handles assertions, so pass an empty string // for "additions" var add = ""; - var retract = ""; - - $('input:radio').each( function() { - if ( !$(this).is(':checked') ) { - retract += " <" + manageLabels.individualUri + "> " - + "\"" + $(this).attr('id') + "\"" + $(this).attr('tagOrType') + " ." ; - } - }); + var labelValue = $(selectedLink).attr('labelValue'); + var tagOrTypeValue = $(selectedLink).attr('tagOrType'); + if(tagOrTypeValue == "untyped") { + tagOrTypeValue = ""; + } + var retract = "<" + manageLabels.individualUri + "> " + + "\"" + $(selectedLink).attr('labelValue') + "\"" + $(selectedLink).attr('tagOrType') + " ." ; + + retract = retract.substring(0,retract.length -1); @@ -72,28 +158,103 @@ var manageLabels = { retractions: retract }, dataType: 'json', - context: selectedRadio, // context for callback + context: selectedLink, // context for callback complete: function(request, status) { if (status == 'success') { - $('span.or').show(); - $('a.cancel').show(); - $('span#indicator').addClass('hidden'); - window.location = $('a.cancel').attr('href'); + //Remove the label from the list + manageLabels.removeLabelFromList(selectedLink); + manageLabels.updateLocaleSelection(); } else { + //Instead of alert, write error to template alert(manageLabels.errorProcessingLabels); - selectedRadio.removeAttr('checked'); - $('span.or').show(); - $('a.cancel').show(); - $('span#indicator').addClass('hidden'); - $('input.submit').removeClass('disabledSubmit'); - $('input.submit').attr('disabled', ''); + } } }); }, + removeLabelFromList:function(selectedLink) { + var languageName = $(selectedLink).attr("languageName"); + $(selectedLink).parent().remove(); + //See if there are any other remove link + if(languageCode != "untyped") { + //find if there are any other remove links for the same language + var removeLinks = manageLabels.existingLabelsList.find("a.remove[languageName='" + languageName + "']"); + if(removeLinks.length == 0) { + //if there aren't any other labels for this language, also remove the heading + manageLabels.existingLabelsList.find("h3[languageName='" + langaugeName + "']").remove(); + + } + } + + }, + //Determine if there are new locales that can be added to the options once a delete has occurred + updateLocaleSelection:function() { + //Check what languages remain + var existingLanguages = {}; + //Look at which languages are currently represented + manageLabels.existingLabelsList.find("a.remove").each(function(){ + var languageCode = $(this).attr("languageCode"); + if(!(languageCode in existingLanguages)) { + existingLanguages[languageCode] = true; + } + }); + + //Now check against full list, if any in full list not represented, will need to include in dropdown + //This is a list of + var availableLocalesList = []; + var listLen = selectLocalesFullList.length; + var i; + for(i = 0; i < listLen; i++) { + var possibleLanguageInfo = selectLocalesFullList[i]; + var possibleLanguageCode = possibleLanguageInfo["code"]; + var possibleLangaugeLabel = possibleLanguageInfo["label"]; + if(!(possibleLanguageCode in existingLanguages)) { + //manageLabels.addLanguageCode(possibleLanguageCode, possibleLanguageLabel); + availableLocalesList.push(possibleLanguageInfo); + } + } + + //Now sort this list by the label property on the object + availableLocalesList.sort(function(a, b) { + var compA = a["label"]; + var compB = b["label"]; + return compA < compB ? -1 : 1; + }); + //Now replace dropdown with this new list + manageLabels.generateLocalesDropdown(availableLocalesList); + + }, + generateLocalesDropdown:function(availableLocalesList) { + //First check if there are any available locales left, if not then hide the entire add form + //technically, this first part should never be invoked client side because + //this can only happen on ADD not remove, and add will refresh the page + //On the other hand the show add button etc. can be displayed + if(availableLocalesList.length == 0) { + //Hide the add form if there are no locales left that can be added + manageLabels.addLabelForm.hide(); + manageLabels.showFormButtonWrapper.hide(); + } else { + //There are some locales so generate the dropdown accordingly, removing all elements but the first + $("#newLabelLanguage option:gt(0)").remove(); + var i; + var len = availableLocalesList.length; + for(i = 0; i < len; i++) { + var localeInfo = availableLocalesList[i]; + manageLabels.addLocaleInfo(localeInfo); + } + //Put some value in that shows whether neither add button nor add form were shown + //because the form thought there were no available locales + } + }, + + addLocaleInfo:function(localeInfo) { + //Add code to dropdown + //Would we need to regenerate alphabetically? Argh. + manageLabels.labelLanguage.append(""); + } }; diff --git a/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividual.ftl b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividual.ftl index bf5d84337..6c5492faa 100644 --- a/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividual.ftl +++ b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividual.ftl @@ -1,62 +1,93 @@ <#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> <#-- Custom form for managing labels for individuals --> +<#import "manageLabelsForIndividualMacros.ftl" as m > +<#assign requiredHint = " *" /> +<#assign subjectUri = editConfiguration.subjectUri/> <#assign labelStr = "" > <#assign languageTag = "" > <#assign labelSeq = [] > -<#if subjectName?? > -

    ${i18n().manage_labels_for} ${subjectName}

    +<#assign submissionErrorsExist = "false"/> +<#assign selectLocalesFullList = {} /> +<#assign editable = false/> +<#if editConfiguration.pageData.editable?has_content> + <#assign editable = editConfiguration.pageData.editable /> + +<#if editSubmission?has_content && editSubmission.submissionExists = true && editSubmission.validationErrors?has_content> + <#assign submissionErrors = editSubmission.validationErrors/> + <#assign submissionErrorsExist = "true" /> + + +<#if editConfiguration.pageData.subjectName?? > +

    ${i18n().manage_labels_for} ${editConfiguration.pageData.subjectName}

    <#else>

    ${i18n().manage_labels_capitalized}

    + + +

    ${i18n().manage_labels_intro}

    +
    -
      - <#list labels as label> - <#-- the query will return labels with their language tag or datatype, if any. So strip those out --> - <#if label?? && ( label?index_of("@") > -1 ) > - <#assign labelStr = label?substring(0, label?index_of("@")) > - <#assign tagOrTypeStr = label?substring(label?index_of("@")) > - <#elseif label?? && ( label?index_of("^^") > -1 ) > - <#assign labelStr = label?substring(0, label?index_of("^^")) > - <#assign tagOrTypeStr = label?substring(label?index_of("^^")) > - <#assign tagOrTypeStr = tagOrTypeStr?replace("^^http","^^ - <#assign tagOrTypeStr = tagOrTypeStr?replace("#string","#string>") > - <#else> - <#assign labelStr = label > - <#assign tagOrTypeStr = "" > - -
    • - - -
    • - <#assign labelSeq = labelSeq + [labelStr]> - + + + +
        + <#if editConfiguration.pageData.labelsSortedByLanguageName?has_content> + <#--List of labelInformation objects as value where key = language name --> + <#assign labelsSorted = editConfiguration.pageData.labelsSortedByLanguageName /> + <#--Keys would be the actual names of languages--> + <#assign labelLanguages = labelsSorted?keys?sort /> + <#assign editGenerator = "editForm=edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators.RDFSLabelGenerator" /> + + <#--What we need here is printing out the labels by the language Name and not language code, starting with untyped first--> + <@m.displayExistingLabelsForLanguage "untyped" labelsSorted editable editGenerator/> + <@m.displayExistingTypedLabels labelLanguages labelsSorted editable editGenerator/> + +

      -

      - - or - ${i18n().cancel_link} - -

      -
    +

    + + <#if editable> + <#include "manageLabelsForIndividualSubmissionErrors.ftl"> +

    + ${i18n().or} + ${i18n().return_to_profile} +
    + + <#include "manageLabelsForIndividualAddForm.ftl" > + + +

    + + diff --git a/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualAddForm.ftl b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualAddForm.ftl new file mode 100644 index 000000000..e6d6714c3 --- /dev/null +++ b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualAddForm.ftl @@ -0,0 +1,29 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> +<#--The form for adding a new label--> +
    +

    ${i18n().add_label}

    +

    + + +

    + + + + + + +${i18n().or} +${i18n().cancel_link} + +
    \ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualMacros.ftl b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualMacros.ftl new file mode 100644 index 000000000..35839dada --- /dev/null +++ b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualMacros.ftl @@ -0,0 +1,79 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> +<#--LabelsSorted is a hash keyed by language name where the value is a list of LabelInformation class objects--> +<#macro displayExistingLabelsForLanguage lang labelsSorted editable editGenerator> + <#--get label information for this language--> + <#assign labelList = labelsSorted[lang] /> + <#--Reset for every language--> + <#assign labelSeq = []/> + <#list labelList as labelObject> + <#assign labelLiteral = labelObject.labelLiteral /> + <#assign labelStringValue = labelObject.labelStringValue /> + <#--Try label as label literal--> + <#assign label = labelLiteral /> + <#assign labelLang = labelObject.languageName /> + <#assign languageCode = labelObject.languageCode /> + <#assign labelEditLink = labelObject.editLinkURL /> + <#if label?? && ( label?index_of("@") > -1 ) > + <#assign labelStr = label?substring(0, label?index_of("@")) > + <#assign tagOrTypeStr = label?substring(label?index_of("@")) > + <#elseif label?? && ( label?index_of("^^") > -1 ) > + <#assign labelStr = label?substring(0, label?index_of("^^")) > + <#assign tagOrTypeStr = label?substring(label?index_of("^^")) > + <#assign tagOrTypeStr = tagOrTypeStr?replace("^^http","^^ + <#assign tagOrTypeStr = tagOrTypeStr?replace("#string","#string>") > + <#else> + <#assign labelStr = label > + <#assign tagOrTypeStr = "" > + +
  1. ${labelStr} <#if labelSeq?seq_contains(labelStr)> (duplicate value) + <#if editable && labelEditLink?has_content> Edit + ${i18n().remove_capitalized} + + +
  2. + <#assign labelSeq = labelSeq + [labelStr]> + + + +<#--ignore 'untyped' and display everything--> +<#macro displayExistingTypedLabels langList labelsSorted editable editGenerator> + <#list langList as lang> + <#if lang != "untyped"> +

    ${lang}

    + <#--get label information for this language--> + <#assign labelList = labelsSorted[lang] /> + <#--Reset for every language--> + <#assign labelSeq = []/> + <#list labelList as labelObject> + <#assign labelLiteral = labelObject.labelLiteral /> + <#assign labelStringValue = labelObject.labelStringValue /> + <#--Try label as label literal--> + <#assign label = labelLiteral /> + <#assign labelLang = labelObject.languageName /> + <#assign languageCode = labelObject.languageCode /> + <#assign labelEditLink = labelObject.editLinkURL /> + <#if label?? && ( label?index_of("@") > -1 ) > + <#assign labelStr = label?substring(0, label?index_of("@")) > + <#assign tagOrTypeStr = label?substring(label?index_of("@")) > + <#elseif label?? && ( label?index_of("^^") > -1 ) > + <#assign labelStr = label?substring(0, label?index_of("^^")) > + <#assign tagOrTypeStr = label?substring(label?index_of("^^")) > + <#assign tagOrTypeStr = tagOrTypeStr?replace("^^http","^^ + <#assign tagOrTypeStr = tagOrTypeStr?replace("#string","#string>") > + <#else> + <#assign labelStr = label > + <#assign tagOrTypeStr = "" > + +
  3. ${labelStr} <#if labelSeq?seq_contains(labelStr)> (duplicate value) + <#if editable && labelEditLink?has_content> Edit + ${i18n().remove_capitalized} + + +
  4. + <#assign labelSeq = labelSeq + [labelStr]> + + + + \ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualSubmissionErrors.ftl b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualSubmissionErrors.ftl new file mode 100644 index 000000000..ef4f8fe95 --- /dev/null +++ b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividualSubmissionErrors.ftl @@ -0,0 +1,14 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> +<#if submissionErrors?has_content > + + \ No newline at end of file diff --git a/webapp/web/templates/freemarker/lib/lib-properties.ftl b/webapp/web/templates/freemarker/lib/lib-properties.ftl index 7d360496a..f48adc194 100644 --- a/webapp/web/templates/freemarker/lib/lib-properties.ftl +++ b/webapp/web/templates/freemarker/lib/lib-properties.ftl @@ -209,13 +209,18 @@ name will be used as the label. --> <#-- Label --> <#macro label individual editable labelCount> + <#assign labelPropertyUri = ("http://www.w3.org/2000/01/rdf-schema#label"?url) /> + <#-- Will need to deal with multiple languages as well--> <#local label = individual.nameStatement> ${label.value} <#if (labelCount > 1) && editable > + <#-- Changing this so that manage labels now goes to generator --> - - ${i18n().manage_labels} - + <#--Previous link which went to manage labels controller--> + <#--a id="manageLabels" href="${urls.base}/manageLabels?subjectUri=${individual.uri!}"--> + + ${i18n().manage} <#else> <@editingLinks "label" label editable /> From 9ec7d11cab04b67035986516134c612f2cb879a7 Mon Sep 17 00:00:00 2001 From: hudajkhan Date: Wed, 4 Sep 2013 12:22:46 -0400 Subject: [PATCH 41/46] label management and concept semantic type --- ... => ConceptSemanticTypesPreprocessor.java} | 36 +++++++-------- webapp/web/i18n/all.properties | 3 +- .../individual/manageLabelsForIndividual.js | 46 +++++++++++-------- .../individual/manageLabelsForIndividual.ftl | 10 ++-- .../freemarker/lib/lib-properties.ftl | 6 +-- 5 files changed, 53 insertions(+), 48 deletions(-) rename webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/{ConceptSparqlUpdatePreprocessor.java => ConceptSemanticTypesPreprocessor.java} (78%) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSparqlUpdatePreprocessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSemanticTypesPreprocessor.java similarity index 78% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSparqlUpdatePreprocessor.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSemanticTypesPreprocessor.java index 04b2d3cad..b95733b4f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSparqlUpdatePreprocessor.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ConceptSemanticTypesPreprocessor.java @@ -34,36 +34,35 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.DatasetWrapperFactory; //We are representing semantic types from the UMLS Semantic Network as OWL Classes //and this preprocessor will add the appropriate class information to the TBox -public class ConceptSparqlUpdatePreprocessor implements ModelChangePreprocessor { +public class ConceptSemanticTypesPreprocessor implements ModelChangePreprocessor { private static String VIVOCore = "http://vivoweb.org/ontology/core#"; private static String SKOSConceptType = "http://www.w3.org/2004/02/skos/core#Concept"; - private Log log = LogFactory.getLog(ConceptSparqlUpdatePreprocessor.class); + private Log log = LogFactory.getLog(ConceptSemanticTypesPreprocessor.class); private OntModel toUpdateModel = null; - private DatasetWrapperFactory dwf = null; //Custom constructor - public ConceptSparqlUpdatePreprocessor(OntModel updateModel, DatasetWrapperFactory inputDwf) { + public ConceptSemanticTypesPreprocessor(OntModel updateModel) { this.toUpdateModel = updateModel; - this.dwf = inputDwf; } @Override public void preprocess(Model retractionsModel, Model additionsModel, HttpServletRequest request) { //Run a construct query against the additions model - String prefixes = "PREFIX RDFS:<" + RDFS.getURI() + "> " + - "PREFIX OWL: " + - "PREFIX RDF:<" + RDF.getURI() + ">"; + String prefixes = "PREFIX rdfs:<" + RDFS.getURI() + "> " + + "PREFIX owl: " + + "PREFIX rdf:<" + RDF.getURI() + ">" + + "PREFIX skos:"; String constructQuery = prefixes + " CONSTRUCT { " + - "?semanticType rdf:type OWL:Class. { " + - "?semanticType rdfs:subClassOf SKOS:Concept . { " + - "?semanticType rdfs:label ?label. { " + + "?semanticType rdf:type owl:Class. " + + "?semanticType rdfs:subClassOf skos:Concept . " + + "?semanticType rdfs:label ?label. " + "} WHERE { " + - "?concept rdf:type ?semanticType. { " + - "?semanticType rdfs:label ?label .{ " + - "?semanticType rdfs:subClassOf SKOS:Concept .{ " + + "?concept rdf:type ?semanticType. " + + "?semanticType rdfs:label ?label . " + + "?semanticType rdfs:subClassOf skos:Concept . " + "}"; //Execute construct query @@ -84,13 +83,11 @@ public class ConceptSparqlUpdatePreprocessor implements ModelChangePreprocessor - DatasetWrapper w = dwf.getDatasetWrapper(); - Dataset dataset = w.getDataset(); - dataset.getLock().enterCriticalSection(Lock.READ); + additionsModel.getLock().enterCriticalSection(Lock.READ); QueryExecution qe = null; try { qe = QueryExecutionFactory.create( - query, dataset); + query, additionsModel); qe.execConstruct(constructedModel); } catch (Exception e) { log.error("Error getting constructed model for query string " + constructQuery); @@ -98,8 +95,7 @@ public class ConceptSparqlUpdatePreprocessor implements ModelChangePreprocessor if (qe != null) { qe.close(); } - dataset.getLock().leaveCriticalSection(); - w.close(); + additionsModel.getLock().leaveCriticalSection(); } //Add constructed model to the designated update model diff --git a/webapp/web/i18n/all.properties b/webapp/web/i18n/all.properties index 7980d00a9..b235c903c 100644 --- a/webapp/web/i18n/all.properties +++ b/webapp/web/i18n/all.properties @@ -675,6 +675,7 @@ photo = Photo no_image = no image placeholder_image = placeholder image manage_labels = manage labels +manage_list_of_labels = manage list of labels add_label = Add Label add_label_for_language = Language unsupported_ie_version = This form is not supported in versions of Internet Explorer below version 8. Please upgrade your browser, or switch to another browser, such as FireFox. @@ -858,6 +859,6 @@ subproperty = subproperty manage_labels_for = Manage Labels for manage_labels_capitalized = Manage Labels -manage_labels_intro = Multiple labels exist for this profile but there should only be one. Select the label you want displayed on the profile page, and the others will be deleted. +manage_labels_intro = In the case where multiple labels exist in the same language, please use the remove link to delete the labels you do not want displayed on the profile page for a given language. processing_icon = processing selection_in_process = Your selection is being processed. diff --git a/webapp/web/js/individual/manageLabelsForIndividual.js b/webapp/web/js/individual/manageLabelsForIndividual.js index 7eb54c92e..7e1c8128c 100644 --- a/webapp/web/js/individual/manageLabelsForIndividual.js +++ b/webapp/web/js/individual/manageLabelsForIndividual.js @@ -32,20 +32,31 @@ var manageLabels = { // Initial page setup. Called only at page load. initPage: function() { - //disable submit until user selects a language - this.submit.attr('disabled', 'disabled'); - this.submit.addClass('disabledSubmit'); + + var disableSubmit = true; if(this.submissionErrorsExist == "false") { //hide the form to add label this.addLabelForm.hide(); - //the cancel in add label can be unbound until the form is visible - //this.addLabelCancel.unbind("click"); + //If the number of available locales is zero, then hide the ability to show the form as well + if(this.numberAvailableLocales == 0) { + manageLabels.showFormButtonWrapper.hide(); + } + } else { //Display the form this.onShowAddForm(); + //Also make sure the save button is enabled in case there is a value selected for the drop down + if(this.labelLanguage.val() != "") { + disableSubmit = false; + } } + if(disableSubmit) { + //disable submit until user selects a language + this.submit.attr('disabled', 'disabled'); + this.submit.addClass('disabledSubmit'); + } this.bindEventListeners(); @@ -88,25 +99,15 @@ var manageLabels = { }); - this.addLabelForm.find("a.cancel").click(function(){ + this.addLabelForm.find("a.cancel").click(function(event){ + event.preventDefault(); //clear the add form manageLabels.clearAddForm(); //hide the add form manageLabels.onHideAddForm(); - + return false; }); - //TODO: Add method to check that language is selected on submission - - /* - $('input#submit').click( function() { - manageLabels.processLabel(manageLabels.selectedRadio); - $('span.or').hide(); - $('a.cancel').hide(); - $('span#indicator').removeClass('hidden'); - $('input.submit').addClass('disabledSubmit'); - $('input.submit').attr('disabled', 'disabled'); - });*/ }, clearAddForm:function() { @@ -179,12 +180,12 @@ var manageLabels = { var languageName = $(selectedLink).attr("languageName"); $(selectedLink).parent().remove(); //See if there are any other remove link - if(languageCode != "untyped") { + if(languageName != "untyped") { //find if there are any other remove links for the same language var removeLinks = manageLabels.existingLabelsList.find("a.remove[languageName='" + languageName + "']"); if(removeLinks.length == 0) { //if there aren't any other labels for this language, also remove the heading - manageLabels.existingLabelsList.find("h3[languageName='" + langaugeName + "']").remove(); + manageLabels.existingLabelsList.find("h3[languageName='" + languageName + "']").remove(); } } @@ -223,6 +224,11 @@ var manageLabels = { var compB = b["label"]; return compA < compB ? -1 : 1; }); + //Re-show the add button and the form if they were hidden before + if(availableLocalesList.length > 0 && manageLabels.showFormButtonWrapper.is(":hidden")) { + manageLabels.showFormButtonWrapper.show(); + } + //Now replace dropdown with this new list manageLabels.generateLocalesDropdown(availableLocalesList); diff --git a/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividual.ftl b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividual.ftl index 6c5492faa..dea117f5c 100644 --- a/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividual.ftl +++ b/webapp/web/templates/freemarker/body/individual/manageLabelsForIndividual.ftl @@ -17,7 +17,10 @@ <#assign submissionErrors = editSubmission.validationErrors/> <#assign submissionErrorsExist = "true" /> - +<#assign availableLocalesNumber = 0/> +<#if editConfiguration.pageData.selectLocale?has_content> + <#assign availableLocalesNumber = editConfiguration.pageData.selectLocale?size /> + <#if editConfiguration.pageData.subjectName?? >

    ${i18n().manage_labels_for} ${editConfiguration.pageData.subjectName}

    <#else> @@ -64,7 +67,7 @@

    - + + + + + + + + + + + + + + + + + +

    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�y0>Ubp?LC!2mW{yh^8OzZe!2pBlPNo?!+sa4`uxV6F zg!+g$V|4EsC;Av~7C?iT{(4|$xFI^KOiM~bIPmgsF@YC24c>vi=p|n3*q|7bV>y@k;%ptCqjS`y?S9Mza?!?M*S(DqBMcmK>2~ zti=wB!YpjotC4uvZiOMU)Nl-Yrf^;Jm4@tEs@=p6)R08cE2Vpc@RqA{H{z@3gG2$c zRqV_DN<&O8ESf=btuX365uBqKq#3+2h0l&(`F`>5675GGv5?9mS)@MaPtDC!@s9z&f~{l07Q7Gh6&4DQ z;IEhk1HDc3$Um#^#OG4@+U67+F!=g-LN_W*fV!1FKIeA}f1uluxaAfhehxk;pJC_< z`4kMcqCG&NqDiQAU4Jro<+_#|%l?V1aocRmBq$2i`1YfI@;1d48b|x^) zRTJZwHmx-#IoNdN#y4+^c7^HQ7EB^A)1_udTwFA@fO!MmtPw%KgDAff|MMxoO5`t= z^#SI6RL4Q-@9a5@DD|Wy9}zWn%-F!GWavC=zNjQxL_Vcew`jviJ0tuC?2w(8&{rh* zcQ23>QEQBFs+`1oFzCLYG>?u?1Hm<9Ad|NqO%S&vjgUj*_aeXKhJJa%6b)~UXL*?} z8d{qV+JT=&>d4LHs5|EY-C8Y6`PG zrt@C9{G@`0L{W@+O(4`WrGc*_;DedXtcPiBkD`pzHYrVP0q3(gY?T6u_$kIhHFLfI zP^7=M-xwuCd;gwZ5x37F_hQoeW3%uj=FWU-F$&aL z@JjH1ZW-(-Gs!-_=@#~T+wg6R05Z0>WiT^zb}@DGu(e^Z`e%GOgNdPwq0x6VDTAe* zi<7;x!?*i^;om$F|NEv#-O|P4pQh@6Qg4aEl-v*_B5qouf^xn%-%sHVg9s9^VPT=4 zkxCT_9NZI1xX4|Nc=&yz0SLQAi1a-w^Po!4%-jpJ!tei4AAs0{nZ?wK^%8X#=dNOI zf|dA}k-fzuem2RshDLGnV*-l~`pmS{h3FsNHL4@MY-`)@2bJmHL7#?Hc_rn=x#6TV zLlZv>SkzGHe2pXaY{;GgaBiOm52yCiXN@L&Y%w!uQmRB=?#Y|vB-W)SpBth@m4O!n zGN{I3dv9MYsV^5>3_kG;iB~bpCJZ!ZxSXNe*Qu}+G-TpH!Z1ySwxO)ep!x{aA(Zv6 z=*9;S+^f*zL!uTDcEf%D?S3OA%j3Rl8T`$3xG&~U@9yUIirA+vpAX!7M8Tw>0UI|EyMj$TIqhSME6Bj zsowWS*J}IrDgQ3eVIHYfV#dk zMfOR2sZ&JWG@#_|)#`W%Ze>9rgB*~Kfj)-_!m24BQCtCnFHZY6qXwQx83lubF> zGARnxUjR=vx)~QsGe&ek(m-KSuurOt`P8Wi)=a`L9ZxR#l2^CN2IZPv$H<&N7cP}3 zw%@i?x5_r>wWVrz`z7HYh|n9{K?Uf%hxaeOCtk$820sPPp++uq1qd;j)UZJl6c{&)+(iOq z0A&>!~X7XdH4vY$yk0LxczQFdbzFLFWLUP{yi!~^bnQY#zUX`D@ z0_v{Pq=zsrw?jymy+F>e9v?K(X-iLXc~{S&P*HK@^B5?~Jyu7JDOExP_`IlVzvj>H zy&vaIP+-ybEN)%FcoMb|oB9ki(wFf;F<{WQx->2-D~v<#Ho(56BZ%75xU0+3e;utx zmKar<+T72Ol*?eg9JyG}6J!PJN)$LM<7<{NZbbh;&K!aAT83|T^cv9-c?-@@^(M?= zpVN4m#x;Afy?K_j@UXyIf&ZbpyV&qx$-LT598Hdd4QU)>3Bs3`u!lp&W^O4cOmMf9 z4z9@LKRh$sJ{EF)RfLPFB>usQYpiNz6w!NA zc**OhAI7l1^9%Fz=Glwv*fd4m;ls)1E;tPn-Z)mfx*=z56#NizYzS;XfCKrD?0RUm zk$C;eb&Qy(+OGjF@s1oP7uUGm$!rwPk@6)Q=9r2RW9gdpf?M_?XmeS%=!_Efi{^sc z*f4M*dX~ED)A^x219F4$V%r=u6jk4ILEb_fAk4{?F`|{%OK0P;8u|l+ zr4hS{Qm#qoJTYF8a=7YIj<*tPv>_k#?^_`X~oDV1O={6W$94#*6-+{X~<_vsOJ z5ZptE`uWMjo6vqHSmFF+OjbtwuMN!8LtW0VbRd~xG)4TnmAlNvI8*mBj+uVnu5HLL z>hH=xpA1&veSG(<0a6YPAs77`{6tu5Z9GWpXCADsL&i3?)-)#%h9;~$W?9`F6Cn>*yJ|fRG>EX8SRwo# z0Ue#hm>TCW@6i`0I_1y75Ae6bLKAUhZ@$YC+OKvR%{=@$u3)U;r#TsaxNBSI$-ST?o32wX79ucu|8YP*RA zn`Q~4uVBHtX2c~EUN2<&G(Sp9OO5i+E1M(hU#|~-J5HpUJ4z*cEzTyhb&%(vTysjCDpfNWXA{r!$EpGQ@u70@t>Oo}y;G zBvgZ)J6H$M64tSw#&IgC`NgG{Hk;4JH)PeE%Z5lkB53#U{zxC!$G7x*qXvRFs@46J z_qfE!vGQ6&3#IaGiqD{((EV#iM(~HL_-=Da6eUw zyi{R&gzP|S=NR6mD$%^}TDePXFO15k=_pr2g<@~YRf|9~6Rw0`8-ErqMZ-LLvNz0` zQ}PR*OMPghJy@8(SCoTp@lX;oh29%E6<*y{(1BoRgn@{ktQhea_O^cP;5}C%Ui-RoG!kR@9b%VyV$y}2t!X&{Wv(g2H)R)(%xRJVgw72Z*Oi4vo?bM z2hT4q-4d9G`Amx+dmP4R@6AEOPu4h0WBRdfa~9r19$tiviM2nYk=pi=LqgGDi-qCp zQJWvT_!HiG#``{H17u(7QMfA--5zjPy;@=m0DaX$sW!+QbV;{+2k)qJ@rtf`oLDTA zH#bkn3rn0u)ehUGUA`0}=hs5SEsPAAd~-Q^bI^5o@S8x-WZw{xaCWe($?yCLhi@qSADB@__BmW*Jv=u1u_J;}45}mc4VeHV8EX_Cz^C& z5*n~g@nK;f=Oa2R271D7`l#fGwv->OQI(71DLeR@o-s#Ip+bseqT9Cw0Pr(hIS{>fEn(L@5>cHDSDRj(w)=et-V_T-J zod|-HEWeA(OZW~a<5}l+P?R?;ySw2yF9-{dAx-ea0wS+X=@f70rtja|H}|_!_0c?8 zbf-sK5x}~bG(+8tHHd}7n5L5oCWmwtn%?7c(8MQ}UXX>8;WSe;%OVWl=U-G*V!;1uT1__Ehtq5De9-m__{`W)r#^;UGSOs zGzqG{(HHj9Hl=idOWBpo}LI3Eex)B#r1>KURl^K{8< z8OuFHSrh@ z95+=m4*a5b!k`dTBbR#T`VL~fw~V%X1PJU?{r5QTjNxtC4m>skm^WjbKDfoxycuD< zJ=LF`J=Vj>+A*da__bckJK+%;yLJW$t_(rL9qT#yL=z&nsQq5BDx(KlKGfe~%&MZN zT`g}NMQ$C3ZyjMt_)IenhO*H4&3*8VeelhFat(ZP&3yc3UU-IHc&1*yo%bK1x33JN zC!V7xV52AQ(Q_!#b6-A8KDA?TmNyNew+&btGB(U%5ic^RKIB+0GF)apa+u+Bhd+GC z{egY-%zd^Ee6~$|wvBwY&3v{EeYQ<~wvBzZ&3*U`e7?W!-{BXZ;g^q$+t>74&#c>5 z09GD>=V!dXXbg& z%s%sVeOkY(s;;{3s`^*SGw`r(7pZ9w5^7DlVzBr0i&{HinMoZDg~Ayg)9h;8aIZ&O zIp96N8oQ5ags0Ml-f)qH?>MkvCj@g*bh}aXhcY4BU^`^j2ab_9fCqQW~|uokAR}{SE;pIw=qwJA|LbzK*%GWN<~P&qDJ{ zb@;QZ#-K=9KKb~gkO@~JMsj`#g`8BPJqMAMJKt3WWh zDdgjL=wtQL`N;L32vAcKDlqi1r6y1dBVY^IBh~JwEso$O9E7zBP>>}P&rzfLQgZgi z2=zX3Nq1cO+#gVNJn8D5b2UE$+GdwE2rDdM7K;m3DU1&`u$`sLFkasrn(-!-oULtE z?h|)JOfULMwW_(xt5GKBAO1)d_v_vz8i&xdRjSR63kl7aqb)XfCCsLS*0k%&n=L5DWEu^eQ zj*1?u7^ZzSi8vJ46y?#L^n3v?$)l8$RIPh_bL)0E2vq4%+1>Wt{@M3JJ=8d~*NJv_ z<)weU5@@vwgQX2csy+0w6J(}sK31#sR!sH4&t-%$N8%|;XRi*b8K57kUdxQ`kxr}` zFu$fUu^4lkDAnUySChTPwi+b_k z@SgpLdAsAMXf?oX=y}WhQR)baVobwEryueN_Tq||jmG-(sKN9se6kTTU3!^##+i6S z5Vs)UbENWuvcf=|`~pW)VBi+=z;fY;z8VRi=JS~N-jV`&rUZ2La&(MxbheAZ^G#+6 z73#&M$TkAU#-CkcDJ9>?IW3Z;G*{~Ym%Y=Ko-8EOrN1|w_HCO8Cc2TUu0#{Rsf~u+ z#cq@!hia)ekrAekh%sXfurF_qWUw<~VzW`=F+nW~DJ#VX^zG^~D%TF7mtK7vj7Y+W znCCfVDnD-pQN|W$8DMAIc2*rn7say}uX9bJq$C|ce~GOO@p&`OxaXt2QF;38aD+0R zqgorGBS_g1Mc3hXF^hM_?SZ5^qv_`RbFlsv)?4;so6#dW?8qxk3~!q2IYwnpH0Z}J z;Ql5O~M-cD>0nCyvg~-SI+p1jB-jzQ%nl#3(>i-aDeQ_VIHd=%e2s3smSvFlc@M2usL@`N&0XOe0x zO|Quqrfj>BsMp8&*@`XIIwe5Mm`3E%tw8~)o?o)z*9yP28qyDa>GdFHd#puhlfF`N z7B1Ej7|Up@K82>-SZlRG7Aj+`w7Ip*^kr?)>O`1*x%kw;2Yv1MRQr5FQL6$>!XNG( z_!!T(2@J~W;KJ;m(`JL{M?DhAv9=T@nVhBztkOmT?|>7dWy4-;%u*lo8mnoIkfzXz zD9d2QOKw$1l%;tm>7p1-RUNEPZO;4B$|U*-r}hDnAyoJAS_%yt zrXdy#*A&CHh>rc`o*n0Nf=tsBx6SBiwDduDp%sX>Yi24H8i9HT`s((OWUBe>CK?!5 zh5B_x9HDA=1$5i}(YV%GxKy%H_`qquW2CRIRZ5HI2# z~Kkn{NQ2=yn}#yYr_3=d4Y&%XMbRe84g-CTt?YIc$j^w8#Cnn}M`LPopAaSc(^jZc>X5(0If^?G<~1yL_mZ*r9Yb^Hzv#ZxBvmq}C(^H)Cf}zki<}Z`!U;p? z3fyzexEhUo?l-N;uilFu{#GM??gUE%s=gLr{fA zZY<4Q3v^H^Vobh9js{<99kf~*@?Y2z z&y%br?!vJTw_^fdYPW%4iS@G~X*Wj%%q!IM&cqq+h@XRpIwBAB9-R5EbRMMnu1_^k z7xzdWaN!SiZg}Aj^^d;(a1Jl{c;`dGZ;xMiMmM5sADgpHc(#T}FU8NjN29^7%tf-V zcIw?iW)9T8WeuPqf13%XeX0f0z2Bx>_f8xjr^UVBMxgE7AIR7FmN_JI^WC<_O{$0W zjV+*loxOO=9`pc(3t!IU7(y@{_84L=WC*PF{!54#@Bq$Lin%$xrCj*rVIbVw<9#@F z{hKTlndiMr6P(in)b4{i0#G9*>Kqb|`~;J;VonDqb~a?BWl`-LJCB>txo{hx9CJq0F5Bxt1zi)+I(x z>(lwM4eAJ9TIr!0+6?OY+Bx}E@0bNSIfS_QhJ_mn#Nm!X;+``&`ouhY zvG(2};q-*7YRfgn+@h7IQNN(qb)8AZZov2L%ZC9|ME#Drt;iMv z(|eLE5;orgDHm(fK2Z z+YI4oVvK4xs|rjD(=HH;DUO+WdXe#N=TH9340{m+I20swr3Rk@utl@^4k=ti{n3=$ zzbCJ>*=W3+vP$H*L#P*zp4f=*9Oae}{ciLt-#=X#Sz3u_eYvS-=M zvC}Z#n*Zfg?bO+?iM@6_5~9MMxUL#C9443+;wJcOHM~=J`B(?+<$Rm(;sZTz5Jt7(; zsn%bUN9txWxd3w+_eyy8E;RDNIC_P)O6oHZ`H0oDbzwG8K1)s8Uv5TRT)_Dj#aX!v zP3oMQDHq7P2&x3jJZ_*Kmj7KF)qPiy$6b!>Y)=q57J=gdTM>>U7AC9jI*3Tc%0uZ~ zc{MHuE5TI+hdcdnMM4&dyY27@8if3nk!q}fD!EQzRDoPI3&IFgYCSR!eNBj5Lx|la zTwO~i&}CocZI2NZ-*!Yid2F4O;Xa`(|ir21Z&bf91I~sD5O%Uf>tDPG_4Sg(2~dy7ZdoI zj#+$-i+SX1rWm1xqwz9|d+|F?$9ZvAXGF`og@^cp@Un2{g$a)?rKR->RZ@HHre}EZ z)~8lATDyAhVx{P2b=~y-Rx9VG@-~f!X7%iZ;~Vwr5tVEL_H&Dk6BBOyg@gJ|9?ds4 z@zx;D;~lMxlCut97(tY!sl29bXYuuJcZu!6Fb*tF^rf}sF*ZFz-W@Qk@`%z;8!`QZ z6`xhtRTpKj7VOxTIA}bU2f|MKo`7a?T$ZR^=WraBs2%6HPpdSKi#&(5fAmYceiFsr za88h|I+e)rbEqAWe#&Y4m3ZDNy5S_q-l}w%pW@&oc>8?4DdGJ0H7^@9>x#llQU-LyN5 zS?s1JE*&pB2R|-8U83Wv*{%6=qAGp)t*eV~1KsG>!*tW2$W7c=oaW+oxW+ZFPy#f#deOX% zgKOtCf68zXBOcuCKL#gI795A*#t`_e?M%%sx_dh%qdS=qDRJm1Rnx*qaVYA`?u0*) z=JPXJfo&l=U1>CC)=&cC>{GVl^hf)anVqGH9c`*e(C%Z{;D$mxUY?t4Z->pg^hgQn z&};c%*O>YiX~!7X2=p8BE(9*Ozfw z_zJrPiEsmqb9-68aw8<4l8Vh9+zZe`5|WZX?-(s%=*zVZCnOJtSdgd==v-a=dIN#EMxshVYT zSl+tCx_Jz*v3u6c!Nwi!le)R6zUl}ueLf(}!24y~52}WtkJOd++?mvSLartCOOpH> z2FoXcHjI@@blZVuxHca_|6?j95FpgCK@_UT0AA+{_$UA{u<<{biuvaW7|uJ}B_1#^FhVd~7cd$Z zFdGrDs_XGM=*{`{f_VZFFdvxg-B+!*hW_oi`Mj`o?6->k-P7$?uD68#xc-9icI3D5 z_PD&)ZU6aQM6aRt_Sd-nxOwCd8%yczivBvGw~YRFC$EnJsvJa15wOXv@!R(PxY;}< z5isyDDL4oq%wl~cgFy309G3JJ{~O8hIK>SHM_-kj;6ATXaD}m9J%M(`-dF*#Pa7mG zB48q5Bw+A*M*2p2CVD{E>V8}#U@TvQYL+qBx|vA-5}?0#C8vW)u7d#HGG75hE!6*a zh$Qq~^p)K0jQvtl9!!aJm`=?2s&7YPGYvm2qWCJ+_H7xh+ivrzht zh6ttWE59LRvLR%pyTZ7nO5!tm>exlesYIp=?x$b8?}a&51WD6WlKf{|pw>F!Bn`Vx z4YEobkQ5>jM+GLu(%Srj?;f(dzI-GmOqNBoD5OFdTl`2j4!!c!7_x^&{;e6-q$IS5 z^y%sI5HF+am_-Hx^&(aiECvnsNf{my1^Re$HN0AU7CF;8x%;P8^q}6!N)tJ;^TBiV z@vZD-(j+DB1>I%Mb?$x4P(j>`X(!zr;kZsqdQ{9-gUp)g zOmSC-^yl!D5u)*GyD%#rvpS}1L{Nq&z^&BaZQcVwZT1BSgzS|$gzYGpd*TyJicrB- zWQXJtuPRi^u_CA2F)Rn)Gcd}wX7c1W!)A_46ENm>`qbn6KnbfzGpiwzTX*a8jhM6| z(a0s`m?ssgiX1e4$XY^q*+9%QY6J>TE0s7acEzQ3HMQi5^{0%jg|$s2=IGzaXf%}$ zSb-Aj%L=>DEB;6=N(^G=5QJMV*sEA#YNSMj0(WCe&2lEy!pxD}Pe64vC6zW@tci4= z1P)rTC29o8bhTQ;Ebno8U=AUP)vK#hgvLa3R@F9EYj4hQU!AR2Ck7S%5q;ROO>yWE zBhOXkIbX&;B5v&Bo8oGvweMBxG<&C-Hqc58n)%DGl1S*R^{j7|N}4Gwv@s-lnFPvj z8FN-cmj>qKoOvx>!&Bq|?HKO6Yh;v5+t14KX%C8avt5=kJ9$L7K&Xb`SrLM&^o_vB z1r(7OQ*0Jy$>;-Y`M#nN9oy&v(hgW}TYWIpqTLjxKm&4hCh1U`ABr@1i%H((mBdsK z4zb=tuhhCPXs0WW6o%xA(W7u*Jv4qOgt|XGADS)&ZCLbC_rxltN#}0HV3ul3L~iuT z2($iFnhE3vYA@VotpQe3xI%_Tfzz)JligvYxDRzhe^DMc zf8xN0`k@bU*%Zd;COQBz=>BGDKa5%)=1N~=fU!d{8Ola`iGh9!hNV?!H&H^TU)~HX zDU3-KmuYzjw0P8zbjVyhS6@-lmu&c)kw8s5&{FAwLg^MgQMOUD8c*Jq$uWX5YyLy= z%;4h(1tq!ha3Day|+{^#yB(I34~q#fXy!B zAE559$`0A{)&lY&tHU|+#Vz0(b;=6~|2|cPDt2itWEkZanwhY_t0*=mFgfLWvv@RqL0x*^#wFluKYoGweCH7EaTy3^8Mvr{>LwkPz`b0-*5OH3-4jyN0G)#(zM*k_5IO;_GCKLKL=CjzN(pR07N1NB(&U^_?p z&Z)u-wcjhX$RsLK(vV5@(mWU&B!f}fYR;)x@yUWW-qX9Kpp(PrPu4pI?x5KfmQ#AcFIXG$ zKjM3(ZBnmGP}bjq*H*0TquT-{j1gWEeyFTn^3Y-?yYuKePWk|R$*)zz-5XVWb@uh- zL%Sq->7xN$`((KiV?BOT$1*f?Uzd8*3hV(jKn5l7r|PG|*Swv<R>H2B%P!StEgV9w*;MP zDvt^n(^j!Cs76XOj_h%lTRIpuQrrcdI?0!)5=$B{UgJ}fS(4O;^0k*~rq5KKgJHk3 zYCC0t@B{&?YQl1;SNhz|Yf6Z3yVqx}=8e`vK1 z6#J^(){M;-H0W(iRnfVXtbWJu4wq3_ldgQ zwDP96(kbSq$CfV$&-kw(Q9Jd?=y8NnU?%V;E)Od&+*21%^)E)cA2-`5z9();-RKOM zb(lP|dS6o6_7`3QS3em1Je%=EX`;X_9P$0Wpdvj&>Xs{$_%W)@Udr_W&RIauv{Qoy zbP^TXIifyr{i5%$D`I+c56Ydt1@m)oN#)BQD?)zqs3cnlrqyV0ETiK3mA1~{Lo^~y zoqU>BJHV~m+{Qdsay|QyMI9M;2DyV@snR0(IF4V#@Zdg^V7$XWMDZZ4xo>q8uFcEX zp|!_r*SB3~P=Q>Yw`+=y2-QaXi!7!1S8Whi-*B3G?0R+EuHsRF7X|WgXtqqsp5B(1 zW36+qja)^g8)@tD`~2+>D41Y}x7UJtI=)JYIN2=p(M&Hap=DOhgJXxGy(q&`3Dy+- zml`$>Dd)|G2(Ic-|FOa!#%+zhM!rd-e9@ZFjUS;DlE&$zos3m>R62R5YI(h0{K}MY zPQQFNhe8`XjMA(;-qHPvlv6x}AD>!{t?kNX@Ux`vxIgukE}HX59|orFu&!Q;$Ki>4 zidMBY5o&ei&dO?EoqddhFpsPx3A-GAiwj*5{y}qnb~hm+RSn*=fGg)k)>M^Fg?rCAuxG2pzX02!X$sMu#qr0W z9ZUD@G(0^lWs6E{>^b~;^8MG3S^|1VfJ6i}q0?Ghoi=-aG);)Gc(pYa<m zpTmLTq*oD?SMLcgRc*va9vXYFMe@HL=^fL}x@8rNF)^kE&w1)~&G|orL>||Ij(;7! zCF|o%Apm?j7drEbOS45#N!Sc>M=gHAWPD7YcMG@f5jwmt32l9j&%v`UWK{)G8Ol~U zC~78l5e|Ww#?}b_77go6b$QUn<21VTa0OI}yg{6&?6kT*ZiQ6r1BJ1CMBi-(ir0iv zET%9cJgc9Xy(WYg>x5Fu!XsYaJEW}T=|*{aOlw_f9(TCvR9jMwfNJv87@19MUKP+a zO)i9#ub+sfO|hg0UGP{R`H@l}dpI%SaV0n<_{hrivwMQ>+;^kPtUYk;^V5gTjgJJg zMdkTcyIh}b$<>pT4} z+yIVhIMV(mcYYi9fB2P1K;Q9Cg0GC3lIY`uAMCQ8>mM{bsRf7g2fy3$H$||*-@-fQ zKk|yJsH0yA+^Ae0x+ZeF1o}p1k16Xv#6ZW`h0*!8{Pg_(2x1r1f$U{PI*b^B7y-KN zXzkPte~5=e3zC;wnb3Wxg2k-c6zBk_#Ka|jaWd^&a6<&bsB=aN4M;%5WGk%BoVG$ur^obr&gI@$L%EGxbU${pbYdwT`>r z)v7FuQP!@ud^y9H-SpZ4Adhb(Ec@vYu3Sy z<*2PL`B}-4c>U^a`pN2tych-=I237 zPeCv_Ts`hSx&vuw)ReKdS*UVs5m*G2pCeGIkJZ+LZW>xPK0(fx>Lu0OS zMx~Exs4>gc{@|-rSRrMN6;rD1^2OI{{{116MumQ;-LTtNpC)F9q5>nyPz@#X9xtJ$|cNYkl#0y{ zR!gQtflE4~#!Awr?@C?CI}yO!jYlj)6*3^$ z4e?htVNqa>WQ}<4u^E6wOdD1F)jEiJ2-^Hs-j93@lu61-?vSc~y&I84?h%nFV?1b9 zgiBG}UMq9IPaffTOjURE3*EMu*cmnmIPXSWpiot$4ZaD~DY-oF+L>|3&%Fu4S$Q(@ zLM05z(w^hthHggzMC+A$$Cel9Y*c=~MD&_tlI&N@Pg-te!;1tT>=@;gau1Om|OmuMdZ09`}yF#($|SG^NUTr z0`+oH!72u}VPUyn$r5hkjRGS_Xifni@)H1;__r=(ru|Eg7NXRfit7u4as_teuL60nESka&rLbhG4Vq{|G6CDNCGCx%~ z6|%Z$%%q|(wv-NJWhCD#P|C}DLxai36l<44$p@ZK9Q3mi^p)sC3O|2kX_MH`(tpC@ zC3KF%yPf!u$z+N?VW1P@r)EO%>vDkGkc+3Y1$Tz${R>2rbngzzkEE=u%Fs?Bi%wJ5%&x z>ib2a=B#3SLJnsb;If@<#C4d@)ScZIr^!`z%Wn|!2yCD zLlnt~qA=sZI)7TwIF-ga+j9uy$f8Yh?6r+)2=BuNDC)K+?WG4uQ5Q43)}QjZ!d6Rg z94>0EZ8nGC8@)X(WzRdMa~nB!CTCYNr35*r=?k-2-`2>JBjapl_1zD0lqw*JZY6|m zzw}R}>3`{WiVvw%T8h*dL3F#F*qgtew|U5@>b9ZrVMo{z{uo9`q0^e8_skR|Em;k= zo+V>Yep1^KpEO&MJrh{Fmw{A4Z~i$V^6s#@;>69mj@bO3g#7Z<$~WpD%f)#Lsw7V} zl=i(sQja1T?;c@T#Y5-N1$$D$>oDse*yZpU7smQdH>_zY(kRkdhA(&CkhcUbuJVm_ z%3y1Gp5n!ZWli3;acPvwy<>8pIKn1ep@6yzjVV(*`3JLek3poPMRT7|dmCma@P@{l z&%r_sq+}l^BxaeKs@$C1P-_q=mCBWklMB=j=JC1|L;5KLzX5`9V$`u_YP$D*BeRx? zrVAMAAK#W8((oH!FYhcBtkyQp2iL0h)8(JyJY9nGOlVdiBZ4}A`CNbqx1EToaB}0+ zoW0!gr{>bCTX2rS0DZ4Vm=tEi`z7!_9Dzo-c|0X`pIfegNMRTs&JV=^>icWK3%n`1 zd+731KghYbB*My^9N~*_gxJ|3(KaP*j9chqP2U$=E6dh)qIv z|CfGTJ#L3I!olL>QH%t}5;R4rUvGzR_)}nba$bE|rD$Thx8qr!-oq-7VkRb2yymm7 zueVs+k>&Zd2h&;lQgK(!L`ZQ)h;dr6yA}#@;^IZf;#J}f+KIbCL>ES2F6tvijGz0` zG45QqYk3AMMB1Yv%3}|A!WP8t>CKrFc&gN48l$mP2nEZifR1c5roO&o?BG~rV_^_x zh@`1-Nl;r%iyInXZyEqox5W44@D7q9vc7};V@A=SV;PwPglZCi-u@d$d;dj(|I33! z-@xk6*GOS>tqd?fKrZudAyc2;A~e_|QI+O?#e{-cbR3hoZ(i#-t=e^ChQ#v?CYWSF zm6Kx|G1`|k>3lNvS$_M3zEjk#?1%6xs*%MyP4vQqhbaStphe)o~foT*t>NJ!wbs)!jb95i>#&qwZSCydA%EuDv;c zPK(ZoZiog8pK9>-fe+h6gMLbrrTIMj9F()v9eNZtaFc`8-6b78<+!o3#bT`Of zH_)Z-yT^;0^q)>S34k!pK@>lXawM82G5#T^!fu^3dd4%NGcHO}(Mh!9nvTK?_N9^l zA91qDpf$?)una^1Vjz)A00TGX1G4N%;4&Pi@h>&a-$`{3_$@aKfZ8cwr{UjEs(9vQQd37u4@0D%GP?bM+Q3dRYNB%lz;J8#tjo)zU}&_c z5N_eBt4Vv z9~Z^!V0w}}L~I};6_0rKlE56pgD^|_T*&K95pFk^S0JeQ)W1>ZKa+^COM}-(VL%Il z$bQ6Tk0z5KAamYkhH&=0G;r5(W-71e@MNVi@8D+$`hLw{^nbS9t^ZP2Q<9evR(EVg zW(;wirr>KVt?s8Rtsan9l#o+Fj#6SV%3)?e=z@F^()|2@tGdp>qyn9axvP%Iu|@w;BG5yOB|tA&Z<;d&O`P` zZNa$-@k-b`m8?Iwk1wx8MrB?IijqfaGHa?kZR+mR-W5bQtORUa%7NO}upx{nGLT{GQaAQK!nf`R*zJQb0DBE-7hPGrB@YOxI=`c$}Qqew?WuftMWm7wy z9c^G_K?}?`*RSoASQblAkxuCi97ux_icj;);S-rRc4l1asL`IGmS1gzP|c0dWrkjEg@{@u9@c?sX(txn#G4$5s8)&$w$zN-p0Zs;9|hTETG(6a z9gs1aJ~#}6cEq(q_1{#_)dc-{up<+_b^T*>A_+)UNQ}N8O@P;UYS2l^k4MD0hs~vU z(NagHU3FCO9kt8=&XD&ay0feGjO)ibkW&JhjLUmJwE4DUh0yA6TiT zq25m?kigc8OUd^V9kR}})rYkTmnO|pF~=OR=UeKctUtJ&YLLK(152$&`zpS~Otjh- za8E76Mp7q6GbXzmx;i?Sf7z*yPNArdlae*YT@TKP-$a1eNF#?TG} zpm-O`e%(}lxwHIIfpG85Y0$eEO&|@Ni?FEm2#bsWvdYg~^QggT7Sw^JgzT|D(+jLJ z!?Eu67eW1-C*d150($_U;{&QTf4^cVt#9|QV?`TKvq9#rSFhh-uGG-9wsb~thgj8J5RlA;djoot-^Pgtiwxu=>s#k!%epxfTm0iqnG}<~1T^*fQfaASSg7ln+6D*C}D3#aCG36#* z=HW)ruv_~|aBJUX7L4CTnK=HFVOL_05zLjg6e_5cu(W?jrj6v5yn5jFx`+v^!#Kk# z)qOO=79?StYL^FCyS|t#H6ewmE@3x5U^Qe0sTw6L@w(SCq(j+cVt9 z7j~Vn{7YmqFeS;)^G`mrHgXw*(D+nMVw|Q3eKicYiVZuHv)&A?dN(S50mV)(bitsU z1RZc}VOby;?;Jn?@h`MBuR|;})V}?O1?tQ17KJA@A-4LgsH7MOK zpEf?ZfG|x>$NNqe((g_(d&uhWu@wq$wn9SzyI4sCz-{6>X zV&$RSm^EdI0K52%9f_1Xt;bi>O$x9L>RXGKm6T z$Muf41um)Dv$gDLZ$T?{#Py6C2pIF*;^P`q8Zhv(9x{W)bwrB!5{8N^1+|qxxM{!E zK(*i_#6Obd&Y9)@EkF@|2iQX4Z!1F?XDh3J8MtzP7HM8WLT5NNdjx9apwKD?dIOO5 z*r4{F#p^}~C;lkX5NrK=k%r1x5BCDb7MC$w_XO_K!SWb=w@Vno0MUSw-nZP!sAS-P zo%qCVyL}5{I(4)1ByCNK557Wu;x5Uk~O;dg60mlX^~*UrM`S$@%jDNK)CV8RGc z)I`fY!oZSOOG_ic1x8IH=~xMC%N4p8W7zAdOi@*2HoM2q1CfoRQ_z7q{@qSUWH2kF z?y4+hVZcit3E_f7ujDfOKOks2!#qb%a}K%>Z*jIO@oeq!9t;MXBIx;}vTVboOZe-&Gl5AB)DOR=cy+Mxf{%Ie8&8{}*$tLT2f& z;sf<9m!EJYq@0PHowlavUZ3Fhui7_&#_2+)qv1ux(0kd{d+4;tiN^)v8haUtJU3Fb z3JPz3x>+}_vM3a-&hNq&QfIQvh0*laj5|+68)echX6h+)XWt-M9gVh zcSROS=+X*{*^0y>X%ZTJU#S$W0SD+Sxp9~{;js7=Z(3>?fWERyon;J|0KWcie0^Q> zy)++jk0FILmI)Q{+g}a~{7&`M1EJHO0aoJySWWhS(`tW}SIFNF7XFY|Akiqd211v+ z!pLDLrT%pfOV$b6u1Ml8!XIh>rij0l=a4~C;Kq%2k0;0MULCyyb+aU)>?7}^pdz<^ zH_HydcM4j>^oeo&LIS_qL@_v+y{U~AnDsc5PI_8_M_M(FhApvU8?I%Vp#^H{yxl${ znkTaYzVmWXxDl!L)wJq56r-SpPvvCYQg7>9k8ws&gOfMo4i*V?*H8Uk;%G(Anbc;u zj+`za#8zg711s9Q5jI9~akf`1p8a-)?8AH?PV+8r$Ux%WMca$yn)`f-cs{e?l(;TF z1pZv=GQXANmVlxPZuwZFqM2T3)R|RH_kW@fQrTKhasbwifX%9ZKT2c`EC3t-{v}B( zTK@hrwquS)yH%+aZki$o*+7Gd<_ZNVL|zV2Y+w+vGwtYnS!yG5Wn2d0apNODbg=)A z!w!>myqrEr4%)(U?Xt3fUmr!}=)ZlEe=fW0y*P9!w&=hTdVF42D3wY(DqUTnI> z@LK^xv+6=?O6ABo`{bInKoY|m#)wmt?iDX(Bz=L0tbz~VXKO=P& zN_a3)J47&17-Fr4e_6PAI7@g8rsTAqq@v}-QYX~byc$bU@EkLwC5h7J*{4}#oyy>u z@~}l@5L(?r&x6=itzM8K%6tQ%^z-5SK0YHmT^}WWL6JB$$UgX^DfX$3I?3K_&dNpl zTpagaEshP(x&PIB)rN5vF2!-~3}p`!vZUOn^zL^fYYf7UR$;?&t4!EJZTyr~STk%! zs)BDSL*$9w=RRW*ti&hfTgTLq1h1do@`1Y2b2qALqsWB z^7?)2gTU2{2sElsBw0p|9bshG?@%!1wwwA0TQ3z#d ze1bk^2Z{iu*)ya!)#CL@l|Id(n)v(4XAnzleXs9y!8cHhTo_-+1D-a-HaDbV60PE= zf*n-qq-~<$8KgVgr;T83h_6`IrKbdNWruLc-v5aT;=2YW+yPXO2zVv`eJc1bT=Uxmw3}03}+&TOZ09{8c)nlYKdk0Xb=l`uHW>F3BEec!jd^CP@eRp`7WK^a5PQB z$#Xv&n-+LbMIco&ax4`2RS{G=t*Uh~iRm*J)G`oHdai|%T_s}uBE0gHip~9mvjAeX z&XgDr6Xs|aBv{zcSAYuig!k~`3JF}tL5|jUqO-|hyuk#NIU2LphT+*&wn%RGS@>+w z19;MVDFVUYs?fI9lVBQ*CLexGrZQ6$^OUYGjjvCMW)Gn%oJpL~Dx z5>|b~Cm^JD68HW&av)qO#x(teZSHuwdckq*p$GJo;78366m(jKi3#l45!fT6p`)7m z!riWMXuI!X1jTy$e;GmhP53f_%tapnqR07vO4Eu?4(2wd|B`^@YbE~D$}9h~mDd~4 zht#o8^hTs^Y*+`?hIRF$0tD)}Xg@F@HX|JBZFjG4ckde?I#}cMWjrPMQj0(sS&L&R z`jtaf;|a>|@{kP;T}p}=RD@Mx%pK6l`za6T{jmBk0RJ|%!1_b^v!O36<9&e576>&$Yz(R2%339iQtR=-OXiLyQ zPQcq~UzX3QWZ;zVKee6;r{xRs4n$5H=dWlA9RJ*R%K92~EABm=?9=9?=2bb;Ef-#v zUx)cP_G3DNKJt#J%@veh|y4V3AaRWS4{BKJU6@4pb<3Akp|J*r}m;TK> zUVD!GApVEKaJXE)BB~t*&_QDU{In?@ZWL`OP;J(A)PvcDq)7jk2kjxVrqfwc-OqMA zSTpbct+hg zv~7|VA?z_WM6b+Mp3D_wQvRkmA%}b9jv3bJbi1E8L$P(Gb?cmF=eY~A>si{XhJ~mF z^^%hhd2Pm!KwvYFn+QSfnJe?^X;UGV9k-l)Z6~6_L;t8&Hk>_ceuN=LSSb_PHEVhC z9SAznPl4cUU>#i_o#y>?%GyMw@6awSS7SDE@)b=Setg42}H+R0M0$+ zJuqvg=nB0r#UA45=Bc%S>I4hJ6lFihN(J>Pr5fot^(r%2#&RRy(#u~;alh@OmQ)un z0I*Luz&`(th4BBPXY&vCq5IQ^<+)`6EgP?~U{``L{(b={D5&XvLCuJs93u3Fp6TUg z*B{&48#WGY=srm*B&fenP}!f?2ym_#?N7-3Y+q@Ad-eGEWEWA12&v{MZ(nl`SWj^z zL}4zAaU9w6o!6dr+u{_)nqZ-M!!`;XQX2;{Xq1n_o;%VjcHNFQFUs;RVo1)C$w!tk zA;=>QB#%_l<80Q9d3#3b)(O$kGX*y0JP?w=+H6Z=85}1`zMn);zF$iO`oJ%$JIi*4{Fz&TZKi4Fm!NcZc9kVB+rX?(Xhx!6xqR?h=B#y95gm+}#}l zfj3!ut-IIW@3ec)y?6hhHTXyS`lzbjYt-ma+B$I~IwM|zx;=5a$Ysg+C2vJd zl5{ont(CLb6^#D_+xE5Arsj)SlhSz`EYeYZY>AwlTy%aY8K5uEGNsi+(Ct+}q{F|1 zxM8Fy6Yzy=bd2(MO%u$lZD+by8p$uxy7-ZlZ<6Z6^D1@2CNxtH3K^Sh|Lg<2Aw|!c zdnW=yD)v8z6yv`kwU8BRi1cl$w-=n*(=dV&D-j})6$__g*LGl_O{dQ5{}0ru?3!0y z+T%Zfnjm&mcTsSy+0)O;vnNi9l*6{XeR%_F2LzNM$z1cC6&$uBK0Y+iQSS{X(cYB{ z1#xt?c_sp(hP8((Q%Z!J9}oF7sGheomMlA)%FYd8?%t`;!}o%Zd5xsaD3=`wlEX%U zg;$qfp!|{N0hv#nS7*&p!5-0qcD=u$uCBlduH%&b+42^~ohhp#8@{b+*R7f+fWZ}I zEA~1I+E#tquJgm?DrH=GVQG5-=UtV=n9}&7@C2=~7K59hr zOU{=52kUCufa#D(Sg_FBn_!-u{Cbc0&c%8!uBSXAKad6L7_J4itdPf~RJo0WcT;zG zZt8eZz1*Nc>6pn_lM@MUpjvs$6Axb4yAO)UMZ3a`8|c_@=ao*hKD+%B(Sgz@PI zw{ZFkw+2-?ts@#xs09D07-qHOx6R#$yKqwSl)E4>^QDy7R|7j_@>OT5TY#81aoTQ~ zHyBM&TA7Z8W?30zI{hfq^WU`F8&bAVQxaW#Q3S+Y1puWZ~%X<(~+6TSC zuu}&Q>V|M1$a->d;c(SViUl2tWr_!e^bSY+g9$gpu+P8HIG4!S%6U0`Z<#p!gEI+L zqQ~~cN5lu3K+(Xp7=e&7D4lOL@}2C6t;k!b`=;C{TC!#~T<`n|OH!w-e~uI<^dTKl z@TggJ(j6{I^LI&l-qdWuA4t()z9B{N2T~ov{GI!whz&$NMKvV&XmJD7LcWDjt18^Y zyJ=rZ&XaLzwuUHg23NXBXg+TwBNl#aXIwSS_OU3O`*yi!YJ-mlN`XHWB>Ssk-%{XV zP87Z}wykeO^%EiptjDI8p3;^WW*_fbMP-d0O1Kc&j2|+nt;<}vC+H`T64LaiFz?-S zd189mys{V$i^t0LIkr$2X{Api)JeyshmuN?(xdrjMNEKyTOsxa))h|1JwFJnFc4V( z88-1>MiukXA5n!~jTK1r_n;zQHhk9b1YEw|8DX!}XHVg>dSu zKsQhd+|*CVvnNlg--m1Xr9YYj+6%{W31m&SoH=6?g=?usfDrQdl+>IiVuZYYXpH`)ILzd)w8fp+ZDT!j}9O0Xb z@~c5OWrJ|qr@Sd%@gqf#L3mUz@6MR9rDuy5)x^iO>)ERrcn4I}qe6BQvW;Yb!<0Ja z1SP-UbM-w}ZnljH-(UN-GqRM7562SX@`eleC+y8#_!nvOyqw!7*SdA%>PLz=4Bl}u zf6aa9TO*OKU6kB2@o$y_RFrwcSOvBGcuRi`{6iux(d++Os_^J9=Kr%W{jZRk0EHCN z%jkMFs8U_#LK(4tA+J6_HewJ)f%ELKzf^Xm!EjqP){2aIV|{NI@|il^d2H4Irqi7# zi;^6@bHaDBH9Eow$MmBJta#P{wC{!ScbR$fSkjNE_kz{rYg2=YGE2YrLWvgU{Pigj z3sKnW%xSl@coE9BHF<^@m2oH5t$|zelZJXX#^7Idv8zP6GsCi@No-?Kzz=n)`F;SQ z7kYUQa)Y=Vhv!B^#dY+=)_B-d`zI9+WLjRusdc;Q2&K^7l{hDM-w1`#Hr>x3a@gJS zM>J$xw!=}#z)eF79VixHTNjX3{pEX=E8x-3-MhjmlGewg_Rk`9dRLlJbVPu6R?AkS zMr!0pMFFj!bM-Nt?*PACf=z3ro%Y=^X%96^=a3RJ)bLscve`6FgDy6V* zH|TNyv1s~hZQ5Vd?{9>{-SC9rgAi#?E@6HGLR%HF$nUiI^K+LgoiH<9pE1?id7V`&g z%GZm%1(kjC*jrFVkC5d6zK}nnqxt>h3bJ5*Lko!~UL$J+gjQ-sL&Z2Pla+sT#1Y=V za|)|Y~K2Eqf2oXQG2^h@VGjb6q6>zaX%nyhaDxk|RPmJcpOWH$+yD@T%Ks`=Zfrt%Un#zQ<^<%aRY$45Cy*5u8$xah zk$8WoO9cun9NQqD9|Fi8)_@%&MieDrBPap-gA$+xny1kjUtA;zs}K-Ysj^HR{(oTQ z9epSrY<>3sJ^nZCUc60Do!6G{1HSAsN^lrd1~4^6fD zrl~-zqMtm)vG<)U)#rkXzBO{`@>qakS5M-v3a*59Fe_}@VV(-<*quqv|H z0}Pb;Q~3Tk3Z(Me0`b3o+$HsLiHdbB#+_CW|J(Hk315sT5$~}fA{Fh5eQuy-$7Nea z9{Z2FpO`#pQx$5W708HY`6VF!S5WBh{5c84|KR`1fmm0a2rlDOw=O%YPDUcnc)@Fl zPcfw1kSkZ;Kuo=8R@;s=s-BZ|tvBf1t5v4#^~(j8$x}S+D<*dOU&XCKNf2%$;4KNB;P)1$R~hSKgyP3*$m~j~ zlZ+Q_Q(G9%Ae*<9e!s;1*IGqT<9Yp`MT+g;kouRXa=-k-h((MXpv$1mowOPr@z$ac zeNFm{sUL2^bQmP0Er4{@tSn#G8s9rSqlzzh^V*4cm0Umd)j8o!%)eumH-L1NqMPOgAclwn>KD7_dp!m=F9seW!X#$Dct#H5>iEg34A6NE}0k z^RGemk&8T~*5qAEVv53pfgS3SWn-pC8p++TDOtm3!z6~3Mw*g139a1Sd_bSwzam8{ z4y*ol7x|ydf9(H;)W5`3_MhpG(XiQ_S}J(U)~a#fzly02w$qzG(jPMG^|1b&$aGJ7 zpbKy%4Ae{lD3`CofMTk9ZuodnyjM!KbU%PepNy2a-jMjOuhb%sT=Xoeu{txo@}erC^mTGd)|XI6;Fu&Kadi#edI6C zW6PTz|N0peQ-C$?oK>R_3}~E^VWsHypqOIU`nezwym|Ju%muT{sRKC%gp{5g0kMo9 z!B;d9430OX@XP-xs@$dNcT>T%m2?GPLOMjS)Mkr*jNx4Zt&>roz*V7{B-#{F$_oEW zQ3X3LnfNAuL;qu?isLV+dfqfuW^MPM1Q3ycA62a#JF*8!g5dyCC^CE0c3{gkqh4p* z>~N$%@J&>;MNr%TW!5t8OxD_6{~+oc&>3Vq-;VOO3?~LS1ulbNZDnCVO{GL$1-^X4 zEySoTLl99HgLtfl!xk{+CISHpV8@q-gt z*~*M8P!@r6JeUHc4K~fjdjdccv>Jg8(r{Gg_t;PO%DBa#mQv2l#&q}t5sUM<$bsCc zMKSAEI&N7#ADhX2>N|+tP9$j;l5&<=2s7B@)>71!-@A+Ymt0LtWtXoP532h}(Z4U9 zcdgOn>rIB$??Eph~+} z=P*a>xCrgc{loMD{$FEik`eix1ZW^^8210=mBruMe}BT1e5|;viZt}v%Nig2sXP~k zs6LiIqJ@-v1(oT`B_u9f@i04OeNiu#(OC$Td$|W?% z(o!GSiM{roP1U?!_RSkKv$|ehe#^aMdJqUgB>ZK;j&h0YOu)q*Eka9ThDgDE1+FRr zEjvXO!vto49Bw-E^_pgJ`p7F!-srY;*K z#`E_27WEU1FlDxu=x*Fzl$STG*y`K{mSbB#`uo!91b8|NVK(zoR(F$C%7| z+3qAU?WK!#9(pz!C-sJFB`TSXwcv}mF4!hPO5y-CHWDFJW(fK2f2CZo^YPE7K z*9e$My(8npZ9`tO`?be0pZeb|@Hz{7dMfZ$t3`IV0DO7RdE4c4K7Kf+Y9>*vf=I?e z_U#Ww0gNNfBh3S;wN!{dqheKWdSaMe4?`~qH10$1zRqH;G`wHz#Jygpc)U=UA-31Z3gWjW}CIr%5bZNu*3K~Hn7*CN#RT;`% zy>NxKaY}S6;j#Cu%(_xG6Tk)(Kk(3nlDE=|r_Y?)rv4xm@s z2?~>dRZ4f%yKB1W7M|*@FXm1hz%Z2_*G!#F^k}IFhD43PNM_!RqiwkODJ*{W@}75M zRyd{HBcnObvXk6XrK&DWt9+2nL2NFF9H=Zqz5wm-Z3N*ci}EZ30dsR;3Zo-Ki&97~ zSRNMr>Uf96S3@xAo@P4|#}j%*C9vTcPj5=^_?fPA5~?$qUjSmq{$@&!}&Hl)d7 zAHgJ%$l~)mntoynxRPm8b=4~{iFAj+gsSdHP{5d%aECgxS01dL}#j$DIoZcLMmX5 zI4UhuX`Pa2f7Mr4`F>V9*qhRN7D}p9gm1sG5lqD%dga9AAq)?8a^WbTux z=JKN^-|89^GU6rv*OxJ@=-i;3@cD;63EA9m2$AXFJRITm}=13igW z`&4SfO%~|~Rm?Xwzt;MwkHyS8uw3iFHX@z=CbPCdwftLO=420hS=;wd1 z2J^qaZ2A+wzqrA-w>6kP^m#;i{01f>rL^jXbcXM!z?J)v5`U++#tChGS{Aslg7bby z7~EW#6x$k5H2avn&c*lC*~!NXroF+??;9G3WaPh*o{56Bid}FbBl4Y!fu5PBs{|JJg4ZX|79b^CMnBK)Gf^Z;4qNf1$J%Uq_eo zY7BW@ysku}t{OnaO0XPOsI%c@&pFV(g_;HsEZs3zoT_`9&u*icQ6a2W$+_0-cDmm_ z`*G#v5#LH%|M_^&LAN~f^>DMRHOKiH>mxMWRFy#YEI+jUnn1t%O5V?1tlKsoYp3W( z;|LP|o4-lWw~q}Pcqs>fO1m-0K2Yetzj>7e*+GDYb?reD03z;2Cic!2cDAI7CZ;Bi zCbmX@zQW2<(NV%RLGxt|vi@l+37v@Xi1ckK_FWl9)yMiq3z9tkZ<__;ar7f7m~3qh zbqa%A=k3>nxFvkKY`XPKD5fWoglsN@>pKhAXTYf->CfW>9_vouojNBwAFp$A{J<_) zUD0n0s$n~t$%kFA34snm0!VC-Imr%E0$5G}TUcXJ|9}{@aT1z-*nkz}S`h~=6l0CS z@W{+a6`1MpGpzKMYA*D?#`)SNkW@e+wpcE2PT#GzGF3SbdQBj8K0D!Xl@PRc(0fvp zN=sLfUR_-U{U?zSCT5dU6TP*nGa1Mn3yhV-$a(mE)CW*-@nlR^>Oe0UK{0P{9YF>g zO!I{fbM;@24fPdV6-(6;BP|by`n?;9xQ~aq;MgNAnlIO6RVNHx1J#0l;G%@H|@#^HPwSG4EkWozL zjp@^pnW<&9XEO?SeZZh@955W~U*R1-Hc2VSLaA112Qs36HB=t>1SE~jgwU=|-wU@< zuRddrB!w$xvHDTFI$f(;7OB}E$!bd5E>ngz7#eh4m9}1qV=CarK8Y%`REUa>+x*oK zHHX0oT`N`f^4)TPce&w^8DV*IxCM54P)oaxRWlu0tH zF--kYJ}}RtuUKGi1u2ur6+2S5AAdPy-@|$fgJb0eEf0Cg)5f?tl6horM&U~C9Pgm? zOL8amBNqy9Ao-VUA@_>R)E#`9K=OO9!%eo-q0l5XP2XMDW{@IIkY6z8-f7Eyj@_lf zwpJo*K9n9s@xs4@9gy+uJ4ukQj5MC0?-4r5a}+f8a#F;K!*f-?rJ@M8ZZsO1i&6*{99kW7UEB7N_ z$H)i{F-zvExM+#x!J4=t>g^+4PXttZ0??ud-Me;s^R7KundBpAuEEt0vrbzx-~;@Of)Sa8huPqp!ul2UJR z;I={UxxqkgrX2rwDe2EtuX^l;D~A3WMdxAS@jFz{0*6gur7)R{!!k=yA`=T`h~ANw zA_|Y|>%5MXm6wf$nobo?Nj=)fO%(#VDM7_tc}=(?ez>Yk)_wb4r~?k~T|C~ahj$cE zFYnD6-Aos1X}>BFmOL4_?tS<9eU{~A_VUo><_nvPyYRaivCdokny3#-CtybO^=s16uaZP6?^EX78*o^Cpw_NuBpyBw^0>a?TJL zVdq94=HvI2a*KyrLcN|k?+5A$oBRzS|*+Hn^sLbnnwiYzKTWq@Hu9kq$h`uMRj4j?eo(o)h>nZ+qR zFDD$|L_ZL&!3UUKhqj8NGUG7^`()Hl$mi|(Z2Zb^=)LpsAWzFE`20;W_li8wjk`j9 z7OqN&X>?nX+0NqdAhvk2yo`v>>^7DV#zs=DvR%SAvIT&TCyA4GP#9mQ>_nds{he}T zF*8q0DZEJ9+>@G9yrMaN!t$5$tG42V=FaUIaeKCIt)h$kEK5a79+~;FIL$9*W`i`+ z*;$U!jYB5I9RZ#+m5}Q+m^nNJ@)=>67U)EI(PEix@O?B*&(+k`4mq4+YHmV6{KtEB zO7WHG0GHJ(>2y&b5$^LR6$-Qj$MtQL{E3|}Te=xFp$V+Q%w*njz4v7(SoAh)m~N>V zj`F>TSdAA4nKN@OmFe|Aluz9G`eGBHCPHUghr1RThB2kdxQaDqDTEn~1FNwlLx(6# zhtm)lk+*SKu$L=?%@)4ddkwTLw)4tFr3<7h(sAuX^?X;E5V^_j$Jq**w!*2Iu*OpD+o4R`3%ASRQ6 z$Y{#1zY9tauV~2xhz$Q0rlYqUqF{$Mlfk42oCH`Smfc4ufI-bGu%sB9w~2U*lC?`8 zp^C0am%qocn_FIKUm0T=et~RlO}IoImwG6R%-O^fGTHb460~3vDB>G^TnNH$jh0QmF>l_31nX=`b&Pf)4V6XsyuoWAmH~c^*JNAHHJ<1+&4Imdt zvvzG8G@;#q$L<=mGbZJzJoV2Nu_5MT!DmR(fhH|Mm*M*qa7``*nbQ#rzNwgFeLAyR`n8fjDo$|#Al>#p606Qq!nC*N zmUD5*D-%H=R!uoc2N6!kHYQn%ITUyWDB&bY>3<*drP5L~Kpb#uLfYnmK!fdq{p+YL zc15b<7uq@hj!mSlDoxx0(~L!}q;_Gk=7e!o#4|*!kq3`aVZB5Y)FgQW)Ywz4RKeX& zX&DkUSrX2aH2wV6%$WQ5Qh-lWc%&Q+d6|pKwVo`&rTDC*t$J1+L`|KsHfF>e&kCai zqV;ENE};Gl{Wzu|c<)D&Ik#YnjY106LV5Pu&~Qh8O!;8UVE(QOev_7NbQE_9XgGH8 zwh<%5-#(;M4bXBe{bRAE$g0}{-ZOFH$b9P-EePjn_6IuR*4ZcM@(s|3@Kwg91I;q~> ztQr>BaES2+)wLP8ozX{35f^OpXrB^Jm%xwA=hf{#;~uDWW4OML zA{wGn-BR|y;SEZNUh~4^cgZ_8=j>ye^Mk7MvU6sdA&x>w6iK?VNHu zKEOhre=QwapN{m?r+ASVdL=K~)I(eKi*U9MDS7eP%Kdb%o?jrcNtkRe*<1RK0XSP2 z+vXjsiYKmgAXBeU{B^Us!rK#`OSN)7O#C^d{x>FzyPkR}M1@278Jq=sgp({1=L5#? zVv{NPmC0D>0{9iUE>e|Ht`QIXbrM+ozl-qQAl1(g!8;;1mn{{6c(02J%ebeCkga> z-;`~B37Mc16qw~Ah3FG*qJpNlf<0_SBNEhHZdg}V;>+RX1H;v6i6?{I)ll1V zv?x#ehvF>h7Y5~WcS=EOg>c1m;c}AlayeWt3%pDh6D~;I2mEZXvT~#&s0)QqjfncK zun6PH?~7?1Om$4_e%?HgHQ`X?)drmbfO7PiYMN&K4InsMQnSfMqdytYWylNH^rfZ` z5ucBM>#Ik4*v=}uqv(oX!r%;y`yf;v93D1Q?_z!hJ=O2~kbu0JbyG^d+X8vuA`{TC z<1$>pDjqax>q;r&1|SG6oPw2_1XigzJUs*Nh!bX-+1Qsoq?&a#k=n zl}o-_N4}~j(>hDOY61BjbWxygLnSg3>7E{**uyI~gBux?!}#MRK6Z1OkbCZ_wX5r^ zZ+}6UWV@=}iQTK!GpCS+k(rrMjKQs6KomQS;7EaYHM4ogy?4djNkZQ2UAyajaECaq zYF?C)tIC9sg|m?X@OwlMZ>~7b#SX;DO~xZ+@Z=EAnQaQ(pTo$MZoS{pC=M=Iqjd z0zkSnZ{c*(wT-^^@K4S3U@bHs4-FxJ4QB@Dz=L9~hNnZFm2jGOKq_)ctf#YlCtVR|`Lu47fP)x0NIw*EB+ z*cv@a@yF8RS!b3^972@@p;7Zp(Q?D`^aB8j7i9g1jHmoT_b1nZ`X4*lm+nupWS$)s z2d9h!ilQt$^J`Le28Nm>-I&vZ&I6KUVa9Vyd2=Qe)rhQ!@W}oPKkmv_I%B_BPORkj zD_N#yNEnfTTM}c$-O#`+|KJ2Y8h4f=!iHohIq93kJbG!PjEhwep}R;o`G>& zBMB^ZO1R6pq74pY**?1ojI24P2xVTCXivhESwLhp^eiW!(j~ju(GO=b36H7>YREjp^`*i~%UU?1)0je>8JeA7Ly* zJT4VT^Gcn$9AnVrWWCxHT{12?fa7T!KFai=m`2!f!7p)K>}QYE@{dfA*$L&CYFd## zt9SEb4kbgdO?)2=k&c;q%xrV&fFTRe8gAtySYhaKQ%UAj}ySt0X+-W z_!+IjlO>Ca9f8}bD^h;awq7k=ErxT-Ahc9V7V!Yl$#?gb2~amE_ody*Vb& zkbX%QY}kH7tYFva%juK$CKC-f5dnTBUG{Y{dU+ALNl%mC^7!a)X;hhPv zaj2N?nb$caM|>GD`4RC2xD|jrrM=hgp9HQdeJ@X{PoAU1v?TPtrCt0%>`utQ4M|?B zxf-$(Mwrri8Xr!m4$83(>SXc#;^KSjJO0g+Emh05__)aFmY`_vr1x1Jt2#o?tuK1f zZs_=df%tv>3xwgqf}1pum6-v-Pt!cvHFrSA->Ki}ii-{u=5N^GZxCWtHYa{(tp?s8 zVdLzyEADsm>$!=ge%hSy@wq8tLOa7MY%xpX%t5j)^omV2ZNu05IOk~Azi3O5I_Qnl z8tI;C8HvAcPN9;O&VdGgYg1TS>ZWwA2W}H!2 z!O+b07mPgz{`6-}8G$Gd%;^|i8sYj)!(VnCA9Wi?rv28)Zdh~9Ze~NmlTncfK0N(y zOEe}Ug!6=KC$P)iXPe0g9XmL5tZY>IT&p57i5#N)*;F5XeyLetX2%*8No(e!a8t)O zb#32~u3Km!cyY|B-z#Wx;HTwd6BvX&OEPhQ%gtUe7E-96Pjpwv6!EOdj!zY8X)~d3 zs|xSCk*81X+1zacUJM!4eLO ztL}a|4@C)V;ud{TXw5fKk0r$plj2HY307v57`MT( z^K*?&sdZi_Ti@ZU6JADuQAzf3e}|x>8oexRDV-_1j|DTk(Jju^jz{v}pIRTfDY~k(Ti=Eq+J6>a~yFIlC7U*4saEORjW`<5pst7Mqh?>%Q7p z$P`>k9}ZCKCg@ZG^eUeml;VD^Fq^iOQNYfvXJ>Sb-FYMAbab7xE#9AMBjo@| zc>^skX^;BNT831Rz8A>$dY!_oiSG{bBoU=(W9Z!ZLYU(@Fr3~66ufNkr(Tyyt2NeaG5KSQ5a-~9fYgIFM_ElKqmUvUC-rT7SXzWqPgL-lqo!Mbn;<$QI+}S?Lj+`d5*7@Eh;0}POZ)@FDnd=eYSrnF z;e^*d!raf?xeC(W48Mf8>;QvI%Z}g7bD!)@_r^K)pT4tEJYC-}*u4X!eiZ5xhxUyG zB8v&)=!hs*mmyV?;FB9cFkAC8w|sUekS;I{XoMbf3q4yYTs^jLkRF)8RD$8;HD z4VSJ7Fu{ahrgAhYlHV#;FSbc`ETLUSxkrl};*ycwL4PncFZon!zUbYeKy|T%s!Ewq za_-QFp&Gnj)hZHgvFr+gnryUyUicc=e-{`j=A2#TK%R*cccQsZynokx(rdC6_MJ;6 z3yx)S6ds!ZO;+{?t(T4fVo%af8q>tI4qN69fMMVqTl#OW?J$p-_%7=j0LxEYKD2ex zIGIXCLJomksmh~pVMM8hvIdRLL7d$#PHBSmJkn)Lx=be=mV`+S#mCTg^La@r3}>FP z3Km;HPsB&VkW&1IIvnEEsj1*uYI2rLu^b?5bE*Co77iIF%l;($yZNaYFmyJSm0lZo zH>3gumpJZ$ra_g`Z8MUv zqxJai%S?5~7O5}zr^}WR+2qUTigD9+q3NVKGDqhd_cmm1oAs}A-S~Dq*VBjd-+u+&(l6PQ>A%&aVw;lZT7>q$=Sn7FRWh(r)P<}+kTUS0? zsKmX2bO7vpVk%KS!Bqi!ff!)^CVr-8xm}aR???vKL!0bbi{XK;aI4t$?9je$!hZ^? zw;;LkjQQ|p`YjJq;G+M%0{{0Q`O}B+&C&7i0TZk!V>io>mMJsSnwad1^sy)rf?CDC z2W4w8I2@x)#k_ztDu_K7bDzap{cFK3Iq@?y!t*;{v@H&dekiGi`bIa`weg3?-!IqK zm|qs$F*Yo|h<+*VUD};Xd678&C2i2eQj8r8JfS@CEIB=>>fL+lFV3z!Pe{AMX+)#; zES2}Wtc~n+GPKzmIquKCf|rR>`_k))o*mfv)#H+8FWk+<&S0x^X_IergyN@HuEb-OZUfEvJ5xmE% z#z(|2xlx5&&ElxbCM6>Wgrqa8A`=zTikmf`WL|mt2wIT69MscHY!uyfzjHC+)!k|k z25BGrSW2yD?5-eq<&9=A#MtH4qZSmjAO(KEH93DSDDAWmk-%G%KU(yOkzp@B$ne$x zIbVe&ccA*a?Wzb}F;BT-MVq9!G1A&4_TB-kUfj@eiY`+Iha`c8#1+(5ge;ZAPAb5L zfOie)kyK~KMx^2_13F-=;oZgW?jcHF-Z$1noh-#QP`B&wQ{LO^3a%w2 zgyiI5#gHy+TMw~!qvC=4{hM)=%qWKE5$J^c0-YAF|D%)gkCP$bX5jdz5U+}T^N9l4 zepWSnQ|TG1!Nf$9kqCMw!s$Oj{<3Hwhq4|1SAxZ;5O6LdX` zK5()1m=^We{RDcQ4R0Z3Y?Zp!c&j1CBg`{fRZ&*|IzIVTc^xaQ=XSGCpQeP=Iy$=% zekq)b&Q0`;O3Y{d^jf9=`#YyU?(VI!ecudRm_b$Pf4EZSFQ?CcdZsqSPQ3Z*1W#7E z49<6jKOnR+PT4F_hs);`*-jW&vura{Nzl$wTxw`PyyHzwRp8A3R0pWY?Bf`5J70bp zqxr(?N!6%mjmnvwm0aX&*gLUVRLkT*Q8m?F|aMM5Yrbu=Qw$4=ps}T%5Zf7DxXgLG?&7!4LVo^ zy9^i|#0S=_n5v{;{HFw6G;MlumK45${`+6$4RB*HM{oDAEmSBwa6X-xj zfW9pIe}6FFCL;d&s{gwCNdAvg>9brM7B;QQ?S;f$nhV>}c!PpOn@2#rMlqtvN{;)J zl=vlyq6ajAy8iHfi!__t6>4uHW3vPM?s$J2wHr?iY!I3U&pj2US<1$_4FxMlj~kj@ zA&bV}qB3g9S*84h2ekX>S=bJ~A#0a29CV^$e$y53OPJD}&j^~F8a5z7$G6s{wN7{ZzVsV$`3k+MPt34xvA9^wdb0m4;BFOJ zs~{m$fa710Rhg+2`B3qTg8c#OJAGY(|NDe7x6meo69?CjJvOO3EU^n@xaJrtqwd+Y zv#HB}kMygmkZ2dsh{*@|ckh_~Pe15C7*mJph$Cq4(TnEt@DrHXP`(gE znTRw>sfs%u`n5jkb@`>e{9f1dd(RL(iE<#O+v5cj6f3uZEj^lWkFG8K3FwWNLfVnp zjaEJU)nbHwHlpHzzo#;Q1Co$B)hv`&vsho=Oh$=a>4TfjCZPYSwahC4Zd2JaIJLME zz<4`(T&!NHvJj-SWAz~mZejd0p6zn01{Ji}KJcZ;9&29dnyjL{%4q@hyXxE&tH&YG zDor!Z%UgzROmkuu-X=~>WO}o>&6Y!Db7v;2aL>HSjACd?X^MvY-V))_ak~s_0yCmT zqV~Cx#5ypgAKf7I<2?k&g@+i_((^g*S`@v^4pTx5j($v=SN}%g9^0c#HTFuSxs+8# z{?0DKv}P^drd2z2X>PL_M~DOK>G@*ko;urYtuQd0p0Ps(rLjb-xI$l`hggV8rW*by+K3*FL&M@nl?<5P%hk8~r3h#U%V}4>bpSqO=kO9xL*&SbpHrL>7 zli?L?^?4E{o4%Y*l9mslKFPUBsZ6gPmY>=%;cq>MtO7e-X+>*VCkxP5Gv@$d-3Z&V#LH6w zSRygDiJnT-$YZ8z9@O8BKz$<0=5};)-Yl%t5hPZqv6Phh?+k}=gNI1m%5=v-HN}v-K@XHkEhnk?%IARZ$2goUFLnSS!t38(JNpYpZ&Bj2= z057YxITqb<;T~TOl3Ck+2w%#pOc)3T=89*!5?<3nO6D+M|a554O!RD602B|6iHI&W;Lt;qPWu(E9>0xo8~n0P9+ z=enKUbNbw7cehW%sy(Y|pB@o8V^vG247`~+A(LDcId)izLNO68NW-sLz7fC|uJG0b z-$&|McXk9PsZTkXoRwV*0`ReU7e}UaYc~CGj8a zLif?|-k17e_ExylHFHU1e%*!-@`I}pDC^Q?6drpTY^$L}AG1YmtF zFeB9z3oys;;F3T8)mpeKF!Rn^M6;8ep|j^*=K$3q$xl8k`B={G5avgIrea9QL!Z!w zf(xH+zjRk4cGQa)$WpRe#9U!te$r>9*$m(c-FhIU;AI4@eBShch9sER&%)13mbJ3S z56BN^)1CyFoWKh){a2Z#j^L*EFAn(z`96zJ2NT&ZkUm6}Yqp}(r73)QTc7#j8B&k> zu!!i+ryBFFb)+AdLx}W32~3sK0^_p(K2;h7VzxEGa^gmysgz96RLcL*0>c@!P~fwL zjlK0}0VjdCg(Pnq2L8S&?;pu+LhVTnSB2nJ8wY??oM>p3p?RvT1uu^yQuR?CR~H?_ zA0=J#9+_eU9-lK!!i+re*OE$ws?LJXQ6sP0+}TmJq(WfB{>e)t-$~a7;tPKE_T@td z6Y3{4xZI)bk&zC!v)`RL_b;y*ldtb{;d4T!f{+>U%0%83pllJP4_Qw87Z@f%Z(VaoGidUcf!e7>ZC89_R_jKxxRNJgos#{w8`5E(NPZO8@X8Yq6ss`MuiL;!wa z8;JedN2R_sp1cuM0~?GZ9rjqS&q=3h)_>U-Fhj!PUjHFR!d<)fD>ja`twnkEMsii! z;PeZ@2iESIZ_CWqVl0_K<(Tfb{5KbBgqf|GhS08-z&$);c1&#Pj23g%27FtY{hNcr zbY6=LQRV_pOGzfcG?x9x1)=& zQSpZ`ZCsAaZQPj2u)tSMflSsoKj3(khl`q7ii@3>%A%}Lfk$Yxnq3zOu}yW4xinYG zA{KjT<}K|6QHzXYij&Ylo)xFGyBd8Be@RTWDCDtmr!kIgK=oLklpK49&YZk+b{waYW#*$j>XofrBCUHKXGz?s3#Sp*Hsp3A;6 ziELN#T={e7^nFMyvZDl)Y{Q@5G9w9kKZab^mseo)HJUUqiL-IE9EkU7z{p9t1My;i zOw=FQf420~#(jAFw5b6QTA@|9SStym{MjOCe2&=+upO{5WT)8X;GUei79x%M8b2fZ#b25|2k#_Z0(1>RRX4QlnRz%(vv)+*h%#akVpZ0lVf!c`rI&Ogm<<=vG82-g&g+zrVsXOZ^$ROB9F%iY1kg}}=ee%R_03bzs)U`%3ORGWh%Gd<^H#lgis#J?qL zlO)%S15fM;kBqqti3*uu(v z7PM49$`~c0G^bOoi4-p@J}LVYiQ5Zzhx0V+IH=?0R4%i(ucdUHUQ^bZG(e)^!$W6u zUjC7|0b}Cqwl1+Xeb?P(kZBbtKI;IS7@>vHIExme!Ep(e^mHMr`Wcq;;XRdFj`PZB z&Xo1UX?Nt#im*;|o4&@1z4s#tjqCE&C!%miZ(3H)WV|z+gHr;dW{(DUy7fhmc6oHS z)_PoY_!7E_&FU;E1!-1UXk6G}Nk)dkJ@Jyk3LBC1Hnd;N)n?qKRdFWL)V5;0G@myu zmD_eM;^yu~!yB(RJKJcRSB=3qzssRF$6>gw)DM&e-yfE5+XpIP@;&jiJ*1rl9bvie9ljJyc@9JZ{5oIcx*AoOs;(uVYxHLmw2SBUClIhAey14-Nx09tFB6S zAj>x=3LG_-{ES$uqnP0*&#=<5Rs!AUe`}yvYksDpsBG^bOb4hPmx(65jbFdFj;-v5 z4glPO^VBH)0S{k7ezYL+QQ-m0+&9&)no4?`1S;y zQ)#vXHuQ;SiaDyKxIYq%AEJ-VJJk55?OZuaiiya*ZrT8*>&U>fH5=x&5TVZKw$Z}G zWN^1nd({8gz!|DE(`5#0c~PCt7rd?Qq`|R(5^*KabR)OvKcqDLBQ}M3mYf zGM~djg+n)}B{Up=FGxVx)v#_4ZKNqBG;{j-g8&XH!W(S&1X89Kf44 zNLxforbgnd;AR&4k$2+01e4+|(dnoA_AW$~{`vqzzUd3|ThFK|$R9A!6zUf7^#QZL zD1FZ?XbaPx>(F8KwI;4OE5(7QFEaKLNb{407plm?4VjG<(*adRCN71yJgH&f>p!6 z5zyCizv4CNls(lu28~Sti!cLZ6h)YLKbBlROHe{{WI>qo1X)O+?R$Of%A|u`%Mv#EVlGz zRvelZnr!1U5+9D`MU#fb_P*}Ia%g-*n^krbrnRuOw3K}cH8e1nT{d=?qHE4vV*UR( zd&lU?yJ*Y1Vml|O_{4U_wr$%sE4EXyZQHhOyW&)wRML4y_dD*>-R~Xa-u`;Np8wu^ zt+{?{&elutN;5|hDdv0VV=TdlA;PIMPPP)KauWx|nxO!S(stX`a+%>f?z1=h^I_5< zU}y;+3v0$#iqhCh)1}6Mw)Vy$c7_44xwg!<%u#lU?eOnVuC*C_BG)b(yMv<5fU_cA z*4p$T#C13{lm$RV?T@*1ZfcpV+;$~FUviZUChf-PO6ON1GxcMmjpb_y+RF=J3Ed9AqCjPZR&jP0t$1s+2#myLI3X!f zG%1W*9nBv8m+L!l(d{-n=xOMp8@a2MkcduLFpMs<*pe3`UJ_ENe2Cb+*Z!duFC=fl zLoJg7kEu zYLc>~MxJU(X;9w_AJ) zErOctx8M&QjQ}bzb}=Ki>Dfv|8c8g(xdWif!l*g?XGn<7j9p-ZtN&pniO}>IQHrtH z4nEN5b`W3oA}{{eDaa1uKE!?eg%~sBEMi&!hC5NGumNnRR1okc;a>O$Nc&2iRV~VOXTEc8@|l zB&E2rgx3e?H86A9aQ$RqKmqF)LR9=g5zPGVdGAk&pVG%U&(d$FOP3jl^H`5e8w59% zyreJK-)}igp5O?Udw&|KY`v$D^Z+YsV9s#}k}nK~bSg_jkK`s=8b8DA@!uG#J+bmN zg0@WSLNR_Cb`uv|`wZ7WVzsQFAw z`N#EVg+)o1)wGm1-U*(tsLr{Kvt0JS<6-~lX>M@Z=p4VqL*1`Xod2Ss`M)nh5qD=3 zM_U8y|D>%^(fP-UmE4 z&v5(mIchja80{+^W!&9N04O|PdE1v|e6`*2lP%6gxo@t=N zx$KzrlIO}Q4>6;)4zXz zDqJg?a!|A_G^I16l&m>k2Iz4YN{{Ijv{A{*PI*`IS4TC?iN5wYA zRuyu@__d!E8H9m>g&%YYH6UYkTBp2e`y&zP(u4kx-We?*@EY?JU3 zW*k&8==*@YUk^rZs0G_8_We94jUYk63D7>El$??&U{0x*IDt)1v_5U-^sk@!@hLTM zBkh7QU(DZ6Ko3FOtn^01Fnz$~&a)3y*b%HnwrqHesXksV3@;02BtShmY#6K^rhN0) zz-f*HX4yzt&i_7&njS7T73E#ozhy^bykTKmYPA-C5_^am`2_&BsKg3I0l%v9G7qKcGw8` zo0QywjaPM~m?*g&$GU`c4ZRD80~+?HT=GF97z=V}WG+{&U08)RF%?>>5eD??`CPF8s#g{|3q9$lYGJt3awv`I}urX=|pcPKNg>}VcQS=vsb7zb7=2(Lia< zAnM^ZvS#*Sc+Kv!i)Azyajaw06lK*-{#=sR#v?&qxbsX9HCg86?9!ZK*bqjc>+Jw$ zhPt9`2L^qMSF$hyb|NLahC<`Sp&Q`73a9EHyO=8Si=+lApcJRJ!4&w4N5=WfpctDr z@A^Z-c1$oiVRP1vWKuNU1(}8k{LO{6|6AxI=hv{jL1#7p?pP-V!{9h+(HAYPIM6$w z0BZBWN5EULKBGY{*Fp^XlM*FoXuv&4He&UJNjGEov5z9y%SX$@+{WrGdsmUFv=N*t~6!k%zmBzrZDxN@yfa9JtXXJA#zRp)8Wrrr{|u~9*7I9gDsKHk;KqPATNR-!1G&Jo_`-0 zvY-%Oz%|#zC+fOrCd6rgW-I8!4QR~10(IPiJQ#1MF6`fLDquVOGUnHqrMe>}=^!lK zV5M6F7CEHowc1`cufTDTaafSWHbV<0)?%vNrjR_ZA#ls8KHtVI@%8Eyxay_Yz8NpX z{L5h8sA29J16)-9m;uF52g>KU% zuW7C3^b(%ysGGyhe8Rfi1Ran^zT5lT4bD~pST4xkabDjM5pJMLm{k-`Dodu7?qASc zKB$%~5RKHb=c6BZx79!Fn9Z^;@U{#U@_rSyh%3ch|BiDG{wgsLJ|toe zzhu)5^#7+4<13HwD`L<2KT}TCU(|3`03Z0`@L?ce!?K61b=q9badAiO4!=Pih%vZ; z>d3w9trlm5(Kq^x#4}OWwONZY4IN(VB(BRpq8GX%5@FeF6Px+iPwx3nd*%=5o?=M& zX;AXdEao`uwjHlKo_yUru5VX<`rZ)vfjvh;UAm`c>~Xd-01Xy}b`D%x35@VFdx>4J zMkKC$(!65teyg=Usbpv97uR^?>L+0CqoU%o2py4)O`$7g?XyNplz3dRuu&qJ=6dN9 zPF0w>PaC67fZ<>-pH>Dr;a?0|(;h#2bz@+rJ{r>EAKV_`d*h{~-r;cn4GOY@Wzi@v zqby@wYGe`O!@mR|{{=;q?w1E=h$sV_VmvEQNr80yWRnSqBfnrVyd3s$ztvqcvp#H%a z`eu>2LuYXjqfTP4WvBq6D}l=xoz^#I!DL}$X{84rG=L=PB^tSj`y z9!)66@y$%N7<=RFps>GE9-&`*h!4Bn^1$q*+=6xT$0Xhgy^9Y=x(f_TZQ}6vM5VO3 zL8zH@2B?kIG3gGRGv((3zgHuxV!VY!vE3Sdal~3ozTawcw5v?zLqG)^>}N{lW}M4j>PC#>Iechqchs-M1`W8s1)hl{5G0-+8oVeJiX4h zfflvl>sx>R4c#0c$vU6(qXq=M%v>dwt&!)K#-N##5~lq~r+`=E%|R7T_I2ZT5H-@T zD2C8y@!=fx7HH}@tvoYeaapB(WDpu}zo1efN0BO?_;YCh)QWb<(3qNPAv|Mk4RzP#?eIR`;o zVv+Z3mnB}#&oh>@vDD)74T#v+6>e5ZA34Fp__@)W(?NZ=pL#Q;z1a_UOJ~abaQnai zcnODu5*t^Xh&S5hx&bjbmdR&ZOSPoa^46Ds+i7{|Ae(3Fp8)zM5}PYU)eEx6C@5jC zXg`vgS}zOvZ_s9zOuq`7~%0@SZz zhP=eRFVL*5Z4*F?SuW_4qi>sJ>yltoy6$MDI6<4|Zuwali#5`nBv8OjyTIh?s1~VI z8IMDjZJs#Kc-z|9$%lat&=CIRBQIAtY%0OHsfyNGODgTm+%E*%*i=mV2wkJ;ucTsK zy^jGsnAKoK)j8Xx=WK`OBPBkb`Rdvge_tfo%G9T;f@FJL_^`ndZSHlYIhw!=%$bIf zFi1&n#y_8zTl6=nT6n1VB{{2pqnqa~Q4K|u^%n(F+o0@t=an@@8|vb1#^E_j<}f4p zj8pbYA#P&wRe_JDydtP#dR`Q!=z>FkyDo3h<1K-ijF=YlT+WA^iQufozRr;L98Bh!MaI?o7`U!{lL}Z!fg;{X z;IvSIH7NAQSwC2CRr7+{?1~E>>l#EK>-46t<(X?*i^2_`(CY9>0Ec+ptjnUV5YNN8 z;k7S1bg! zIc~b+x%s`j_Ef`$6%pJj4~@@u1;T2*MwXDNMb|!=(NXp&Rc{!#Jqn^HLeP6vc7D6? zK;fle0VcCBRs3P-kXs7Tyj^zL18`~X0FC^%phQH)4ZOSSuY$fl6%&V zELXmLer1t2ZgFDINc8?)g#Hww?}REX&aI#^*;-ti#=r5@?A=a{MnyIZi9!Ob;TWf~ z^0dr%vF&akn-SQb-M9K4aj!HR9SI?8wmIN zQAQ$Q<)8jKg)Kp$-@i+uyWN6S`z`U%^bZQ8}Rx6GoB?|qfB5LwzDSpk>E z^IL4S1p}8ZJA%We;XD?#>sBlTMcqvaLCE@yYt9`$C* z0tbgDp%~JUxo!+b{&V`?UGr0ZA6&nM{a%+k+wV*RYnzo-X6K1oE6+K!Vx5dH;3T#A zjFzcWx-u!NU6)lmHu7(K(e?ME9G#J6>JYPwR9BImqBP+psl`gwA8qIAUfPp6$1Rfx z9aF~LIRlGMA+r%mL?Ogh#ZxO84|sHv!!aV%fhuB+KG=`4NA5Jsi)qYE=Lk|W?KX00 z`tfiJwUa5o2nXcnh<8dv3q-66hr15;btR-<#<(OyBgN891o%Wa(M z46&;xEIjEQP;~~H@n&vDHGT^IA#N>q;yPFKtLTAVI3R6W>$JQ&!KTn7EWd!R?j>;AH+GMa-$0$XOz{vBbuCbj08Yrelh4xWCACH{$+K8B@3BIRsdvgh z2Os7~+=vz$Hh5|m!aP_Moq5V`sSTN74was_K0#g@9d(}sW&`?9`Hq^N08R9Ym8UEs zX(uuo(g);#?M8ID0TUW4tiI9^fcHRLM_m4LoRF?ztc81&U4i=24fu|Q`hXI``Rc5E zFEc`h<0Y8)XzlyecQFOyR1Ui&=D{UOCOjXP0;PEPhLTJ{$<9fg6hxhr1-Z`|)|%g* z9dm7M%qMrnUOzW3giTYuw5H)xU^8%nH%%=f?>#f#SRIxXOFDE_SpQN6tyCZA3&Jv* ztKRjO@v&8s;XQHjVn%%S6aoUtF}eG^a9K$1ELi@c%*d;Y^GMcs{3hf=u{j@l_qfS{Ix$(tXRj~nu_ z4fOy~L)H~~yD;q@8m;sZ@>skIx9`yFnS^1_#gICT8U_zze}?NVUk#jZGP zULwW2cusSNj#z^;sA5%gYA&klEIrn>oY;&Q+!4;dK$I85!qVjeEBb{ zk$&3i_wbhVw@4FGYUn0BetC2_iqj zb;Tiu&p|N>`|okohuC!KL0d+l zjG&a_Vc^1<&*e+j3eU-ABHzc$3+6Yj+h|N2`#2;yl>$&5V83p9PW7;@^PeRmde2#{ zXkJ{5x$9uecq;gt7wAv!Q8gi5?!bb~8!U3~X4sL68{8ef8H*5(6HH+W-O7Gw0%c#+ zBkJK$ECSIkc95w^#>_+Md#XVZETA+<(~kxg5d!0X@QwItR}ew<-u)j7wRl7JkN}=B z?!DbUz8=1Zg)qPIuJk;PHwbOZQ`ISVhT>Jk2C@TBduau^^^XgPY&FPY z)XE~PJ*-PyAiU%6YID8@8J|oI+AX6&qEhN%bB2BObjEc@nv+r)HS3Nd2YG&x3~Uq7 zWM?bLbBSTGRMy<6)31TgoG8MOgl1#+d(W&}&Ci~SJ7WbK(;)NPAbj{Wq2vVdI1}f^ z>G_o6tYg8*8w-<&IkPlymtyU?NW6cTiFCd>QQ^toU7V^cK~330dI)No8cggIbADZC0-*i?qV{79&Ly7+KTETH!dG z?zUg>8p%wou^=caa{#H{aSngTzQVmsIUp{I1j+#kk0BXtl8fc$TkIr`(njk(>O1s} zfnYyLn8isTjQX@=N6>=1f*|x1a9Z3Q#!MtL@rFs4r~$U2l(p<^j^(D)k1nvT6gTGn zanzz_JchD@L~{%r%ZYb`1yD5HDrhUG2-munsmOCcvC1jGfc; z^{x)g7p?))2Sk+SOvlG%kYg%f#f~gO=mzeAWv1K^@g~><2&A5akXCNW!e&UkW9Uz9 zNxj2OVe}lLJ64SYG6gj&+AW--xjfe!rsWMu-fUASM3tvuQcJm~BfI@(18h5Q^0fdN z?lf+8O3Z=r)-m$GBcC;UAA`vn{Y*4Wb-I{6Nc7F>Sem7i);2LYa@YGQsD1e|)vEnH zr0Z3NboC8#CamCU&Xxwk(;~WE1k6ELU$BKfI&%~|$_h0lV_BBon+r`C2ONZS_y;}6r6XK$aW))r{;e%eGOfS~7sow4&uO=jQo1-W=>i4dox^Alrq+NimEP`$$UGoKl z9*1n3GSbQ_F=+^`TTc(Q^53P^iy41gW}(fgeI9tJ?#8rP(-R4ty2u@xe%H{piCa#q zxOH`Pac)6+3PN;&Mt*s_)@*cU7lpq|Jpbyl(@*xgzMm!K?3CZQvnHcQ4}={dlN0c62o`%Nye2_5WsF0xYN z*Pr9tY3t*x!bLrK2w|SThwImcdXmr$YNC!i_kbnB6zCM7 zMZv>K)V|1Tc!1$t_Z91xWR&;&M|q8rkCNXp*A0Hwa6Ttx@X!akrMaYm1Z-0e>fZcDX-5ogW-Xmm zt95d%tq1-?1pd#3WpsSY>fKqQ_THqG*@SpEFs>{8B?VXly@rt!34^8?A#|jY+TjzT zMa`U03Idq-FqbX5O*IsANdeo(!iUnHnD5nMK3kr2(45$th|eDo|1k^s=bdvS_wr5oA|Cd?h=>0Nc=2EF-2YiM zH>sX0X^Eio;ecB79~n^2YidR=r$e1pscTV*OU%pXaVrY;z2-~R&q~={OD^0xaSx~LXHnD7P|so<*<0MwR|S-Sw7rWf4lm!67PF_!jQ?rno9b5u4d1uK z;M`{nT^)Wq1r56x)vpX*yhmG?iPCUx_=DP%l4xGgIH;8fUW4d3sFiYXgD91JmbnT$ zokwWb*SStVdC|slE$TYS*(C)7U%faFqfDlSrJ(d`e|(#s*#%+9+aXD#_#^JNOxD*z zG#Zy}B5LDJsm=woFG|B091?>ykXB7nE2?IW7LT=SgUs%NME-2F6z`?%#j2>jy0{WS zcH)#uHqlJGp#70CJA_|vTXcm~v%2B?ra?1zy}~SYvgvoCRuRIudT5G2A${(mCCNkf z9vr{L0=|b>DB)x+L1?e+Hc$PbgagZd53~A#){bkovA&%-rq=AL(MM*_)7~mYpr}&v zHPcsmJ?hYRB56$XE$T(#%UQNv2wa40C(_`(1!klRYnM2Uxr0j4V!% z(v1<`o-$TG0&udNhXJA7pGK@n6DDeGYV&Ywli%@=G+yoQE#T05AnH+X!1^vlZ=FR% z;vX%CIBb)b%XIrfJ^Bg|1~->v^wsy5TqiB0=_Sn<#k#!uZj%`(3n-=qcFWZk99%4F zZpe+@HIAz0-ikCWlP$to(KQNI*`4)-6t0oSgo^NnZ=Obw!+MAa^JNuyV=Gb=c7ly4 zvax=`A7W-2mWX2ee;dclg_13Rv?{$~KoGFN4*!JoA0$4FA$SMTadQAjbBA1ku|Q~k z(;d9U?f)i9gfhq;UH*NZA_jb9w`SI9Hfn>|#vmPXHI{H~ScsFt=azZm~qBo)uU-q1+?YRTOWU zdJUQ##_hZ~%>g0CCI2LZGaMW3p7&a)`o-8FI{7xmC-jy}hKn;JufCeNZh*{=OfUonX`wQTxW0mE0qm^XKAT z`e4+u_5piDl(4aA0{+YibK_4$gXez#yjP=E+gGW^pTSsqTnuzCMy+&5IE_Cev358Z zbgc}-_K}t&dtkw)g}q~C`Pehby)&V*rekN%#6tg^^G?rjWc?H@$>|?J25eFy-`;}<7*WBU))Okk1}7# z+Q7+4*1*O@!dTJ7$wZYwTob@|0A%J-N&p4=Y-_^~5ifZ^O9JdS*Z8>;>Ouy zBHrC2%OOR!Y7O!Luae|L-vY4qZpD#dV<};nlu^zISzu&FZ@8%ql>=fJ$;8sIq#XrP zt;bR0&2XL?JTt**vGgHoPF^*#R*psGgY7iaJ zA?&r9(rS~~r$z!~73=M?TKi&jeh0A>8mgc zix<2?4!Bb&wXEyBu^K}xv}z76o|{5W%^3{Ls#3r$p<`>>iU#3%sX8rC%>pnZbn#93 zN$X9u9i?IM_GVjCpHQnr&t+xp8M3@b4#5r1<{9D^Wx1yf)hjz>*6+e}Yjd1&u@bDvoZLRz6@~+rA3ARI2^nRetR4{PG%h zo+<|Y0B{SxCZ(BOW%-wLWq@j@g^09-bpDNHgek_t71N9GfYUnZmga-zi>jtKLV6X~ z{z9rFqk8s5Q0T{=ab88fu;>YQk>Lt=nc?$PWaKo!Tins3R(4wVWl;H1n>%=A53~eU zNU};+Yep6qrM^c$cQKYHXFqn->?+v-`ZhAMU8FE`GG5zF zIc@xv;#z$3<5if22(BDn^mCMW$lrupGTDat7H}5bMvddK^a+b!x3T%pd=NC$Xly*= z&l_KZg&yN~oX_}MIc<%oEwad2ltL7Jc3{q|Lr z^uN|Z(er-bm=1py98Pi9?Tw-Sb%-_fK3#ZnC)z0(57X+RK=m%mOx&g9P}xHh)g`VoE-tAp8;BWdr5Oum_{o zV~#eP$~ztis#@AOTYXtZ=N7;_)F`c^0uPd-+=6}+5^-s13u`H+ z*l0NPqa)R|*>d>ISXaqq{Q}9n$hL}hA3AGe5c8@(fg*>QRg$+RO_?W4E$lggcW7x( z6SKUMQnT*!>(vn_BmFFO#U+)Rb5;J9+Nu1f{mW;=dk{5bC8sMb zBY6P5^vYiD_Mq4Tk0bv6F1-o^5YBQEEq%pNZP+ob)6T^y2TwxhR8`x(Cshr0q*HC! zwOG;=wU2EZpsL5Hg4$)fO+9whJT{*8+O~QbQH|SqF=gy;vai*t%#6KN?@rl1+N!#i zota4S`z!H%i2;o;=cT)N5fu2Am6vQCx3vn~ZTyQzfAq^$fcc>p!Y)v_4)n>>_RN(k zw@7eHRa|-l)Q#OF8~#EmCS`GE0pWxLq&B9TzuE6o7~0ze=*crxJ%sv7ZYySefF2Zk zs?dudOsb4xBZ!b5?nLY<32J4IZVsO*vUCXFK73LIY)5E`BOxBRH(D~0jI3o{m2HG= znYV`Wl!{nEOO=ttt5XM&f`y(`B_L`?^C5k(n&7Vawk^+e2bI1R@{tgKjdBxwR~KRf zp`0^ZA0sC(^f=fTomgi94&@=+qd8A0gP0xYeTw@VQN}={wA&9-@JCQG8YLl1@bI4` zkSSqtUl9~B4;_zeZVOjB4a5o#S4H+G_BIFw%t04dzQ7$(-q(T-bKJZ%rXcfXKq=sof1wL%F zqkjor9qtp|v=HVDRa{q%Vm06ox{PUmIosi$j7*ER${&_&VSS3olHb&^9@-QHw)Y!! z9X1U0M%+xu2IO+f-=1($U|cRgCfl$(?R6SC?UFk`Q=GxjkFDR#fIC>$hVX#Gg z#Dh*>$;~CTaim8`C|tqOeO`}WR&kiVSV#F+M_s0&oa4*!vNB z$e0dZ_n4K%duB9M>)c8*D#qzKkQOrTDbS6ga(l;kdprNymi?!*;FhHD`p2mK;lIA{ z{~u4QsDXv`my`Jay%LqBq-CWffc)`8!YMtqu}NlKv*uP5haN71un?W7X%FRF4-EG|C~QP5q!(u?GCL1-nDA> zf>r|@@YuLF@9iTEh9nDwSL27v)pPK#m}`kc9GRDwVJBe`+_Er9(SNoN4lB1MsRu_p`T<`BC#l)3wA+=c`;rosaK0?!n3f;knt zcZO@OSgmHrKsbGi#H>ulRfr91wE*eininw7C!z!&+Tdxgi)RM0!5>XVE=L^Khrvw~ zkWSnbQA&~|{uBkd6EK%TwpbqMO46++3O(;VUfJilX zG$J)e{8?ErhNx5PxVgKJdgm@(_YfhAD1mQRu2u8IRECx#*w4g1I%~@It2j^iS>QaW*=)$*@+E zlrpPQknSTA!yob)NygEjAQDKAWK#b0c1n=w&sy{#tK5+6vR z8*}#xVe9Q#-EI(v+&0{(ZHRW2YXRrjm|W|~1C4}4;T=M}?8+|uSe_oEMJuYa_235X zf`Je44hMYmlexOJ1{THB^T51G2Cq4~01a=tO9st*GXKIya~k#mjUm#%BBJXpi%GUpzSxw(L*eo0@p3_Z#utmBWF)1a9c zSRp?`x4BU3P_39QBlcMA{4TOXA|7s+tx6cE8epwh(zd;b#l7dVM@3P_pjr7zZ`Q(~ zGw&{ol#Zk#CKdX^J%iX8%+su-kVuCDqf+DRX#pen0Eq=(ZY(b$jvPsBA1a?m?jY>W5ukm_tQLa?k^u^?xT0>DU0#YYOZuIGp2iCl-c@ zs$&gOyOK)wW!Rz{XB%-nrd2pf4otvte{qB7$@K<9-;tZxX6z5X`XCQVgaMk@2JU5< z6=tr6q6x~mp7zjXvk#BFslu*nn3&cuVjmVwtR-*$3<7aZW3P1Z{I}zyQ5+yXJaK7!+&0?|Gnp1 zQrEIZU%~!B^uoUO{AOf*z{rjctzTo)oVSOXk;+L%@}oIV*D!)8?_jGAyMe1?Esga@ zTN6T8iG*ifxWxilBbDWnWN!2M4_k#ID#C{%OFim`GR30DDjx~p-aQwyRZU%Vu9P5} zR5nM-=X=Vv_X*$U1%cUiC#XIbT~HlN7m>AaPC%f+^DH$%D7rUQ6yfVYX87319s~XW z|CbMg1%%juJWpSrBkq91i@WwXAIdO{HyJ#hkfQ>36nK;)ypjBL3-cD6ew0B^Zy|5llavwTEu&4N087SCt25p_=Cv9QiOCz}a1bj{MLp4^(dPb0QAqT$miO18_)z7FNRAsTE_GjNV?Fn=e7)LC>o|ZN zbV>O*Bzdta-rP*F#YU~s_4YYiyo0M~Xkn}n#f`I4xW}L*(MWWz6tsRJL1GabqMoD1fZ87-tE+g+)ZGUssQF43Ii24f zW38HVYCu`Cul3xV$yc(^rFcT^t};Y2UCJJNUH*)(t90v=30U>&07);CW@^WhPmXA* zFqj*sT5)2=i*7S%_86uXyQVL?H`eLM{bk%v30x3S;e6q+auyIoTh;mPVeC>xj#@vO zrPhXv`@P6m>wxf*l}6)@SN?8FHX#;Ew#QdR;NK{*B{u` z(9`xViQRkxb9Zk{!X`PxKqjp(2an=>lamk%VFMiAdOi5ykbi0-YZXe$Ngv}&wDm-6 zSH`lS=D<9&W0%yA>^ni41Tfu}YsBi=;i2xY?MvqvTg^uhqku&+8_XaMuhJC5Hu}VZ z=PS}dJ0*X^b)*ue>7W2M@b+!Cb(qF2e>&@4QR{%-F7*&j>tT%M7SIdUUV3`@$BZps zIP_+Zn!6W=n8iP|&xpdsgme=*V)g_%0&eyQ^xV2}5OWJR4!Em;7t&;%frwESZ?Tfy zPe3y3!w)@+r^|b_w{v=atLjHPI|Ok`+BmV@QH`F~=WRZ^j>n=qPPHjf&w7}o>J}|? zeP-ABjW>=4(C%?;3RqX@+aJsAvKNP%XM+?g<9d$i>DBLueY$#H3rSfYua=(>i!3X0 z#O{q{zHjKiRy7E0KA7h-#nuD|XuWL<_9&MBbfqz)e2)uBFX+|BkUmwH5U08V(2Lvy;W$Kt~Zn(YXs zJB(>6N6f=Y|2vhx&i40TSh^xD-bZ!$U+XnH`bGNwwNlMg;J&f?R%sZs<9F&wVn-y) z?NiCedPXi*6#2o8^~V^rsbWiC|FUIXl4aQ;75=YtEAZCV%3LO(7DN&eElUY0?p(j7 zx$J}<$*3m3v_W)ZXHb#FB7PEr4XjJbaqTtPelJL+DE;ytVao?Hz963#Bkq7fl)hgE zR~Y#k&VWPaz=1oM-0lgxzZ6!#9mQXe_Mxv@LaWJRH9 zm&kRSbaI=_xxM$An&GqtoOkf)PXomp&o3mDtR{RL(q#c!_D~mlM66(SYLUt$j$h-@ zImO5zJ)uofB2>-}u)^t${07q^BR$AjHguRYoXG+ZjHLn?T)W75xUXR&gu~$@O6Ury_&B;H z;pXRbJ<~>b5?6sDxAl^_$jm!wLr5D z+uh2-vST}kHDazsopZ&Bj5zR0H;!Y)$kj1zLF1na+|z$c_y3$v64M)!>Ka~~m?k+* zy4KwA_ly&>Nl;8D+Si~Au1GLQd?l3cg}Q_A?O()lIHGvGga7Q6a{%x;`J1G#V)eOL zKZH5!^uLt`RJT|Rfwg9QLT#!dT?XF3dL!`l!u8Gm+p*}MMua4-_T%JhFAnibGyZQ= zW?!YlKS0R;S2qZ{SXdi>8ACDtPtmwa*-CCf9?O@r*(C!H9{gw@qR3GpPaB**S5dUD z&sKxnJd9{dQ(eqLV#Pn@n(TFJ@EPj8k}L>o0O>2Fbceam$6k+r;n8Eegy)3g+H3lZ z}LTpBA8KY~E^iVe?zWz2xyC$niNV;4&K-Bi(d4jL@Hk0O>4 z-;G^5@^|(bK#I~vjD~Y#KScEw{^_WhG`VSCb*N5csu@r2k2GwG_=(;n7L3;b$`LHo zj^@4|4Jv2otn?g{&4Slpo`t=6a3J5+DP(AJp#{#_Z`VHiKbn2{Yzj-neBX8m;9-4iPE@jf=1)HQ!ULy(LF@Z4--=K&LHbQV(8YPEv zNyC<$rqIVl=MIoRkpgekj~UiiOS?1Y^(M}YkT;hqsibTj?agUDG!rcl{oNH+RS>_j zVkfz(ZP(LPHsl-m3d)2z;}a6kM~XihGZnE+=7sy7l~{8mvf5YIA5&&j3$*iC3Mx1_ zGE^MT9qGvV_mECw2>?uW~oEI?{M#m87 zRVH5A__YQyUJfAB?E)Rh!(mtyz`Z%Yxjhr#A#~SV*sh1}ki3$F7_} zmguG%AQ58q@Drc@cI^nAl&CPUz2#S7v*j=HvnCM`p6J zwl1grr>bK2&byh?2qQ#?x-<_G?P@s1ajty*Mw?K1c012ZcTz!*~Ax6~p(u08ed- zp;+{HteNC}j=o+wa3$`y5?J4m6F}t<9FuRgKA5ij4N#YAXd+-uD&I@Qxd(Zxf+@sA zJJ~@5l%(`BxoD%R7$f%F0md;Fg@>J`bi!RmP{B*N|20P3nsBpZ2ycs*M?WOiDjw}N z6|hW0eQX}nH=~mYSLj+nueyP6laPClr8+1r{E*xlg`#K~{#LSxN?vq_ANuF7tF?Sf z77>gJ-bhoT=IUbQhkc0=jw+u&m3Hpq=~roepWY5$mXYuv{J=|VzspMCjxN3~xolF^|QcJz)G(Xe+hK5>BWvHRp*y{hfC@ZI|L= zJYkrmErB+~gk6giePxLt0ogoS#N#m&abW(54ARr(E%z9fVI`vIzLwS?Rl(uH$K`>| zr&b`Xj9?|X?0`q`5J;FBXWus6V`HaspJv$Axj=M`Z!@c;>{7FeTAS5wV_xhaTKYR_ zj6{kcCBU`FI$Fa=^z&E!Wqx2-VtPV#f;~L*=67Zp9$?rrGGoRT8Fm5chX;=Ow&Mcs z^%A7B+JuajosKNbpM~Z1>JjD()-v*93)$YCACV^Y(i$H=TJ9eV(#gc;X*d%H+}izd zJ8^x4yh>_%Q`6u&E-z*J#WCqwNt`i@M@KPfoTuja7V)m85uPTZnk>>n<~C+JPtpoG z3pHF&4bn`p*yZw`WV?^j!K!9`MfJAqvGQ!#ho$n-5(5S zP##%nr*oG=i5|hdJ>Ct}&JJ9LBaMUBj|aBFTh^b>wt5B$Pjb}G=*2I)pR7z6ynlvb zjX~5>S4xkAonzxQ=SfSoGW!F7-} zPWPTs4bPVEL${OAw5wG^(u7$+ z_wK6B*FfHgeN%ad)!qnq1^n2jsy5Ufa@{Q1UwMuWvgua03vXF%{_#s^EF5hoZuU4) zkxJnZt%J;W8m~C6|o26tmMA%@i{<0e(!jL3D5%5y@ZqjV7Ms^^+g~ z7l3>CcrYM772tLuJP0$4Hx*&&%0jUUEvu~A*PV(douYYlb(|Zqv+tJw))m3mdtX!B z_`nqT)wiw^-+z$lB`q)*x}x+PEYqgSjM7V`{g^CPPW-?IKFyE1OAWa=5U4g6y9WLJ z9#}DW&|2-A)bXQ`Yp@VZSfw-Cfs943v+YchWFefN>HrV$a}Xi#gYPBD1<3Ro?V1CJo z{WHFH*$#Lg4fO3_ceff-64bx$?y~Xz#Gv9vWUQA{9xZz#os{~!?3&G#Im(C;(8S&G z!^gGC&Gizzqsij}1J5RfaO9%2Z(~n&Dw80i{w}i;JQdb1qgsRVQKxR&n_UdBY!Mzt zhjH22uHVEaac?{B|0J1&6hQA{I7SL1Crx=H9PC?>K9*R-)x*pC%SA(JGby!w=^8g9 zMlIY6?eWE4g7+IlIG*NU_?kC`ZR%^uWa9-sD&TMLqy<}SyZl;LcYl2EbW9)W_`JVr z|ESoj0B1OK|6iYA5gH-JbV36-Nn~UZir)C6Vy=2v7qKtLq|x@kTCW$KAfL+<->62I7pfR33nZm7cR>CG@~6rzTVJ^- z4osSG%a(9=q06?rY}>YNqsz8!+qSxF+qP|6UG+UZ_uP0-OiaYwGv8m>J9qAtnJd@A z6x@L{5icOakReQIF=DOzHF=4TLlV!Yxpl)bHjMA0oD`jRp;4+Ic+48D=Ul3fdKV_f*bcK(kIV#6kKI<=x%q3Ra-l_;)=6?{gH!lPq@(}=D&z23>`6I}ZTXrf~ z5GJYuc(9;!MM~z_w!|LUVY!2dh;65i>H&0PRAss;tjY;nS)2L08T4ZRekv(Xm?}^3 zYbK4@71hCUepnW!44O-nAq4YXZ8@ii-LJdCq5|+}{nf?>Im$B083{|9v}7tS>{e9X^?y}jghlb4AK)$ z)Gyotb&4YbnZr_(?_X}^vt*c*WYdRDv;5&~Q?l(^f@6mij2)F@i-Uw0ctt5$MJe3b zr`lBGT<)A)?T1HlQl}Vox$@D-Grv~S*8+p5**h{wDP|rPbQ1UpyV9a zQ*xEp{j4QmvWq}=c?GKSm_@oqcTuBtzmWP#v%5Gc=$RZkZFdMF1-AnLUk6Z zi*gmJwH>HM{2B}?H=4DnLyTU9vF317l5}9#=DyncqF6;GR=+#PM)1PHet!q_J@Ean z&gk}#A}ZC5R7c?=U&`Q8;T>t6>gJz1M2oH=h+8|#ZYlVe+-uif5}&H!53I}8#<7cI z%;n{U{?&@B0-D5Jha0D>~u}wI^()2gVeF&vXqm9bneju1u?6|4oVe zFXl3hkPqVpnEL9Xe)}f+pSC~$7BK%ll@ri+_?Oo5q-vN0)*{YlHnE$r84_oc;2sls zF~nfpCAdQL0?UsapHQyGpii|4cnU(dv4>K=@|8u=!@_E9qesAMDq7 z5*-+7_+jw1zH2J*D17(CO7@f-51~#;`xd=Z>Tmd6sV_EW|2tRs^++?4Hy6pNI4^F> z14P+XJERQgEm1b)ju{tHZuYOD?0NgwOe5DWAle<_)(;)fu9y_$j>;VrP+qwkLBH|_ zYYYtowdOgIxedHiRCo`NB}d}PhAMy#VDiWb&-C{CmB;ZO?j6{0g^4(>eFo^F76&-e2OJXDLU5jT-yffijLGI z?qw*6I!l zBq@^v1DC00FuQnbBdj42k7Z%hElBIY_g0MM%^i#w26rIlYSSSW#NADeH@WWQcvr9} zam9K@)Imf^_O;|SN=)eLHYh2y@)b^=qT!1r=T8VrD#vCyft@CWC^_xv6dszq{GUr zq1QNnJj$0ae^r1nTDNT;^}>~F98EZh&48XbTQVfl(r7eQxC6hectvkmVI%E!f`~jc z6iOm;vM`D|bJ@B~!-N_E;c<%pGRPRmN~HM!lhb%u^wi-c3?;^#6r-61OHkIE)1ov{ zvs2+=Pil_*m2GKJvhk20u|8EM!TFIN%EVYQ3cl8GgO+5_W>9^F$#>-DSWs)VHcAV@ z9vf2a7W*^lnWa8E+kDfx>RZm*y<5HW;S1yN`WGr)E_GL5a<+mUCs1A_@CWROQ*txH zsvQ_m8_13iUZLhb==DsfJ;;40^TtrgnCza>uk>0Je*|&hE`oazaZQ^F`N`YB`YN~yrAgPN|IgHQ@u!VJ+5WFT~!1V+wYtg!c6P!PZqN)SFc8mBLql(l6IFYz8u_wCWodD$oag z!?$;|{cOV!_GWYUxIdB?EB9PpI>Xrb`=f!>Q=&y4A=77r)#~Q!e`+8?THKAF3FNWOW-~=3(;A1zHHY6M% z+basxoXqinR_bh_wG*xUh!*m|tSlH(c_7cq#e6RxaWOf~;g>bO9!gBT**gMEQd~0c z*vL0B{}XPfk;~W6ovU2EVRn?UrAq&lxFnF$IW}a{*O^Jx5K{H3Or^R=p$+5s!Qw>2 z9sa0I2A3sq1cH^7iZwtLRl6q#i~cKmTTl^5mzE%DeXlTnaKVDOgz#bS%D7hBC)J$s zNT1Pdp)A`!Q;k>)Le+)Gj;k2*oG*A|g7izojp0y&uAi3k^?P%TRnGezO;yq6VKRFM zR~a-?i$xlU&Myhci%A{sXX>WBX2LnvCRPsAFj$ud;kMx)&n~c0SLX;V0QAOGqTqdw zaf++R;-;nZtWsve*-d>-PH^Vw77R#M*pozvLj!in{e9T)FvsuQBC?#}-^q)mpNz#F z7Cexec1>#N<^7~vKw&($VRNDJ7smQ?t{d-2cI2|pVK>t>?{#+MbYQT@GQJ&lpN=&5 zQ2ze*`nU;hUxM>|^GD~Z0|stPoKpbpr$Ceg85HwmFOqq70Bge*Cz$RD!I&s5Us^!- zlnZEYY^vZO^im+^xu-fvODt!vL-ZRgkIM{*E#BlsF(*RhAnwAB_d;Hb_0xPU84fx@ zC4zwKx2%J$z`BYJD%F{yTuuHMf1Nxz2mz6!} zndrkcyz!Q4{1YSjrato4Z0PeF<8EBBFjASo6k6FN@7mrUskve*7Vq#j(|Z&t2})@^ zJ*0|FQc1^%^V@V0h~P-wR^9|>BWevwRl(9WrH zpMa=$5+5HZZP%1MFSvw`JB^Nu>>hwZYen^h0B0iYO#Ti&DA+3GXO*8%?jD8b4SVM; z9ag|B8@TiEigK6R{d!{F2ceA0xZ3aiR-vKLfM#>n^bSFfS1{-n{&F*}m^UhG4&Xzs zE&y%bfmk7+>enW9EBzX6Ky^GfQGiBVM9c-gHLG@Z6pOZXmyo9ZlOS*7b3Nr7nsi`H z=#wGpC#hPDZ0+|PdYTmWGoF$Kl;~>S`TA~!GaDIfid{|G^3O18$K>iL>irdvFVd`L z!4*kNJ^e?BJe_u=Zi%|%4&wEAzEk~h(f-9K|4?%OK`2Rz7LxmX$lUWo zLqn$8Rp)O_=M_-~E84caWZ{sYMP#KfR^$mrO@&AJ;%EE1mwn|sA%DJqmKt9(>D_)` zf@@`TIL`E#<~G9p-24K)L5aXriad(zC&d_IiZm1`*enbuN13NEL4Rd14>Srj?;5L_6$#`&%8WS`@ue7yyeGf&GH!yD1 z;+J8`@ImG>>E7HiMjlXy#Zg!#=KyRsb4QJkWjkIFNdQV$>A0<%jAff;j{L?MBZxMh zq>%t$JRA`0mMLUCll$7RUxTume>SF4fY^479me)RBSbV>5noV%SI_a5dp;tlC_i_L z;lOcJ+f(xxTuqX-M%ez@`m4*bmu>~Y*_1g*dcWF9^TCWe*it>Zd!a}b+6yKQ`*vJA zW|+SJ1}SAtoWYEY`99Hux)z6x{MMuON$cqi>WVU(lK8D%neKrgApao&S3o{p(gGFI zjhn9-l*5ZqD0#`>4$OpV`=?>$#?SW*1tZKseE$-=R7jLCHUU;VvIJE00$RdZ9EoU^ z8Nvefu-HD-(uj#CtcjO^3F<`6hYxp=v=X+t>gU^kBM1E@nuQ|Hgb)Gn>|Y_7|EE~_ zKT)_lRsVP(FQRydTwGmD$rylx;6Q^X#!OoGslX>m^WpQYCV~WtNs$2>h(?Tdj7ToO zUP~JnH6rk;mb}#pni`9&-ZoA335!uEP;yEDf`2ExGotBTE+(rmMrMc)w{Gzs$JriJ zt;Ze5`&)mGeYU^8^`L6W)AJG2A%oBn5f=Om&7%v}52p7Y9*j+* zFV96yMz^GoBu{h~;Fs|PjYA6{EXd78AO(3XWIIcYocF)2z$dyb^#8p}j-iXjxeebx zZ{RA@%X(YsZ?ntZ`(}ml3%PPQ7CjrSABw+&>?md61_!j_Mw`BaY99sSj&H0fcp@^e z9j@?V_9ZskC32%|*3wf*mOHz-%2mVVfq!0NSWz&|HHC-8Z~E@JYq5q`mF59t-qnk{`=zxUF&GA7fs_Pp|KMs67SxD6eYkr zWzURtp4%BtHrCcu-~H$|KLJP}r-En3TBEpLv9CT(xS)9_pxjp>Xu(s-|98L4{Omex zYVxc$Iu4UP_nTgFq7U^N7ec12{w@&kgSx1YFT8=kah4YTp%~lOYhY3Tlu1;g;hKu3 zkI%g)rbr7SJ07d(aGhOVg(eJk?2&-a^5VpuP1&j9y8DrZJD(;qIJV#q# z=-C+HXWGr%+@hjosaxaISLH~~kOMhBc?p_biS$K#+yHU#u5hyt zWnr{7j6AGCXS4}R4eVQ1&!52&7j9M-6OI*z&5#++;CsXe(F05{Zc&yshMnSaiSKH% zuUTZ+tEG5zn3CIDx)u}L@LMIXkh0IwJ4h7gh6v6|c$pg03(mJboCpMCb4-YOr(7jxUDJGDwT0qg9vDzAkM@sCA*W=Bi zL@X%G6Atf%bgXiC|5QXMTptap?{$i3(Sj%t@ZD!?e?Lyg5P8$6wr(eGHyeyS87>v_sPC#Jv*rh%4pt2T}|TlLYX8*sQc`i;f5I(f&s`qiE6_w}y(dgWv12k14D zDoJ;9LR|*tN2aQXrh%}Sq8egUmZ)^YBbTTAqzmq+OUt+m?l20?v3Z~^+F8wyaV^TF zB&O!Lt!SKVol|m<-1yJga*^$Ia9P3`R?ye{#2d-5o^rd=dGL5di5D!ddKJH9O163X z?~t;I%&$Owh(q%5y5)hArP3gcdI(Nov8mQrqG}V5NZ{sq&oxYWa!#E`%L2korVMG_kG1H1_t}mpL!L+E9S%EP-K4aub|p3l^jN^R;SHu4RyY$JK@038J3Ie-}X6V>1|Iy=bpl3C?1dMh^g3SO0gAu_`e zaMao|)+P8|B3QEgR#p|C%=Jz#N)7g*id#nLulveNv>FIn#GRC#u2;!o+`_!R1(I^> z9rBEb&`VQyD0@pFiOSJuH3Vwb{F@(-T@bepLb-Ag#HzKKt`hGcrMS4dyI*$C=klJb zk7@=h-l0=qjbHyZ%KXbJBo-@5mI6=%f9chQtc*5wF_poWm!2l3wypgTe80vMradaSuXO1SUs#OJot3o40 zDtoojNw7}#xmy^ggt*71Lp$fjX~MaH-N=JgJ)uVL+z3aVU_)D7BUS%B!bM(Ijd;N! zBFw4^*NKM!-myW_;oX>No>BiL0Kw8cHcFq@VfH0##N`Avk9pOWvXe+DNon!-2_cdL zDV?asE$_rp`4?c$6(x_X)$vJV}d6zI>S z5cy|b{p3D$L^6va6p8AD3>F{Dh9{7)X#2pa)M6JZ)Z!L;ptPFpP@F)_)KSbNNP~{6 zqkpT2%M{TXj`EvX(zKDcy?JwrTRodz*o=`F>y`EOZzNcM zK)8YwfCp3qsw;2+5tj8o=mP%*%m0hU@?UdyE2ZtfS|*>?36s`MSZl>*aj*h>fksGe z$b)!=OKU$hsD!1{U3QD$=zswW-fUdGkv@s8Q&%h}Bx$Q2 z)9lZjyjLz$liOb(w`jiOEx!%1@y=3v?UM^*94m9H_c3`)9yxNn`{qh4HH|l5P;$!D z=JoZ|`=z&*nK$NcT7zlT-W3D|2ZO`cffBkloeJB{T)ay5H+4Emep-VcoZ(Ev6{1;6 zH20yFWXlXe zs1lM)Gkb%O{R_{P@PtDrqbE&x*ukF|QU!BNWeZtM)Q)5cds^rE(rSGZru8!Z@C81* zzJC05SFAq`Lk$020GbCb)ZiJYPDQ#thkf7GnMOk$9TIG>H9 z`)0A%roMBG-2tkuYqlWsRaZstPw#`at~XrYGdYk0IM~k z%b3mfaC-{6l%cwfRim02b!4B{aPKzhI(7Nev) zF3f>^oG(P$Bq~X>T&s67xal{)_G@3BSJF8%;m+NDeHa01n0YY*2AB)^e4=m5c96qdLuQ1@@ zKa4^kI2J1m{854r<~4H>|Nc?4G$5U2W=SEw{%_zqow6mTAsHUz3P~^CDGT5~C@rnmR{}NMACL4#yB^%y z9(tTqodA=Y14}}aQvg#cv7US8q@0jE#27O3phM=7#STDM4x0stJcugUQNVe74nQV6Xt>pS--o9_mZKq!wE- zRojC&HvC3JxE_Za5L?lSH5Gq8GBPFV$6ijxbem6S=cD`Q2-$Bp*iD#pa8(>!)%_#^ z8mbg#9?(bY>m|?~U9fTd_k0vwV@P(AG*AzunHR!ncl8uZon9zjYWOK;U zx)phm#XuBb3Kf59RjoMIjZIpU=&w^+VKXdxloZ{*Fl?JS`a z#hUSA)|=w`V==&;moVE}bC0kBMu5IRN$gwvjC<8Xz-PxI=A2UKP;)@v0`@$rS5K!d zk+RDl)B ztOP3n1rmAq%LVIPC0q(b_~v_Kv~(h5*ib2b+DzIh?!?+Ilum5>)fh)xasv*JC-(M> zhIA->Fx*ZELv}kxNg&!lA@}iz%(dHC>z~{Ebp&6h%8JzCK`JFGqfw1SSMgqB2-U(C ziotl~Wn?W?+l1bkDpusLK%Rn7svLfMdLp$;^? zG#kB05FPgrbRNSHmA*-64xJyBiJjjAm-SCs_q5MkkHYJMKU+Tw3D+)g#GfH!)P?+zQv8>{yYj1PX_6anW&UP+>y|msZ zC$cAz`;i>c-Zi?Bkp#|}-cCb4dp@?k8I;3L zrY84ChO47om!>Ly19k6f3c_lJo<_>{U&Ehg`J)fI7*~A`DPTuRiOeLO-jqrMC~2iJ z%p%g?GWVz2rs8e?D1(|9G3+Dfv-jTzwJX%*Ly4HoI$W48-9$B*{VE{rt7*OfYmcte z$vyZ@6J{FTUwRX0ftmbTW($VGbR0yx2*GKH!aZNBT!^eRDAvVmzcLnV#o4tx&%wdp z8ad6rn>vh=(XxlyY*xT`z1A}0Uu!8u-9IIo&}FgahS_9km6e5*ZAcBJ+S`-oq4Hz` zHV%r_x>GuWAv`XNoJ<8;<-r2G1vz;ZZ?eVmkuPaJjopBLhFd&ab|I5_AhK$=Og>SF zCN!kFgZt#q5KZYHJAp~F8zA~xchBH&I&_+*b_?d>KyfWDvbG{2LM6^9JJ((q(@(}e_=GCAudB~X{ud<4DT#oYw$ z>e>N@V@;@yEw$T^+W4_gM(y8NDsi)NDTiDM38X>>F2YtO4@+i9MmHqEmLlp}akHCG z#!%@Y3J&*%QhuYro&*g@H+(TXyZ!(r1<$SbFKUWr*11}a?O*Q%vKEvw0hsCaRmqFQmc6i|A zoo?~U7bGsp&9_Idb-gdpf>P2W^Q-YW_kjOK{_QABx!{ETj<_6JO)0+sbPGB726Lh? z4{yp*X12kXu)qYC{>0pHA$Eotosy^kPbKbwE{)xN)U+LY)m%F4Qux9B$on%Ik3Q%< zby(K2l=$Elil_HC*`AAMFjz}Oh-=b`NaoKu`)3UHU&$>=Ze6Aiuzo3A zXpew!P#DWKp_kI?@xsIMsQp|v6s0ejki&S1DXjHIAw#*#0LZ+yk!}U+vW&x-S(tZ);gZda6g?2t!d~`IalGvl zcLb2lNZ%hemfl-ld2QvvFXpZa2nk-aD*b>Ry`@AD4@PkY5Od*BSrTcw5T;yP+%yno zDl(pm6=eJJse;%CG5RZSFRgezbZ}FX3|UC z=t>fE*i}k`uQU_e*eiX5C5U>Q5^qo48wUAE{#?C+S~Iqb*tAcN9Um=qR%4^9q$TYC zTIH>^gV7kG;w9aCSM;SU6rx2ex#aG^PIx-B!s=lBPFPE)DNBOAoscz z#*uwshI0#mvYu1DXf{Ks7ekouCSPoBnu|?}Ext$w1G-@4aFzV|Y$+|wpTK<#gg4d5 zXpWag0Avm6W;tVK3>6N78{;uBL_;5Pva3d{4&?gM^HIzQLc{mtR#-?eR@k!F(f=3x zbf1>LLnv+UAqXx0RKJA3D#CAm{9aWA-GFn5F25I&4T&2orE8z6{w&u{sE8Jt-DR$g zkRXZg)jMrkq$LTA z=6M{iU;X}a=IHkRdV%=na6<<}o+=?oDivZtg4_gJkGeq^tMSlMk__&6K&pczRvpSf zIMaD$*97ovPTeRb#*2$U!EY{H(O0-cDm_}(mT#tHl9Rex^lBH`WcAx|PNUGcb6xcw zBePjUBbBMI-W9*Rrt`oG>Ms=ay2eQm2I5vO7O;(K_a?jnY2M-S8?fj5SwF;{K*<9G z6g>Rusf9k)DyNiJ{|9Iq%n^mY3tP|E8hQqRJeO)0s1O%VXd1o7Dw+xkhbv51)+Y)- z!a@7CjpKU?R#K1VqP^m5cd8zcp?0Z9DYmxCW1}U#!aHK_sWB{*%_o!xQ~9c6rBWU< z^;t_1>(F5t{#Z^MbLvm}f!?EX(G79tlFV#>nyX8+ZJ!-5QIIAub(kM>x;u?DKk6nm zzMQq5E3{+(9xF2!%gl19euxMn#?co_shNX3_aeQ%l2TLpLDdrLXEBrGmnV0So72@ z`&wA@1XJjOIl|T`q-4AT2J8^bn0~m%$l%Ga#q2o%S@WlsrWF!O+#zJ~4#plBh{emt zPoI1Y3i%U9_quAXHp8so06Q=H9>S~$Aq%R{U`PqXOvU#Yf9zj*GrWNP^9258=P7P^ zhc!S}W&(V#?Em-dENSfa@7z}+85`?=kzbQ!YbAjB;k_~}uO{5mhh(UL$n%9^8i6u(YlRZAO&(7!#`<06tc`tGQKn;Coja*O;{HoZmRUl97lHaRY3Tc9rnj zSQhE60zU4amAPouMnSUywH+Hv?C+#wl=AVS&5xkl>B*TJ_v8cN^t+a|M>U7c#+DxqydLT56Bx# z|M7wS3xmi@O9}w&{}iWn(u$J2_$c#&8f|-$MX)Gqgn$dQBiyDnBe{PW9HA_Ao1-+G zfISrCze7_Ig__v$!XD#JZM=WpzWvCJuHrJO#WbK6VjpPZo2d;3fuuGZVMaRScJpfm zwsLeQqto2%G*Xyj455X^el7rGJsniil!H;p1Z~^>z&uUlJN^-*Gh)GDf%W{H&5@iA+|Pv**4Aub-{}_b(Ssf9D~5+9{ha0CDQ7^>}Oa zw@>E_Xb(2-6G5PdJUSg=3x*$xFt!_u1-5!j{41Y;zq;OZa3J}S7eq=bod@|kmhfp8(e4K4sEBP*DJ(+&Cdc1AYsYJ`rM!ap7da`Z6s~JcVcoXQ4`(ks- z)=X>izbKsUG7)3KCOG%S!z-bB;$!63o&b!m<_%*uydAt&!#{6~SHQm@2(G zqnf?)GUTh3T{0mf2TNn_Pp^2tgXQt!whL#=CVd6f$OS&Ax3TNl!r7w{*|l2^&~npSDlC5Moq zFn%Mi%)}Y0WjP0b0(1;s;uJTXGJxuD!+>dFi_VD8^yxIqT3a`>q?`2tyQp_U9p!Jy zJqldymt6Mo$|Wi?=~W^{Dmtlbwh0kQ8bwYK)o0X;4N+mtemeCE)o!l~DjN=?)=}-` z)LzL?q9ijoIXiAin@i#Io;zmJd>T|L0Wc%{lvp_JrHz|eg8|H*7Q0_}5t@fag5^Q&?)APxP8iGg2KZNa%#QugFNA3isUa^lHaq>Xq{dsr!ISB%`J-qqz z(Q!tbDAD!D>1}tyG@k$}rFY#6B)6x1?FXYk(C*gNjDt{4{j=9&Epe%Vod zT^KiWw!I1jS)6!Jrxiuf1KVcO827tW?1O0cyB2JsoSOsj*5wq#Y%XF^FSoUXUk5zh z3oWG6WAwc4Qwhh1-n{O;3D+aQT^(d_T|}ZTSY9Uh3nJa>CuW8-RDtX03{Y__A`|`# zL;CeU6VA!}JPSYoUZoFB^dh;-cIh+ALu~jk$j;-}< z;sr82g{ zOA@`ePi0*OfY&bo@$Y}|8U4+608Ke@fHkeYqs_mhS{GF<9I#X|yjhYvk~?bmE%ssy z#l_9l?ekfR&=3vftU@@FF7+zJFM-Z90Bt3rDzz#FPHJR<(IXALAR+Z4HY7cbxm@X3Wf*P_WhqD7`lk|A!yBSjA_kpQ83VqJQpL} z>1}!v{7)JzTdsu}5pmO`kAVEsDo^u7z1E6Ru`C_-GvmlYid*Yiw+qBJ<-;Kt+>R$WU;ag1F6jDCK8h~V{yK> z#k{;A%#mxQ#DpR2L5=oVS&=nb;s%;{Xs$eskqN@ZI=-`iTO8u5lsygKW!-&ac+tT; zu<)QPeCVN}Oga_uNK#!bCvUWi=AHju~^>#w<9HbBWov{t5_nti_|A z3ny+wezy^OvQ$K+)Jj`WNQ#vy;!mKk7%nlUE@Px7U0Lz4KXAdXhE&^5e-*LP3$a2ZlafH&;4@a0&$LCg`I%6M~{FDI+9D z+C-W2Vq!MRyw;sq)vP0guU(VJw-Yh5t#C3+9EMSepS4pfef8uRXvQ4``^p9xfxMfQ zG!X$h;}+CO^rWh`ihcUqZKmpwi(WW!ghhLttke{6`mhi1GM-k1OVZAMi>Xb?nB+~+ zH!WUPEDz`!61*kql@HTa-?1p00ETMDnT0CYuc)!3u2Ct{?#2?A!No&@qeKYS!pc)p zL;<@(Dr9Rqbu9)@Rb2*W3>TM!LM+c34BUq4tw7^e7C#!0XD#kM1#9i7izL85eq9;1 z#VJTzup+wGNM@Fl z%9-E5p0X1b<4A%_SyM?A3;GN4lSYS`2=T)=Q?_6|leGYcplpQ2khh@WsoEmrP&tC~ z_7IZ<_~Y%>`7eV?e!GO^3Bm8;W0A9u{{AYJU~7a!1LitTPw5J513A7OKU1^kdCli{ zlT|V6aDYtbvKQ`8CUc8YBk`oikuh%M7y!-_iy%*6_I|UDAGS??-!(Zv>hl!W}L05 z!_7~9O}joic}YeQ0d4UnI#{d$YX~qFB_qVEH@OpP{1)+-iI*<`QL?-Hu4 z_PWX3Q$eJ4WQ0(B)Pf&Y*NywqH(Peqg!Y{eHCzaTo6AUe5sqI zvGTDqnp<~7xTcib@i=C98o!8MaE^7cy*RCm*(_0;2H+{L5Pw5PguTmfhJwwL*P|Pb z0`jZM{+YSm4Mp>PdWpj>ty3~Lj+s>G_>`x2S{?2CRe~k&APSyQ%PQq3-+M1=iljy$ z(|Btjye2I>-|Awb7v8{h@?4PhQ&QnsEz@oGPI)Zru#Sn(Mt3OnXAc*}$K}24E8JB7 zrH$QW!QA#icF2Z;8_c4&8LsmD&5I@lyQ#fwUfCb7g+|&QMzCv?5p3mY4NSqMl+L~< zp0jiR5Yz=Z4`Alzo%t5fXG30hj9M_UXLy%jc8^rf9$Y2Q9vJnZKMd~1*eSQZku^jG zaJHhQ{s~C5Q7hu6q zYp82N+l;3$2P)(0i;W{D25XkpynxSez%r@|#OkEwmD4#nVrUK7dkaqD5Ka?rf1+d$ zkPpuYG)}61K{X;-l9oMjx!@M84NESp>F^3Y_M_W%Y>lHJB$N|d;^_=TALgrR>y1~; z(m&};4VYJbq1krA{XRjRsdFD-F4cQyQar(k&Z(Cw^;HU()?m3G+RL$l6y2io=$#=2 z(GF-g2oA_Xn>B-a3j8zClI3T?W=iWxgq^$8gYB%{D^t5bsxUJc$7O7+DLEKvL1HtB zK&eDKpH5D)LAesFS_}MJpH-Lh-8L-9J&pKJed}rV$^jWs?dgr3qV282yA~REc1@ihw zJDRPeD`q=n3dkbRQ#PX43ao(Bj=8+}l_ZFyY3~+x~ zq2B>2MAuZ)<-6w9s}4AvLNHZr4e9tXd`?>Hw6HS*sl*orugx?&1%oJ$!-yCK$&smq zgaarD*_Q+~iltDYMm}io%{vPZU_O*L!&5oD^EutQ5I&8TC~;O)^61%9A-EG7Tu#z9j;9TBd zW0rC8Ru4T-gyNO(UT@p~ltq7mLUki?^*2EGToIt!^FQD^{R=2aIM`T==o+gWV7 z;4tCQ5;vev9ldh!Q*cYxTrr`O zk!sMAO;vng?yc&1Y$7L>2}G&}D40=AC&ZIT=?3h1pOOvtV?EW79?{x7>Yv+*9-+@ctf*(Xab+bkHbeS95P` zmHyOdQuO6pWE>6++o-(yI$$GHr4Zxxqk|3pZn4QSQO5>ldt})d9u8Utjy=4{lZr7j ziX1VoQEn-t(p3LE@6j1pX_N#XZp}iUPJ~CZy3_j^U$B2n_ zC*?CZvB%17V5TLi#4@yq{mKjZ(Muqg<#Mv#{(MNQ5eKI~@d_G;^gQ(1DfSUp(O>;& zlnBfAGRALd;Z=OnqZV+>6?kLmo)9#cp5STn-!7{O;=aKkgFnFY(dM5J>hjVggh;#! zW>CPWGL^$9AxtV^{P|H;mmYcx%Dj!R#$H+?@)|PIwCB#=7NVniDvcgB6CQdYsF_IN z99@P^JZX4fruf28Uo?Sa9*SGyD&C~sDEtFJ|FdCYZum_2FZ+nW% zcG3%~X$&HWTLJyXsnk4lZ_H{?Uiz&t-Bk)D7=-DQ!*F~PhiHrYjtt^CfLLT?NFRxF zCq~M|h)uvC+UUgugzR}MPMix;87jx9WpchnoCx>rS6}6Cv2=wcsj-w@nU?$fEuy!Q zjUtk~C9<<3A<_zBNCA$siS{z_KjPZP%d6SYzGtbm<<2@(Ck$C=**JT|X`CpA;Eb8p zW;`grcb$SGh9PvApyl_5Dz(d#gHE?x6VXsGhy>Xtr6(J-qBz7Xm^xJ&s_K$cglDxR z=e0%Ag-@*ng@33A=NTSES|ki=DYHWMkxb$2C~XWChf{ClStsv67tlv>ruS+~WEOKe zSxlB49U#qC=BqSZ)YT|k?nj5Wzwq^jQ1J8(L-(f_WVrD|X9PzX(GPr10w?xvD%#;` z@yiI~f}#Kkn-`X(D+xoup;vz`;~KYYe9!M(%pDeO-b*XcdDPijO|Yrdi4Vj^|I@~J z&StL=w+58t2d`1m|Dv7Fq(rHYicYe|-x!JsT2fM+7}!2EEAS7m}?$L-Ym1=84j6vbWca1H$pJII6+4%yq;(358Z@Fe1VFO z4*%FcM&t0r5j4|xXz?$mUtE|T{#$||O<*!Oe6Qq~75Fdc2@3Y1)_qVg4-2^>7AHkk zJD?f{Q4V<2%nu$W%$c9Cz%lf1RQ-&@V{tY+yaPMV58r-4oNuTYZAZx5b%y?|QaxQB zWO}0uz$dElMYi6>#Gcq?ETreh{QmM*J%DM}`u|b(4q=vcYr1G;*tTukwr$%sGn`@D zwr$%H8MbZv#D8|(Tf3@Lb$W9>voRa%8RNq%;k=<+QzD9IibjA-qadC}*8}T-%*C6% z8T9O1xOYF1-<{sog#h*X7#5wL9S_| zw9VVnZxl7;T8+9-z1v?{|Jfk?!`=7M2n}ERhqsRl0KoS@?@j;9UH0#YfYZM&u}k%T z1w3xDPT3?}0+G*#=HnpD7n00V&a)EyF=y{pK_(lm;nAr^C&LE|L1-Wqcyl!*5=IC+qeZJ_*xL@Dq`vA`c z)8m|tMshJ9kN{&TVgG<#f!|@j{Eb5<%yc-2(Rnnek?FMOl8H8jg>A>F0GDQ@`5+J- zOP|Y5A6Pq^?!u2UpJ{$1f`lN0YycZYG>mZEIy!4i-cBi2jJzptw01g21Z^Fe=SyCU zQCyj(6ezWq;h)GsH&Iq;5xqa6olcJSTYoIJVy(v)%2DsqBOHdfh-0HEB7lli zW9ClMEu<)83A@ATq(7(ADyTf#CbcW{=VTMN~}zb>#>TaFtOa#o%E^57I?%FxlE z4F?!JyZ1=wKA1%A0G#jV&Yenm|;9J zNtjQIcNc|8`O8^3N|>EnJshk$_UOc1kB!88IIH*St5PXo#~EnkPEe{ojo1fj1aqngj zmV}_9JfZnv$&5P|wzWbem{N;H3o&C*5`^oH-cDI|2Vs+7pd?TyF9?{zPAjF}OE`i8 zVYg2iO1q1rop3|DRnWm&qTJ%7&h#h}lCDe_WtpC@#UDytN^+MPq(5!CpCaTf zGs~n@Wia~2LXIYx5y>4<6m=jmB!KGOBcitao%@u|}Zjayabj zK)A%IWU)l;_&)R|ipn;6W}&BKxAmOxSO!qyL9{mn)VEtz??$-oC2hm35~siF%h*h< zoekdrIyZ`USd#DO-8G|gF3e?Vzmj|U8tX+blfFA@t^%0#9)14p{gOKxar|jyeshB9 z2J=X%TkG}jw$%UgpP3k?K7u@Lu!PdPKrpkD=TXrAF!@fd=_j7_uQX zb)mpvyJUamT3F`j0ZcKe8Q)rx;hnI-eI-LQ`%aKVkOp zVbx(d6kOmC#jf>)wL^l@EDV|s7r-6xrJacbk1t3ygUsXVgJ=dP5Yxx}wJfANn(UC0 zeWEGNejDNG7W+rxUdZJ=#BId*QzL6RBvy$i$ks&f5orWzsZy_p=WDCu90H7iIh1lI zUWzFET~vTg;0_|9NX$bv;$kG%S|Ar8pe-hltp;Y0z5~~tf($}~D=Z=(Ut9#@kh~)w z9v8Bp33oJdNi-sk;ltO_tCC#?{*=?4cjzREru0;eVQST{dH**8{Xb;`uRI#E;|B?? z{h2ET{~yc7f5VdhqjGd5Zp$JGAP@IgP*_P(fWN>gD}ULb8Ka2wv1)@e{K14V^@dnriKnfN{EKnofLf7jRBgkF_A)t{UA>F#T%H%la>PdTb?Y{Q? z0@R0gLln>Fi$;YuN0-JA_k|IH7|g8@;QR$NaAqYupaN5XDGjsCtZiog97NUDM6E5y z`LzGe1Z^Fi=dxDEle7NC*iugT^mSYljPp6d74ml>V2H=gUyX8})&n~0-s%H{t)jbe zQsauJAPriGn@o!JxuRPC=8UQS9;C#&+HnT$s-oVc`nKO`rf!Px*+X|tWI?Y6+)2~L z6Mu;*s-D73GzcoLCO9LFFyN@Nv50R7esN&}T4q5uPJQjDhz3`6!ef{AwzG(^Q=MCT z@bI3iVD){ z8yUMoF0l(K=R%k;xS%#UUt+ZCam9i1j(~M#4SN$26&78y%VBzAN7+T1KVFKLt}}C3 z^ySg`VGZml!f3J#nUzee1EUU^RfEIvKQ;}R!wIdy>k`uX@dgj>Q2L`^6Jzr%_B+*L zuPh2T7{gfPs7Zn};1Vt%it`Lk?_?P4trcH2ir*%Uibc9ep=3h8rG1EX@C?!4q|O-{ z6N7q2^+3DE#y#6%|Jaj<8r*?od-i8ME2wSOQigW%j=b%x6#6@#hS*3&90kE)bp+bEF!JW9^b5 zl_l&}$c9rYs1U($1WzE&=p|;;d>+|Pbs*y3eE$ub`Nx#O;{g6wJM<49 zn;HOs{r~Z3$o$_?@n5afl!lkL@({|GY<)(CwXI+_zxy9y!VENoSTjLCP} zB-&LHYT^z9Hz0_lJ*29oH_N7GRjsC?wa|cg_%d@mL#rmarYf5%RjrCe-bT#|RL|)y zwy~>CtcH%Un#(T-)1!^F>r4(O)9K9B5jk#m=w5Ek-Cj*>Ngqf;F~J|g-8hJMN+5hrx$>C7FKq!O*yQn|2-&JPkwCH*?6*)LJ8UjaSE`*trKv24g6L^v+)T77&)-eR0zQhgneTS_;)1XL#w?m9SA+5EHT z&o-4cM6;TLqE*{y&~4s%rfOm>Bf4t|Pk(pa5}uGQs(95(LSq|zJFHSF@&^vBYRn-) zI=i1F1uf5MaYE^>d@_0(3@fP6?|?lyxhR`E)?9%2jVqa=mK$AdAVL7En`c9|XyJ&eBcbX@t#4Mdb9(~Oek(X>xsA0io?D%`1b^gT zgtz8q6u_gi^YxFy__nxJEFSu(YfDC$@YRiIWb=|3mO zc87o%sGoOr3TZQb@^F6J4t%Ah)}a`Rf5urx&$!^a%dq$^oEoNPnN zlCziD@ANT!+evZhl1@Q;3L^9sS{CZCd6pt^!>$uJk%z-EFv3HavKm!04RvZ~nIWnm z<&>7zvatuIkIuGG@~Tg)kj=hA&cFPK4e0u*?G#I15`$bJJhFU>AjM7y?P?vsM(invMQWs-^IZ>m^A)AZ$yc!;1 zNu(f(fY#cq@kOasSPmxo6=o~jQ!i@f7_LoltzZIVse;v4Y0})ROtV123uN30RjUiA zsKIel$5Sjg9^5j4-qPbPI~$(u+=o|=Ur7|zWv;YND>NM?y5Ef`L!9SgB?ijC1eI5v9DN`{xo(sjj}oqLa<(WLwq%JFp>lcJ`%e>yiWI3WxR-6 z)^FIgNzH-k5RTU1VLwt3NhMu4VF(r^sLkQp34>jvsEj#EhxV*UqUh8)T$1TTImuKp zPqIY91{I~unR7~YOk#*KNxn?dWble9lv0^9@Cb2Q`e0PSfon?1f;a0&f|-OmPq-yP zNmEQh`GZQz4s+Z_jFy^J-30@70e7gDD~sF-T5_r>Yl(}%c&I&w&Ra4(T5g|wW;@%uZrcxfC#c}ZEG|e%XJz!{JYeX_b>&yT>n&3p^fBC+%7rvV8`6F^e=u_c$FRcA*2noGq(z^gO6oZ-arQsX_5ra86>e9v8QKwgZ>d8&pfO3#!MvFBEwD~I5mvP9Q9PF{OZ=l8-J zJo2->C0v5>%#P*o2$))Yf7A|85%|gA@9fcEMvhv6e*O(0yGoRw@2^+laYWmB8O~-& z1vNM8`r=a)1rF@+3I*I6{BsrPFaK4uegw&C=^t-4xITNdfElMT9D7D_xwg(M)Pi;0 z_2$(?L1Rcq5q|jFdRY3e5e++yFlezp4`%BYI6j0KfgJ6z_Dq5oM+)m0Tw}ZvaFsQ~ zS|+(U$uXqn*lB>O<8W?LCiBlvn8+TL0lQBpa*lvXUgKwiV|vH7I5+fHFpP{H zqjuyp=^0ZWSpiH_dn-~$g+F8D!_Jv~O(3aLUE{TYPIZt_tC)DETGo535yQSh`-DsE zVH1tWK&sdRd0h?&L~c%);Ak~E|T(ME!}%J+`zX>)!>JBso ztj)#_$y2tVdt$(KZJ?J+ZJI#)M1!rhSz}cQjK?%6;fe@AP2}{0gEa4t8V>(W2Grs! zX1EcM=_GGL>ECaw#2nyeMa@Z}3fL+m%_F5(g3I9Fy({zy;}od?J5I z?SB$%W;pKRK8`WU*#!;`i75W_Bw?zx+4t0%z=5`FSn)M>^yTLC?Um{j#?n2t@y&bX z7t4`ySFZlhlJWlR^i4F`hW%dkR+9RTxBmslbPTC&v8c!J?3ehCXEse{pEUQ)T+l=K zsU&s91mhk6#yyr$(z(#{k=uH5%oq^jNotF z{hpaeq)5N{$Zw3{9tbw9mviV3CG@H4eKf`|i~7wpqL&8NG>}*r$kjL@$YOV&1%BX5Hi!YB{VsRi&@g^7j!h zODRay9FttESFBJkTT~xBWYk0|Q*I(>Nm^{RGVdGU8PB5|*4B;mKqN~gvSQ#{D`2g! zG}R58x=^4wN_t_0dVz#RZ^(k3zmjG2-`E8r6-hlXeN*w)xt2s@2)F*zVp4-ACR&yV z#Lfg!?*T1(2Y_l0ozYhdqn|fiiv|4-fNBwm92m#=dk9mA0eu`G**sD?Fpl$g5hl@; zej!Y*qER8L^$nl;zMvrgga;26_oHMwB3>Uti~ zthjun{j9$Omn0H=r#G=&Q%odTlVtO8LY%HRj^AH0XI?X%=tAM>I^AGv8V}LJjyt^^*-6p+k+$CgDIFPSZ;H5sgq@ zAQkItkyq-us`NKvOxUS$V#wLgMjqMmBaD1EV!#d-)Qb87=XYA2J;YJrCXR?8aaC?w z14@9)sfkR^>U@bz(#8h6bhJPQW&J_2#)3@FAv*M8ieRo^W^b>yzeql?{Ko_1Qf)PO z-d0l6(3^o#-D1x6J*C!IjcB->t%8Vb01pkE*z?v;6A5Bz8_lnyiT7!Q+D)*^h<@Cx zN^v=iNswq1HkZJrgd2x=IZYd#$E7)B+9tD^LVhDH) zjd$PHrh+W&P|2(8PS9?gNehBnYuBaGyG~znK4n#bhB&gJ@&zNF-}p%jrnR z)qM&?hAlRS&Pmcjvl~>0t_BG&gHK*Q>KAz@JX}l!wMm0l(jte@ z2PSb)_ljTl*)nb@Nnas}+diFSS4&DJ+P!sLGeRS^ZMN=u@HI)h!pFJ+eXid4Y;y8N z(Ileogjm&5y^dlGUdOoc8mHyQRH(MZYFsSMRJNK(-!Ro4nB)#V@7p==U5mA;_WbS| z_^-{3fUpy}a;=7GqI%VDQxIO!M2Ef^K3M#3soH5?Y7ouLZ$cAJl?PW$$0JJCYBBI4 z4lAPNm%gpEX%DXY2#tSsmEEGCwq7jO-F6B(=}!y5;ztsDk$B}7@ggj-m&_y)~o zSvP|#AvUT=lr%Gi(vw6?uP1GfFV*Trupr2i=)?(rLKXu$!H#?UqVkNV8K4 zyK@bpY?W^E!&7eR14>jn1C%IrhgyKs!!>14u<9i6l_L#_gO-)Ou}WSLl23c!mC=9hO|=QSLnsI+!@oOF=#;E6mOb)+c`4F45gxH zU~t++>O2{f){?~0Da<58NNNYuLenO*3#OCK`Y}4BayhwnX-StZiHFp>YV_}+ln+KF zbf;M-4fpqN1qAFD9oZa3*KA-wbgI`*)mg1qXbFR3x;!&ElK-N$i)(SEc^sXxXkmIN zrTU3T<2iXcHl^er$)r0ZA#9!%+wuVTov7)qVLKXD zj}TEe2GZoO%I&)GN6bQHygiVhlP8bjMJQs|3u?+N?P1yp|n7gEPu2rgz)x3Rtjo8(xbD3|7>-@%JR|H%Mn>3cJlGJ&mW5#H|8zd&tl~d$vQJ&>oV-yAP3#Om3WFex(Km8}cikeAni$#O^Ex4AmZ(5Ad6Y`WnA%_5FvAuWh>PTpN0&p5)PvsZfZ^(o z*-;+gpLYg`&k({tAU6ETD7s3>GmuV>pJxOziIZk}hZ`PzVc}}8A-c!p_DsGy1D46t zmo;Q>P~MHYW&Ea>-ra%lZcr#8YJ^rntn+`5wFTI?94m|uhs()#OP4vR>2s;+g9Yax zM2MEXsHZ3_B<_?iEaX3Nl=Q`D*JN2=3O<{7ehxmK8C0OT=@c(}RWGNkv}deSoELq7 z)#$b98Z^JzUz>RPoOnJi*tRqX6fLh;<9f9k*`C;NwrnZ2Z)xpU-FAjG7h_(psp^sM zOn{d$ADoRUq|)VP!h(7eQ2aTK9_cjP+XLgM2fr%>;1vYu*-!pLC-}&Ad;wDWj_Y`q zJL%17W8o#7^K(gN0+<0Qg#-DWIyoEII$Qih!vBwkW=Q2<%(?|z4J|cZ zK?Mc=Sh#gSoe#jmrZE0Ua!YBHK)U}Q_J}&Eup=GjGw>b~wjd0+bmm*ny@U&NUDoGKVIJ6n20&qLdwi7wB&wHWD}3z>+CV zRgP2r@gb!aDj~8Si$XErnrFPGreUnDfDT2aUT|nTt+p>9C7juN>QeKe<6~&tro-HD zsJ^#UNjC}2^YX~z+w+`C3h@o*f-@%>fS;PEAKOf)LC*%|sh<$3$ggo2L3!E_&#SrL z6B=QBM0E2INGI9cEQR#xTR%--8D+kwg%}rnE~8~Jm%7q)B^8ritDjG_jV8zxucjx5 zQVnBwp_WqGC{=;%@1BAJ)!6G)hQz1mmSbMQ+Ms3wZ<-`srLHwhvJ9EMuUBLd#^1^_ z)&*WMR%-i}C^d`vaHUvZ7G}B-nUl})Dc zfQrUE>CZ0Pl8hsCb&Z@yI1y`O<78%>&85s&bUT+Ut+e7>91xw>sz+~e`iis2+|Ig^ zt(y{B!IEO|G&7VD?4sbzBp}6TZYX{&7b@IBtvz$%l&i!L2Mtf8c`!)d3{|BgG1;gt z4n22U<6kIw{K?Q*5ICIWEE6;fGPHm(<@NDu5M&`8U+6}sQT)L%n^qoJ)Qq56Mf3qX zj#bal511Ex%EQl22JRMHIWi|EuG=W9YS+Z|h&s+nSh4TYC}Sf<=B$9a9|K*sbvTxRYos}`#CHwj~U z;7D*0wT*iP^!0lhHYps5Qv0U!`@#+LbWMlxWUE%YP3f1}I!91t*B6;kYTG5pHo~lL zCvhKwL)i@W14BxzAsu+pd zrwczD%b#gaQt>JIVQ1&hW4PVz@xO&jnVhc;G}f@Cu2|BJ!M+I2v2ewXJAG!(F8}E> zEiLzH*s9!1xJ#vBs9uYoS8-mQAPP!xurU?Ta-*?WT!?ljG_u+><}GRnv%rk>;hDUX zvgOn^g^ZT4X!Z2<@eIVR+9`mK(7>K^@YzEPfNi&TU?>xNTJ)#J6oyKuqXc82nNqG= zh(2q>raNaxJ|A?d`_$_^o_BN}yJXw+w;YwPoi5CHo;RFvtrc@K@HxU^D2c+TjhbS; z&=EQ>kjT4h116Q#rnq=G91wTN2zD#{1p(?b<>CkAiayD@_yV(HLceW2Ga_VTKJ#*2 zP>1surLuMkf2nkt6%<;N-%nH%W5Zt+V6bC0vb&BbTe!>(>*oJ72Fq z03JMSAN?*kH!*fFL%-NB-Vm~&{hLI4z-$CjgLr$$Y@}g)S#}tvAUbfre(K517iJ4? zxf!&Z>#grs66~HJlef?CZna!E2f*hwsB`#LY=7SseC!|@LF@C{wWZttb_Scs_XPNV zRLlQ(l~MiACF|eu$0P+Axql2(f(46y=LX=3Au{juk!o}6cgDu1;^We9v|J`2PgGm9 z1oa$_4F>Y{;+c3Cfpwuj-kF-Y9hq!(KgTSy0RUyPljoZh*zC^^$3+?WuSH6~G0%_B z4%2rjgzqU3Cj=q-->H-eI?>2qJRSosiGvZ(rUr!~&67Y{1H5ET zV_lFn?Vl`cJPGI^B&@6k@2Cg>FICo1)octyNuul)(ZD<3>o1=W64_jIaTC!n|IBil zncU!VT9|~s;xn7>diL(Q{>-}0JjgKPdj}!3-0jkBPv@;!K=x8R8CZ6HYfq6p#oBvhlRD9QaE9>7=qAF=QIN{X_q&^SJN43i z@q3!*e#>)zL8If5;zJzhfs8yJyy-;$l7Z%1IwjkCE(y5oIe!R{rSr6);L(t#3)@Z^ zx@jMbbkp>NuH$&*rgll&*a>j?312z&H>6Zxw90=W?6JHR=M_9oNk7TwPP?B>d zZuLcq4QCA^%o`*vZt6}uA%RbP1Hcg6-5#-^2+A_97jA0y6^g|1{{N zz=Z%E;mY41Nlo{0;n;2Y8Fq{mIg9JRfS0V{BBj^|bElJ}i@*XQ>hyP3*wq`4{$wO- z$^X)X8wAS_4R-Na0E8AZBF)lWmuSNtVRjm*)?i|6_5j?WNI9|2~R$FFYLW!L^9 zo^~3pFKoe!RPse^T}g+^gNO++Y>e&Ef{OziO(r-eu6+#Ul0Bmw7q3sAh|Z$(_4TbM zVM@pmR00fafjD1yS_Dc0R%=KPpZz;^>n}HLKl3_4nuShE*0I~9bg~??iQ_08;=}@E z(-2sI7((*$5ux4^B$)sqwe9(zkbzpt_$GkDR3=5=y3Cd` zK?G%_RR|kO*Uh@cuvU_( zR*>-OJCD-f6k3ieCiSB>9;+x4z;NM)scg~_c3NM;HmX~jbD2~DSq^4j!k4PUS-a-B z@B=L`%?EPE_piw(z?=naapOiS#~EuvU@gF*LPq}fzr=AsQcOB1Tzkewtztw6`uGWk z%$w}wyuOr+Oj#5pY*OXMI(4(G2v-r;tpZZpxbonK*WniRZo*d}*%fi;pug}BR1o3E!tX(HRfC=Y_9DnhWLEXK&<*gl3 z;wgUz2FaiPZOB8G>&o`xy1@UX)B~DUR#;}AUMH6OTSKOJA%b21GN~%Bn{72gJKl(F z)_*_@;P@gnzS7r}Q%dM8qnmbYV1b_+U0I55qM+JrKKh_$JhDnJMDE}=myZ(x3)VGc zP-md>Z;OhcZ6K({9}C;|sl@Fe1E8GN@m!q0Gk;Uj)B@4$o2FSn=?Z~3)i68%pkZlG zNTsSCoqzdDmIsdUx@zqKau=_<(bEH~qvXo^& z?B3``IOmni!-;?qRw8>Zjb<96_%2KyIl#KH6nylpkFSk|__qmEuit9WoKV8N@l|^x(|??bQyhz~|E<7) zg;H!c&83ujWV}s5Ld1h?b9UB*-fa?+5#O!u%#I#2K!i$|BDZ0J?nQL!#f$ut4G*@f z|1N>|$dDMXA+~rChX$b^MtK%J3g)${tin2iUAuM9;IZa3+MeNb9qqG8pIUWRzX!mZ|2b5QkHJ2K&aZ!7Hoqo569kpCQegHE0;!YpX)j8)dkXd}=UptHokd|}I(I*g-G<^&hDqfy`)ef3= zgdqxqf|Pf%}C5JsEZTlhfa^6<-~*gC>=?_9fBe%vP2=Q zoFFc!)7pIG8K^IoWx}V^OKR{zF8#O229RT9ArQyIb$C}m+dO=m*|ns1`qo*0gm#7- zI~O)`R07inN@+QR^LSkYl}tVhN06|lp!at_JlV;oDOOHo7avxA@dS zUPT!AdY8G%E!S_dC|5Xe^=JS@-Jn@x{Oj%$)b(B zvh5^^x##-E(~678$`yoXo(&rxR641(&CGVbg-Dch`(A-i_uLqVF9M3o+~i>CYCyJO z_2xlvt11cC(~w-cq>~Jkpwg=Yzmz<_ejj~tVco@-+r;&lS6?U61{OohU zxzEm9-f1f?h+1YV=Q8oqUEE@%`0e_ z-<1ZxoD!CgSokr4n#3#QA4jImeBiahacPk*#8NG5DHx$IX_K6x7b1LKv4+!EV*`p` zfE4b$gA1wi9`0y?4BZ*cfI5;Dacw|eqhgVLbELO{jt*>D~VBAdp zeS@^)UBH5ETl`$iiNs{o<@>!S(XRYU{mG_Vq`HS{XybCw+a`T!{KJ*r4=r`u!tARX z*+~hBUXN8Gg@e9Fth(p@BfUmyK{IU|?g$U`9_(`RdTa^%(5wsSUhLqlho|QVYrawS zNF0zCq_zG;&{uX^5h0#841<# zkje2IP|5*~g9nbzF1QR&R+|auMokJ2=0NBwXuInYxRPc}rtG6U$rNy?=A0X~cPwKC zjikIl)|?GZ6pyB}LRj5g?j3pb@+rr9$_jdOD*kT8Dr_$F`i0#6FsBgy1&9UK*%e9kd{r$m)7E0>MErH{e*wf4Mblgv(&BW zQ9%usNB)_wjt9n50k$!OLJQ_t2(nuEt4ehh1RqF0z@kdE70ydBwyi9Eqep8cjQaf< zzq5<%*TVGeVqr=3P5%<(@Ar55yEX8OSA(?v1up>@FGu1V=I5PXqt;s0j$cOBH<@Yp zXcVmaHOP`qZ~J=m;wmfzkw%`Bzpk*VdX$Z1)Dq?^s_7D8TgLgMKU?DGYx7UM*9O@eVBCI4{3u;?h8ah0~#3 z$({E6h|R(LtAa4z$!VgWSJXeIl=1|M?T31nQ!oVZvxsk8I+SfUod&e?z-r%?81l_? zi~D48b#VDVlTt ziL=IK@Nz;k!tUtysNo^#<8veD-|XW5nf|S1PcK`4RxnsU$N}sBa{B)#3g;go{=Y2% zl-FgE6p(dFkc**J_&ayIv_2eb>w~5MGF4j{`%JH z>@r36S*~9;b-XWbu&9)rQMcDRiw1gz+ zxE{wj^psAV5Oqk4t`N*NktmcZW?OB@l{zeE{LIB?QrxzXmGLAo6IumaJ(3h84s`C= zs({m~G>d%N%cF^GdZf?dVlasVumW4zoQrg|BF4e zOhwMQUR|cE+4tf)^ONj4xnoY>ZE<;|C<=WbfOl4Nu27hN;(&Alq1Sqd9$Yja0FQ1bdcawH7to9i zWeLYR5?*OD5{vg_+6PH-2I5vp(WCFx-6*4p6lX^kA0S7D$5L3*qD0SL^m4Ou9@-dK z*Dc66kdy_uKFpH6SAUc^FS*b@rgdYBvlaR>iKkt}y)Jlc;=Iqzi8ZT1Jlo%4<$eH# z2=$sX+nsMh*CVD!7}?Hmi9c|{TYO@6f#2SrxW_haWsEfV!2H5!3{~IgCw7Ok&~lX} z&WGAh$GYP~EO)ac^fJo3Cc9S>512yEd86C+D7w)k8VuopsE7Y0y5g^uN9VuZDx??E z_H}!E0T+RdkA-rxT|qzl-uX=TpPR6MU;zNXt1!7A#cBGFM&f?~3;f?rn4pE3#1A51 zX5#ptry)z#%IznAXEQ;JOajcpqO?X2p6}OBIDpVw z4?r(_f@pf(xLeDBwNrLl!NJo_=#B`8#9T+aWSO)n?006?du!UdxmD^>dPMUfX1GcA zG?6PE+1`Mx-+?5!v|`^y$Dma+1yl-WJDeW*7kgymM83wA;^w&1D8){}w-@@Z%7R|L zy3`Sq0rp3XKAIe6?3Nl$?HI0i-XN&^60dRn_-?1c%Qoq{sBiI-S-4ZPnfr*%#g_Lj zvf_UpGD!MuC#^y>)iqNUsvH;!62x3JL`_K!&SicAe1az{YjGAeHD;Oa^WDc-qogI+ z4MmwGF#<~~NRiFOy<&rTY;_f3Aj*_^!t*W4(g@Dl#M2Y$xoy7Y$t-VPNaPF^8TsK3zYCKlN#b>Gv+`+D{^mF1KX?X}bS?|82+t|2 zW$t7TV@olOKk(9C@GksS5x9*mEPmnMcYa8pZL%8lW_Zk%hbc$a+D%n`4xG2Kj#}b0 zN}JFeo4FBoEh?quOt)BJ)J?eM3{$0}gUI@EV4WJk+JSH${gIw< z{kZ4rI+L%AnDS-pv*+cak)b@~>Gc7CqGW;=N!F{5B6o%wfLz~CHl)Vh`Uk*ybj2Wh zN6H~*8Woq^lm$r>tx(CxVYG9yFePAVz^QB|RKRPPDm2-Q*OyD+ zL}`;L=OU5an>8#1Hw^f!Ds;<{Tv$DjT3$`Ss8;U`d>e>lPuWc1W(dxHdHAwJ%R>g~$Sh zp1ik*_V}+1m&tV5WG>ov%-B75*u+o#S#uTFMm1hwUJHc(oGWQMXDzILr~&^JCW4TQ zx5-Cc31cU@{e}0Ub z6K=%om=OalVhd_deYXl~A3Dn05`A6*qQPCgoV`Xqd?bkW~)Vy4}_gM-z~z z+%Xb(Sxzc*Pw^{nSk2$i9AP-NWZ8qXEeYa=E$bH5)*eWN##$$97DZpA)?!!)GHvO4 z#pU}#c{3o@d#77f{~qc0Ps3v82F$+kV{w8H^}jM0{Eti8*1+-K@QN%|9W^91oFTw*QFVdYR%GwJrowSot z;JhPf2oFRR1^^r|9vgq{q4X@t_2ma_pe@jc|AY{Vs(2USr{m$`6~%j&Pe|uqGd(u@>bA zZ|9&NqBO9V}D{xdD1!%aXz694*F$v&JvVi<`?hxOw1A@x}Ei93)GWuYmu{*gxrcL+|( zWuj4L`39TKNnOn-qxP!woV(6chKsCRiR#4!L!Q!}rs>OO;ZMWx$TGFSTJWc`_qeUSi>C+8NRur|M+U z0g{Gt*kxlVDB8_lQQ-KtSz{*?^{6u3i?e&UFq{JC`Idi(jT6^UbBG8B)Kodqc`~3q zbAf?w3C&quUHMjB3`2_28YjyhS({f9!qHBQ7=?^PEjfV}xrJS2)@c;fkxA0DNbt%P znB{tQh*Btp9BRNNYB9c{vmC!|q#OB3J$|I_yw$P<-~*$7?|Vk!lzsd(x0UoQ^y;YO zeqhy`Hf2Tzts(H$-vI@HWuX5dHFE2r5L|TN4FaT!wuC~W(IhZ;M>RgIfWL!harW@!Zae$>S z9@Ch``AQ2zbA#9}AfvX?G%&`h4I<4L6+iI#0K&5u@-s`f@PMh;=IYM_S+6Q*>E8)4 zFSx5?*4D35V*^kb1UTa;iNxM?B;1d?}?IB{pZ9DHXXyP^VRADLx zr*)xG)Gfy2y%IyA`(}CFuo~mcv?#JkI08W)!t%P4IU{6wKF{&s%rs7?&$4W9poy1} zG%YxO4zGYf$>&0QZ%I18bO~DlC|Q)ii;v`$L(uL#qj+H^aramB^*}Z#jQU2m@YNk= zg2XLezWF{#GtUi$c!Ej}=4^6q$ohuyQH4AlGOtyxe4wt%9dpihxtstP!-1f{RJSC+ zldd^}jwhvky{H9PmWx7w*x9x}X@?fPrz|{tUMF7o;S=h=DeXUKIWEgqi|~V%%0Gcn z%>U_lXKQO^tp9J*UAD?!MNDNRZreoTL}MTT3C-S$rIzDRW2hku7z0E+W;8KtK#eNJ z)H*uJ0h((YxKG)SW7H$4m~{)zLdKY#tlL@ji6%JleuqJjDkZQ%y=HKG<8|M45u1aoHx{29}^Cmqy}^fP5=Y7XjCo+uiWb_ zo7PEyG>eCtj5WWYAxu>oDVe4a((?aUtQ{+OdQLfE4r@dbjF+6TYRPowjO7q`2D}&- z9@&$}|7q!?6Bd`vPp)_m(qM8CvR=du(MdS@!_u=(-)`gD0ENV16klWD26K{c&S;cF zIqS6PM;ZqLA_={&A-63tyP`%i!6|8QoHJt=($o^AEoh7WRHE~&J+V!s6OC`~wl^H` zg(%6=6>)WMOsok{pggjDcoBRF=sb6GoYmrne>Cuh@aIGD91P3G&WkfX1oVsS0AlShR*1SDC$_ zZC3Z#6?OGR7w;m%JkwR_DG!vk&E);bYj!)<52@Um9qiOW2t86@mC275k?y4<5=bdj zwGj0-PUGT_)e&2G;8Hln)Ap4Alei_>tl``v2Aab)WiGE8v2^qb))(wl+<71X#;h0Y zDqo`cXCD83zS-;kw5zC41*#@(EoCnrIrPi%Sg6hqqC@!o6eC7I2s1KAq^;Eq=g_8* z9VT4!7qqGQBStk*#?q!@-R5d-oKFez06T`K8R#^j_)a|BcS0Dzt!UUM5`PSW!-M*$ z8xp(7D82vg=mpcg+0H4eSi&`rhd|6?UppTzpMOybQkPV|>Wzgc1xisuVL8pbTYL*T zo^8;m|0ZpmPzz4Hbht^UR~ohOnoj8~F(e2EssK#7C6>_qky%#&tH7xe_!aCtF(~4D z99ZI<(VIR)bs3&uzLo1(2{6+NKynUPx40pWZOE)8J`?g{@!&IjEVfWZ2E6iEoQLf# zMvcKo7d*ZDi_}Rcb}-biIGdRSJ!|q6|n$sb|cdJtS{j6 zdTr(UVqu~>p_F|I1m{!gw@1+J--)%MF1Rx%J)u~zY#H{ zcfM*FP0LAUyQQA#6rA95M<~?4ddgS;)Z?20EK~shhJ}C~$AlZ&UAvk+@5{z}M4|ac zg^##3ec(ULpBcHS7EyitFOa!CRL(2>vD0n*P_q9Z%JE;6>>nSUzPZi+7@Jc(9T!B9 zhGGp6c?opLi<5376eBL>l1PJzfcJysLiIw|i;&hCEJdA>jm$+<(B@^Arkk#%zE8n+ z1)V+qYOoj?!ZeI9iawpY#<)CR*L+<6@%;j!3sqIm8ZiOQ-IvGMF_9lcnJ`STP9dct zPGOk%J)xNLSB-*7ImMK!lWM1tYewM^mWo!vExkV$<3Y8i)zmt|WA`-_1EuvsXW>J* z32?%9!)el6-goOx%TX4%z@*cYWZ@WvIeB{{g*mEbwFbM&qRkLGIc{SqPOB6YrnJ?1 zg#w$&GDR1eIaEWTK>1Nevj%ivRCsWO`%fZ;_%(cbRjYr96SkybOw`OkklRu*DcEd(rvZiCr4xIefdx|AD^uzF$WK#*N8dS9ssD+#JVyvGi2! zF$<9vi7t2TPKJMl!zMGri@2Z*iG7Gu>7HW<(TZ57*AzpY_@D@tHfhlzTp zCKMe?#F%YkWMXTjg*nUGk!@p`uEn5@C6nM~iE1?(rqYHr`2O~Bjg%65mggL)jBYX^ zHGYXMP*SG4pZ7B5!+0_S)q`fdO}fQk@(!E6#C2Trh$ryuGBPdj%;bjTsk-EOSi=#E zgUj$b-+2ZG7~8>zwa|c73m)rbu^dsPMnn5Jk;cL4uB`Gc1$q7NZ#kr;iyEa=(7*SP z&i2mk%-ffdDUW^msnu>^K3nTeuX?z=2_BK6`3H_4MF)&pvwlcE%eTljr*v@(@gq$! znJ*e6)M-?VRE<=QRQFU+RFNDu2bkEdcB#hVBMd4|QhSmq7f##1xlA|+z_4q)I%gxT zeZp7`91^zYPtJCJb@#floNj;+nLE%ZOaOn58wT<4v3#>OeLU!*y$a5!ipk>79Wb_~ zE!v^09&S~(p}divN+?DRy6r#b*ekI}$Lk~L{&FfNhpJsUn^vz8L9?TV7CZSK6vGr} zKH`~EYWaGANcIt9T59Fxu9%MvD+z|1Pux>7O3N|(38NP7Hy;z)HAnWPx=jb?D%{^d z$c^r8r1%orcjV^6k0idWw2mrw6aUGLnlD|SRqmp?4fZ)>U1uxb=S0xGOy$`cCP(&_ zV6(0Q|7eO(1uvyW^UsyPHAT>cyd~G@5$}i*|Cm2wnXU-YW|$q08O2q-J!y*htDoGn zQ>shoW@i$e(}1#G8}u~CrF@0BvY ze8S^Q?$V{%lS%33+doslG6uhvW>i8mag#AjGfp#{ zMX!Jc4MZQ|su|SpJI)`dgCkTk@~@opJ#$T@+I=l1bG8dKDc~CVLl*l&dXNz`DrC}x zw`W#kq_VJ3aRqK!UQuegG@oUSan^8NrkEiwgK45(^e!x3S>ciMrj4Kx()c=N)su!k z86~lrlBtZk?~sua-5Yin_^Y9 zLNCMe91noNa?B)nh+3i8Pf?-BF*RBvp|2s}(tHHFS6a0$>?nhVkTABioGK+*6k2w| zU@pIT1Kr6&Yt$ui@G-6ykiZPB|9Dnm4W-$C+iWbVG=Z}0p8;+?SFr}vQO=Pek511# zaEl`WPRdDQ20K;rD&0p>E|P0b1vx>Up*|2_r$3pm9kS%k>y~+r&c0AKJLfJF_klQ?;Fs1eFY zcFOdV=-shAUQ=(ZZaK(++RWfS0)ah4l|0y0nEn%V$BbT^7`#6oP@(A1L~;R5B{db1 zurPG8!Bx1JCVZi4&(@c{I+n5x9L_>Be)EV>ulmb-iEijA; zX|r1rz&PAW+r+z)+n+^1j71?=Tg&y2^i@+qxafg z4%XT$ovL_&e6}2V++vqSc!7H^RQkB4{iH^>0uM)ts<@M3O{>#rbY;qM*pZ}_BHfvI z3jx;ibP-`ksnymP4U4_mQUq^XP1!D4H~;gTWCMhCmiywy*y~kG=m*PLE4EGMu0TNx zGQtYzULwiW`9_LtDYm;+rGX51Xh_ejK$!$0zSonGGw*KEsjkvEYy*MOT zcCKc5-SlS9l0i-bEGD*ZG`%zk^U9m62~#^@t0&-&HQbgVwgGgp0)~t&z-y^>=!8Zd zqsF*JER#cVcc+?`&4{j*5_#wgXwIpjbjKe2wJ^Sokv><>MI3)bm>eh{Q497o%R7@O zAHFGFZ%F%zuEtuI5lk>&Jl%gYI9c%_bLz?U%)CP&{b*xX_BPFq+bCS7p_g2-P&}Uf z&JkY>yBL3>uau5l>j?c@bZ<|wM%C6R2YW3z25*DGeR6(&NScE^CbPg7Y%>EwU153-RJ93SrUqtKu#T*|hr% zeEf8;EVsU)R;<5r0&MP=89|_1PX&4skQMZ17?K%BQfcS|@w05#v;AQjw~C8R zIPuKU2|?I8zZ7-)Gtc(3I*LlhE952IQ-qS9s(!#V#APH{+YpE0D+m6wEV_+l|7 zTTkjBW=QCcYg*{SLj8|4Gi!pT_9SsMYdJ^BQm3+hbZvR_FqNY??L4}COL+cKfQr4- zLY?uUG16&%i<F`vA@@$CnbHRnPrvNyG8-_4Q zwOOLw{@A%r*mY{3Gbk}g!<2OjUHjC4!q3S z<0%d?0ZW*k`gWv|s^{3Cns2)}^JlCHgC-u9bN02vSpjGD;BiSL1{_Xre^vT zBrBK_Wp%Jvrq&6h!mMG6iXmX(#IvR}8R_la+mda+>(y<~e)6A~FIIm=ug<4i zWSovx&R1;vWyiZ9hwyHI1_4l^`dm@fK{t#_Wj}`)eK)3DVn{ZDp z;IkGAboIZ5*|ny9mOj)LEmbVs&gN&;Q4dpZ%o4bu5H z_pgyxOh8395qVhK{0F?NzXAW7=Kh1FvV~(~i$7S(^Mj@T>4Joam94(hzeB0EBBn8t z4+{|$#Dplh65knVHU4Tzv03%vxF~o4UmbvjWwK2IF;&o3T_?Z;ZJDY}_w21gci)Ws z_)m{{HskgS;s;^O!M#mN5Dnhq*x_a8iTAYQbWZH^=Rt0+FUV}@6u3q_bRnoAgHG%X zJI*lhHuwP*NuVzRq7=k!DjXCNyp%pi0Fnvti*$VlB0okW{G>ilK&P7|-!+82?(hbJ z1?uvWfOsMv@vDO*tJ6tKkRH<-Y`EC!1LL7C$RA*9g}5I-g=9P zfk9g)!lUCt#51qMKs_=rYpo%G4OC7sOdJGtSZP6G_OpRhQK2^emZfe$q^unvK5nk= ztxWAU{Go?G2NK@0y=DdnY#Q*p?!_eywS+Gxrk6X)(i5Hi$IA!P;8NtM)Ma$IPUwQ-B29B+fbQcKfd%;AjSb6Lmzk5&^Hhs03UcAEI2Ypu&f`sVl-a~NLFEJ_Ch}Uv7imX)Y( z=Os@u>C^2NZ#}l>QQwrz-A+}bCJLr=6`Sl!sfb*6c*;9`Lu7yjt?@88#m_eFSu>Wn+>xX8Og!yLaK8&_$`+yAh#*%1-KAyTj7}x58F%0pa9M8 zKZHt+OPy0Jd*4vcN34r+9!fW^fAfwOyrUPyE%-twJ*xpIv5o+pEwPLztV=wC4&&}v zWk5DlFv=IVRuo7-lXvn0gDy;xjP@gm*13Ay`(plg^Mn%>tbxZ8}dc0j~Lh=fRRiPImliOsQ<-$^=X`Rexu!1HRNPfjZjfJ{bBy;F53 z`vHuLv~qT4v`>`Qr(~SV^Ip~XeD3|k!Tsm^^MLjjM}3h2rH(W~ggyu%#Yk6H6p1}b zEwTNt6QwA9ts!6%<*t}}itSzyWYpV|h*mrCz9hZ_F&f^bolM-RlQ+*$5TTeJpOGi8 zttV3FN-H7U8(Bcl8C8FI204&L<&iYLk)gc+#@y^V?j5_-s&Pms#ue5?=+plrik=!&zCs-WL4@mb;@@^8xIYQfiMRy@AuH zUU~vtdhLTW*}<@$Is~cb;cUtf>bNm3DwRI_=u5aL;XWHNjVRSeX#16@ zqf<-1(zNQ+B=yA#TfZeT3=l`1R)LcmWXSst-pngTNuXro`BfI{lmJzoqt4%0G!r#@ z_2`m5SDewWHRh>pIg8yqBlXZ*DW6XKC^TajnH|PG1EZ;onb~9JfuUvZF&oY5fzj1L z&NCg;1?oh+YdzI3dh9@Atm+6e{*D$gdA*14xN zYWX;7V(7M$sgkw?y+}YP5v0$LuDtec8^M(Cu^P`0Qt+>V4Y^ap@NmT5j*S(eG!7srhOgPpy zPc7_0I9Q<$IY0*PS5Yllu&YGRk`|5r-VE+4`4|-0-fSw-@Y2||ZA%hh^m2a3zO<@# z5?ZbACXtT^{Z&dL)8uZ= z=VN?4k6jsOUU`U4)}&Le#44dg_p#e)5dLz;29_b=R9ZpbW#i4#e3g!rN85-4gbio} z$2ssC$#6%US77#%5nr;mI>s0h$~?aOMGyaKZPf`jxBLb~(8`Wz_EQl7-b5%aeg$#s zJxST!xj_C1MKm9eIqM_v5dFYCXtTx7g-!0V4aqP8ZUNUBNY${4Sr=_3ZugD2iaNY8 zB|jXw#XnG;F-bdnJ(B+@R*bSH?1?5SV8kILVlctn2Cy!L-L}vqdeM7iwsGDIGuLuZ z4%bRMNW9)7ddP#&Y@1l>ouOQr_Z)Hx8vfP9a>u?-6%)M5jn6_;-#iPke(-_bg218x z^FFu2yn5d>vpXn)#Pd}G>KXr}&ebZvDce)sr&Hj~!=@I#g=>%q5c)2*tYVPyB;54? z*QNo*YSua1ZJ*w{SRlQgYR@1vfiP}jopd^rH)unEqOEgvIF7=3y3f|xCJK3p{9vbk z%`+(fH7M0Gapjt?tgJN0hYmqiz#4{>AMw`C@nZ;ar&rP!_1sVm8%f#l73AvJ^hvdP z`8K9|MV1dq+2hq6sY%cBbIsr7X4>~Ye+L@=q|?jf(+aoT@HC>ASy~}qX+L9{4w@C< zLuX5v@0jN$e8WC-YAvzVLw($)7{WF0mU@lVM%_OSe)TM&9Jns3a;*dDp1 zbHA!qI;J%f_z;&0(nxp@v7=Li?@FgR7|TiV{a?P`(a}JovY!a_e&qkCMf+cP{Qo?? z|D#~5TJ=H~>8BLIq#YWXkZhZOKrF6GtV%=0h5mi@TW;rlvGttW)HKzY&u3sh)p0t@edok|#`C!ABz@p!4N=bcAUqef{Jj(jH_wE~jJO+)C~=n`s=A}ppd^A# z{{(?fd|lLIt%REYicr_|J_pS{47@F58nz0IGz3efh}wc+XE!ro5C=eG#iQJ+l7LAg z!lm*;iZad?Cl=a^X78r=SB#%1)MA-WwI+nkmEs3UdlTfSb*xMs$0%XOMHPEfD6%IkN^(QRTP&nP@}VM zOg_qdZzj}5>6*YrC@nSCB{dmXAcu>V_|5sPozl!1NiBF&MMw=R_rEPnNMjwS%mArK zPlyCFj~K@sLgxqE$#MZ3)}6S^C^qGKMM_t5=xZV2ZRZ#SyZiKzii&2@MFNlb{l)Qn zKGfiFN`GxVfV@ygRrJ5n9Qp14rpWi(Sg@@?o|bztHK0DU9=?_g*-9L}zF35DTz`n# z$b@#4CTL|fssLCLi|Do)cCTF#^d~CoMiFT>aOpU+%-tp!9%-zva~Z}|!(2>0WT_)T zzdjeb#^_G{eexYARB1#MF9Z+dR3P0v6O}W1i`!~$7Q@;;)~{!pWrAGD>oWYz#&wv} zhN{0QVWSgjYV>0^G(d|O(mt=_Q6AD#yYbLWJ#U?_@5ARa+zf?daA8?ymPwc{iyv?r zrbF8{@ty6EA(cLO68 z&PuqYxkk9niF&^EkK$Y#2xZ{uH;2b<9FrBwioYf2LA-4bqg`E8hu0l{fz*veGnzRO zg0A;b8+1oUr6Vv%;uaOsO0tJYJ-auU*$I158AkRZJ@EYK6;U<*2+I}vnACX}`sjb# zs>;8x+iH4>s=m+gdtBHc1!$Er#Y7vc1sqRki#ATsAuiIt#09j*%bj;>jh(=}lKWZh zEp?~nlv3;RV>7CYkXRIiE;C7-lPqKi6(x{oon@8!Y9_MCI_}1=p>G&nz(iFUlF2%g zsW0H^UEW;nONtoKFnCoMT{~a~U2&B!9y88d(O+*D2vbH34IsQ0{OL3r1V#3zyBHz3 zg-B!MM`oL3>>M&|p3f%UkzECvX%j{yABXJNTM-7G^?KntQkeR|jf7Du};4-xl`us7)q9 zv+#>)+Ax*(ucZ5*G;Prjbv;1;b?FBsA)cRfaV(>TCO&5$ z)v&H|l>Nl+LIfybZ43Z@{H7;}e86YGaQ@0>M4c>W}$}p#!C@pdt{oV_(@km zqHX3^i$RT4BSQU#h!Cyp>U;J!9o`oGm*OgJ76kdMGN=2viW>aD>@NKan@uz_rx{Up zEk|i$ZY~6STTjR+qI4rNY?IO#S0$8$qs^H*hb5dPGQ(OE^z<#2h=!JRq=wSK_m@E{ z?dAuIV`;YRBnV$T@ph%b4HE+D%1$^n07h~$D9|Xd`g`Cg*?J@P_DC$TQzQC?Bj2zA zABYTJ`#0!f@s8l%I0DM0liKq4$kaoHYUZrE zg6V6Rv@ywCj!ml*YD@j+2XynRbjh%a@$u7CgIdm4(k zFB|+>YjOPC4kSbJT=o*OQ(he}7xp>9d{{Pl7)F*%vc`uu#pL-k`W zx`L}e>s91RtRvfN2U2wF+bxbV2eTGQ7nK^OI#6XeMzbBeq4%LS%(-oe0vWbP_Zfyj z2N)Jd=O5-oPynpD_2SV%s!JhfJs+=Mwz!yT^pGyMIEt+f$;UFcu2!OtK`OK_qVzNx zpD(z1O~gUglPqeyAb#krA}CxZBe9Dec6@rGU@v3$~a{wJoIv(nxh^HV|HBo&)y)yHpeaS z1c{X4aJV|CBeWOvF*+694I?-mxPeG-;Du-rr$!AkG=&or(lw_~jndM@6&a>yF0=ZA zM)j%nKt~R9N4LaxFVd%7j5Tc~EM5+?`?OK+*gXkt+9fNyohr_gLY7pxBDX*9Xe7ok{dLstryL$zuo zb>5T-qoxmsjk53yiPU=h-uq@Jw1e}Y3zE+`MSJwY!c61CN*wKvgf*(3kD75i@Yqrt z;5do){hwOql3GuA_m7sz{-b3w{D)(@l&y{Fzs>0>8;%=7NTI%W()H&|&+|b#3St-| zG|Gu6kVQ@AHG^z2>sooiEL*FXqTy7<30Qz!y*EjB5;}f+@NN(*{wemRG6_1?NQ4nFenu`v zWq@Q@j9Y-tBuh?gW|&TJM2}tS&3{+Pq)YQ~}bXa3p__JH7GeTDI zYb;ioBRM|M300~oxL z;N}A!pk(e%8}N%KD!)BP@LO9eC0tr8QQ>m<`d}W^9^iEJxTtQ+(n0 zeVPXtI>mTRKwO(o*E1E0-P@bQrj<;m<1?JMgc)T8)X-~trZVkF;<$(Phg(#cU zdW6?brW;evkTTgfM0=up=}<}LVY?!j31tsT!L>ROxGn#h0g~(A z&f8#E2+RadianJiaL{Jxa@77H^Q?-nzYlpW2WtQTnLVN80* zq1cF#_=tkJg>S2wG4Oodd#slp*G}NNxuFtNww}Q$HtcZ`!2@~cE}jt+N@fg&=!tp7kT#zW*?leri^2daN&iUncw z$}r|rg0eqBD$l<+PKFbzbQK`7jaAfmYA^#ib*iQ9 zRskZlu6H96at2=t&FE|rv77h;>~Rn*Nf1uL;|FW}G1HV(BB3GG#qM~_yYu{c!OrXJ z{SKf9=}HJr2p0%qAk5qziIduvb<*fKF7OT9?-;iU z$lRKgWvS>?!1cS;d1-b>P7Bk4af#T*LDQL-!e8e7_ z03kkedh5b_h@T`Aen1Z%!bf<$rdrJOITon?^#s059B~O++okZ0SM^sT3XecRa~;i ze1rb?HTq|579T`$8|ugYJM<$rar}pz;vYUC=p=9cEV=*U+e(_UKTUgIAuUwY zP)8(g}z3Z|Gh3V^#W411)G6B`L2!HAhz5)zYi|hc3%W_z>Q6 zyDrm6(1M;p&{D*W=vO$cX5AU$mJ?j<2F5VdL)JZcnB>+8Dz{b=53mRs9J!O}B*;lP zA#!75&__TW`5S@Ij(rJ@zag2(#1iA{v&`r01skES(*&n@i!ljuCaAz2LuiY}4wwfk zxD&PEK?UjBa3779k$wY^Cb+2*TdjAD{r!evoLFGbPz5Jc7OMI`qrrA#y-Jm&Q54JY?hwD8q(e}mX~4aFu!MNKmjd}4&i0pb1J+1V*}NQ*-7 z-_{3%->hKJLbLlHUIL+v?1-8AKwE!CumA5>IH=Ol_w?ANsB% zBx-C4qHCa9xuZjNSys)BpTI|M68ENu#C^z#C*WywXb`^s7nGaOmN&s`pj=kmS~tmz zR{Z#|)ZFe$Rh(8tc7$9;xeMQqAoSXVIka;Ds%9j$P*pi`vNoy~CGskFLH9Q`wuzLk zS+=7&>%U=;1h;bcHqc*FsJP>`^9HR=PdOV*!{zXsYSA=gA1Pb&j^!UQBHp<-YhpJ@ zDTsXRWOn)0ujnen=QBB4D>q3hTvI%y(5!zeaMsM964qWGA_MyX{Ld>^1JMM@{X^T4 ze%5$6|L<2!*1*Ep@V_!^t5viWHGlruNQv5s+LLD#lq^1bF$9QmG*W&K+g? z_sj0-?TZ@6{%&5L9-v*cDzc8-E`QVla6PsFAhfxGF*KPy;ckxVPhMB^s06h z_H_GX!mS9#$+#|NTgldAGJm;sm+V%M$tY_|QstDT3WMW*nsh?nd+9M&&u*z5^^_+s zhQAys+`L)TDk%w$4dYEm#SRYgD7DIzE)7K5?3QcAhrrcZ#YG{qx3YQda#ifVp-@); zY(PM>e}Csv!BMYDB!4^&5&PeS8EamX`%m14_&-55p(icImuDyvzj~tr2avA=Qmap> zw6D)sIhY(;rRRiIr);HQto-oCcuPT(;RXkr?uI3c<~B7* z44v+VohpshUr4guiwp$fAEV7=vQJS1-ejYSLC%a%Z&^_GoNE!she-U89(KWhc3Fsq zgl1JlJe5$Sm&GxSbu5iF63~15ld7}L!K(B=T!1gq`U}_tbFR2oj_Y36M$~Ou;Rqo& zj|S3g<)qTPRJB(vZVAhHFxBdSdu)vOyv+NAv5(TsGd~+s)UDH5;34=e6hRHan7jN% zLTH5X>{1P%l_MF2ZS(Zg%A~^;UcI>L?NVr=y}th;J=`h6)}_v(yRb_#37)OxIe2p# z6ZF+_c4{Ys1h{z_|Awym7f!x(yzP4I+%fa+dR{H6tOJ*nWm>v)7A%o~s0}~S+X}pz z-~vTJ_%4M2YnyPgqZR3|8;JfFBA>f8+I>SOY?9FiyV{+XEN@v7oUa z8beE2Jtgjgex1Y&VyriOQXK&;pI5iW)FR#k3B16Q_z`T9T`GJ*hMR%NGt7@mnA8?rbCtYre_|L!p{~eVSY;B$X6+Zv}#I_9!Bz`#V?#5@S z$tj_!Axoyl#I(6QJRx9pIKoUkl0$yrvrCtKqE2po6P7_R_*>c!P+WpTK%ReMwcR|l z5Yb`8jq*B5-xkXimA7_$y*@$pKy}cCwW#y`EQhsd4?u?}Hn*6-S|QWOdXY!Fm-z)D zlq??ej;hDWRQ6md&#EWhM3BsC@eSMeFG8N9e4&D-Gtxxz&l*pZ*wno9Oh=CL3*+0~gQlpB;`oTTE7XlOyN z>S}UcMBHcObxWl~t(*+!MNq9UiIbqx8tgGotfA2uBh3B5OfgqpBJp0fGUstUJ!LGB zRWcbOl!)lOSycQzr#HW~vceT(`10@yr?E_Ba?U5ZS0EUe*Ph&AvO==fgE!L zVKHZK{aqyzcN^2zIqD@)o5@`6qJKr$c>r00#0imzk0ubqVghd+u}v_>a^E$C*Nqai zhs9xpb6}C?c+KO$Ne=(lj225Elyf#p>|lFA$0&x07^Ea0*DRDip`?kY)DG7Z_kKL) zQ`p_lD?_2-dP4kBRc=qCWCeP*?^O1GKBzQqfdoB2oR$8k{)y@Te02Zoz$#n+vli<^ zL$qe3E&$$CoYYdUf{8#B_M`YyM0<;4Dy-v4R1Zr#^cCx~Hm*6H;@S`U`ZFS!tfPOP zM*S&YxNV=9$J=eXonY@YopHZ*)VW^!qx)`%uErZstkNS5imGc|9+g%^eQrs{3seU5}C-e+!;MGU3m^UI; z-!<#$g^6~JQymhiiV3_ztVdO)T_@6GRlY*P1G1n}O3aJUi}Cb$$!!5my-v15z$G5$ zNxhFah}=zdHC+e4-U^4wAyt*e0SkJy&d2?$uf0p^6<`PDbWWB#V=ZtrYeQJK#1{24y<9uUr%-!WaC`w=F^6;* zWH1bsbRYaSWJwA{?4%sTneCoafYVlhu!ml9Mchcn4hGkGO5TJXxlM=Q56>fY;+AmR zgxGU+Zo*14+(nEz2^m^vttsHt#NP{9I?=!STHXUssK*6xDva1d5o>?wUJ%wb7&<~% zbJu=9=qBsyQBO3WaWX-_g|ykCt;_e&#;a`%*fFg2fn$qsvJI8~mZ1dya~E*}^5x_I zeyDCVltLGSVEJbf8aF{Y9lcEJO;=xNpjn8Zel$XdSEc0lG#2#&9_-5`@3CW6A&x2L zfz=xu$?87+I0Rr+eDC1Dt+M^|Uz8;?=I8zMl(qjnW&f!zF5_(V?|W=YmjBGI+>O*$ zolON@UU(F+_7jDXei8}>OrS6&D2agKK67U-L_iZ%*EaB<{BJ|BJP6`Uw_q=YQLZf@ z85j%uscUPTCs{v5DV^^Z&(FEPj_Zx^qi>m{q>AjZ6U{gMvIVC5kxHZ|)tne?3{vok zmC@{vAVa+79$m9lxuS&Z>MqzfHn$+WkCfa8DHW8lk5q#dE8KO$SwKRrjmwRkQt|aq zSkMz-$tGttlO&QXI+5Y4?juCwbEx5~aZ1x09ZRK)KptE^uW%r!T*z+H1VpJ2=-u0{ z|AG(ceJl1p26E7foFjx2{U!(j*tfd(zIM~HW zCFCV*qRjIm!sLSa@K#6W=WkurV7D96A@WAf7|pah4cT{&_QW5^+j8n_9&fQL6u4#= zY{80uL+n|xBW%9(fZ3^P(1p^vl{N`oCYF9yuSxoT+H=NPj zBF6w@iIMve$K(zuAw2fMg6T-3U%48F&^xw=N{iFx&~1|F8a8d_cl;Y3Q_Qf3 z;s5sjD0jw4YyTW(gP+6vpX!=2&ep~b=7#_F&y)BsEoS6Z9AEK?suy0ovHcZ&iM~c)vo>C&wAE+t;XEi zP}g2f@G4>}bHl>Bopnd9>WFpqh7OXKEM^^C=G$Jloe;+CG#yh7i}sVtPlwoOpeKvy`{HiZ(^8%Pv4*-ce!<5O7&NJ#x5g^7+=BaPQN}&YOu>XyYo7 z9(@UjG~*kY>@uE`uCjY6B`Eqjrwhb{d?a^4^d(<0;D``tvBTuT>r}#duGqvK(uJO0 zf46wiYIlGlCO#Q$kd|H&_Lt&`J&!07X1UK44#jwame*ymIpr7nWb4BCz57`mk`jBl567(;1P4rAhZbl0u$~#@#KMy$i-@YRs z_v*}l69ms-I=XUHye3GCB~+9{hQJ3#MfV&yCSIy+5JGnuj%fn;;-KoYRnw# zz@(uC*}%Ib79D4VR2N@nLafanG~m*)gZ~mTi*~`37yo_ATgTLX3po4LE*LUygw!g- zpZn`gtt{YT>B8o}A7lTyd^=IP+C~t5{fhh9)cPt0pB|v&))Z04&KMNKg|<#ozIWsH3+k1 zABh=D^I(`>C!|Va!aU#6Q$HUgpc!@J)53(c=NN>l8Z)k62(7f{}^N4e&Oc>tP zvveCuGT)R?KI&3E`94&|y7M*%_YN3eU4h%!mr#otA|ZKu-@KD2KFq&<%Fq0J@$VFIL*^s6&w z()3$mU;<3z^`oI3SgegHbyk~b;V+`m35xHQ9>1c#g1go5S7wf`v!ZpmfGh;R)N}{* z%qKsbL_U~K;Hs=nLWP0yn&ve-`gmY0K4w!9RyU9=)vmAC;9){A+dmn;&-h9^@<4Sj zcdZTIsB3A{5x_wW8d9fjpoP$Yq~lvxw^5)(o26>B#|}*U0(W2oBcHmn7exx^dpJWe zR9o~PSc5!T=(EnsXhOgH7SE%qQ~igP))4v$P0L>N!Aw126-PA$X-+ogpfD66jWU1H zD(O|d7G(XzSFL4r{%G%tWy(~6#1Ub(f)HM2uf57mfn)NBkfQ?1fg%!Bj{>6bhJN>2 zj^i0aj|n=Ljvw4l;K@xBW6Vp*T5CZEZ*`ICfpn~Y^88t-7%vcx2Jt&Tc^qCM_{48S zhMVC!4mLm-@cqk+%t$EB@54-Kxr`TPMc6$|vDQN~hEgf*x58P>Ay_AAt%nNLvKkkP zr@;b~R%8&n)B0y#^0W7E;A_d)*O7^mz=ptQVv+{%?8?L11w`>V7%7$%v9Tn&7P4v~ zayrf>Gb>Rc9XUvjaO5FS9kdXjPuROqX@pYT>tF7mJQ3mz*rKsc65Tb4%l8jaWn%`| zY$Hw&OC1@)2HFt|Aqj8Ofz1V@tB#KydC@g{NDQ|>9z2;KelP7}>syx?IIeP76`Btd zL^@o@OfNSbHRvd51k&U{4>fitLryG$rz zGqW8OI!g=_^uCkscG}Jw6u?g}(g{P-qOCVcIjw@t?BP+fLlch9vl}Is$NrVysU4WJ zM~6Uk1h-?EeXee&bk`)wK0NQlpz~8s?d_`DSPLMSpX+QBn;d`$CR7({d=67^pb>I} z_S=sq61-GHi-v|ML+SRjh}QZ$9vx}pO>SJ7)M)Pr-wf?1dmM+*92|mbq;iuU(;biz zp#LrJaFa=JgP~V50r8xth6nlY{+{uQUwU;0U5#t_1oGh}Kv4hhud}>kRH}w-pND5@ zLw0QD55cjMNz_bLW>`P@I6J!>-cX=3^cZ1#Zag>VEZ%n7EtqzL-B$8qgfIbK9A6P1 zqjU|u`=!7+5HNoP20vG@Vo5G~o>vbtWeq10=zcBtBmD4JOAW)Da%eR{lXpIpW}Mw_ zv6NZtSkw;g$9*CGYQqwcbNr798cr*GY%wG-GRC2=Z8GE&=B)e&udM97duE;L``1o^eJIE7 zSh~4W#<$=pDz~H|IcKVxr8dbM$8*aY%uumc8*%cr<@JdDnG>BAsvxGZR3nP)TKV)6 ztal)OrLkK2aAWv^<^`!4H<|()Zh!!cK!7Sq@4`>k=-Hr78?V#n*@P7 z^IL()SkLq9C#TI3Y7_!~%1sfcE@?m8O9m%Tf6Dm-Gq)tyD`ZxS#K2#Xb%3kZvCSm!eYeVwT5`B(3+W*NFUX~uisDY!d9PTq+a(~r`r7;#&h9 zB+ly{G7_Qg2#AmN1Ov`Zsg@H*qSju2HgRG@Yb-CxKj@AXomMC&QkahIdgT*c^y028 z@Ybn4^faBaIJs#;kuDgszMD2l_75j)4!SFdmz zspWj8(XQC;T#bBFo3 ziv&wDhan1`O(9~@5N$0Gn~pUU!&lo2US2cQLly;kwjn~2O+z&nekq0LDCKsax`Y7I zp7mFVzpktq{M}}cC>}H*-fY74mYoJZ;*1isii^{co_oW>+VZXj!smmX8v=hRWg0ol z52zunY+y$dyJiELbfLO&k&sGKT^_1NjjkZ`h+@{?6M-%_trh-lByprD#HwUn1N~VY zTMZiH$-m+xPN|@Z4zEmLFaJPs*&fAc!A)DI{`6laaY3_V!K7g`CI}~S71PI1@aYV5 z$lRm2vCr?S0i(TSbSt#_$nj#yB4w$hm z8Q}b7s|X*1yoI`}rH7ZZj9PA%!e!=G?8*jp4dihnwPhAYxn)aa=UkD3{LCSB&*LKr zoJH|NLT9Z5Z{cs6$|8lkp;E`OF+;jl(VO2$%^!<|xCg_IBsH8zw4Qk*(nK_Xy!6CM zP`W!N5~6l)v!SO168k{sY@v%p1%XkmUPL5|d8A-in@{|%%@;o?d=v_dB!HVW`*A$OidGVo=^w*I_lEIy z*lDxH<49TV5)vD`zaf*at1?RzL}6NSg43k3&Z8nNm~vyt z4nrxmQI(0rrE?+elQ^1PjqR>dndk{|nN@SoYMn+?vH8nSnN;&)?X#WQ?<7AWO*|gn zJ`RU6l&97QF=tq}0qK%|N$U^qQpnWVJ-wkeT}e1>x>m+J0SE^=Qlgu}NE*yg4LT|D zYU6+^Inh=SkyaL8){;S3*FcU|1cw2Nm2y-_Ga9urea1$A8dw{n5TDE$Cm~%q)4c$aBc_PfF}MP7jvP-^@Ha_SEoVcHR>0$pm2h zIRT9bV^;a*fv4yodRPJghQxO8Y&1Z`sB`EL-)fj|IBp&OKcqchGBw~QYzW)SxZgIw zI~KoQG=6o%`r7>3(fswI@~fK$?WRh+#Rd$kBv3XRo1TgWYygRmcX3m+Xq35@>h%vv z=REde^rw>2a?$w11eBuT>_SbL zo6fQ2u>Qc~fM5(+I(!LGTUFAXCwC-U3ooD>=8%@PIDf5uEgme+$6#=I<3 z!9NANM=hnl@t7Mg**`kzu)btC!?O9$+>?vv9GDZbOPt@h&|gR_gS|n&(d|ihmVvzo z`6EoP3KOz%mZ z<}??i-_2-nYUhe61v5JGCV57q-eNICBJKib)0XrPD#yWd6!&)(wJu||yY_F^IS?NH zX7loae8T_Z<@@s;do(B7=<5xw>Y0hdZ>S8SJWO=5Re0!wpbC_|j{?!USzI<5s zWTfWd65ZqjY4Hu6%Nx|h8_?wAck@k>CE6o``4yGaw8>HDfVXL5ZktfXPi4tU5`&6F z)94yd{4{SS-dX~+!Q_nnMX-|j>WO%RK1c8E$NfZ7|ID8r{=prRHl>e6qt^kXNw{j% z$~i_h-=d7#G7G%26DjAq66i*zhq}8euL}k-&*&FkAzcb{XKdi)UXgXGmZh$?t=d^^ zk_TWzv4eP3D>2iOxNnQpXv;)(5Qel$65wKix+D@4x`odMZnXb}3q{uvYiH6}7I_|F zve907A9Fs^t3$33qoAK3Z$L)-r)F451|`~sY}2TYXiDrd^Z*q;13T9M;qRn;3U%86 z_pQKr7BjltpvfErcf{EXwfRoNZn;QnS(t`vbQ{J+h*-#;ZX6gx(8V|C(H_AgPSB&B zqDPH-TB+e$1vksQh*O!N#@98a9oUVd!BJS@s&R%fmKlJxp|!4POo3Ieg{5|&-7(`* zEL*gRG+N>QR~CTDDknN0E_uClB%4{9XO_4^3ROIpXFUALynM&17@|8uHyg8_G=?uh zG;j3DQ964{^L(d$LJW2_q~1|tS@)GBk1q36>`IEy;P6B+r_aiM``?>>j(mRf?SU6u>nEl%Rvqei2j70HjSbfsADXt40+%_yV96d}q@%tWrusyKWI=L zhE?!_BfNRLP}_RWy$&pT6tOFyJU)D4+$cR6-Rd~Lzd5zsGE2!qv%EPtz*0F$V&bY3 z{`lCh6%k&QVvQ#ta3y|}8E4O(Z{t@ek1zU^e=8frY#HSb;<-Hx)D7SI&j3yM(;=~t z2|v6hQ(CcLCn9_e(14Y%s}<^i*OChMvaFRG{??z+7OFMXKW2kZQpKn6c)td~e&6cz zc``%oRV=9pMKsXE4V3)4H4}bc!>?*3PcY*gNcmNV2mkzQZ(JQ-mu;{yEt&ndfulI! zSVB7Gpqm};yyf4U6=l<9$-dP!sai@h)shYJP&*OaIo!WD!P+kbHJ{AEx5-YfQl=Pv z-T-}{YSVA;*lykb`Y$%WZ(ZmwuJu=VjWC{Q6ekoEBZn2F#-JtdNBBU^-w_$V1oo|T zNdTc3Tg5I?7-(rG{>z%rARIVcU0@?-+YlUv`j>Sv6>xC@-U2w>SUZD+L(gFrv$SkFK*!rq|)iDyzz@B zV;_TWjr6$tz;s#V2(#Y<#Q+Vl5%{>O&d|3?{uqZxOp`0>3Q{rFz~x3avPtc2`;>q1$|nu^Gx z=sXP*SX<5O)}EV|&y~s<WOZjO zjYWs31%EhUYQhzB4ff$p9Tw%gorHr-)L5MMqE1&YY1I;tvIW(LA;EE(jY}8)tff$F z7NmDXZgKyZfFybeJPUX5H2@n5Hw;Hc8!EX5Is&H6y8K+6=$Hy;K87m_luZq%!*|zbSiIgrRx?B z(^(X5#z1cEjBoX&WLHtR2R3L-!R1BW(W~Ns-@=8ud;*nGeKHA5^PCeUE@JzMj1{n> zuHfyGH}2xeKUVfBtY8m^Z6@zZj607xUt8;Qz^gSoeFo0pg?ff)FnIWZf9J%hHL>H} zO)ck#Ge)tu&qgx2MpaOXO|nx|6HZWk$rLc*+Y$I$Bl>29vW~=@QXXT4Ci8nKpmEb< z5CG&v;>(fSfl>*g2_=RHW_f4NkfN**qO9<{y? zpAnU`%p+mVy%6b;$O$>UZ>pd6TtsmU*eSl!zUQCuVoMFX^H5mH-);tX5_(QIzU5d z9O2NWam2Mn77_Us0$eN${6+NBmAOi_^#%qots;J1`-L)@1nVQ|HoE`3)$`w?_z{+{G9>9sxIJ%YM$5JjA9O+ELRz`kbJig zEZ`55TcqrsK&`L8I=Bgwf4w-p!?j&%b7R+d`9mGzGWn2;{_ar6w^kI#33j;7e&;&Q z_PF9;^ZEQdzy2knZ)Q3i1(KgC$53XMDWQkS1o5y}9IQEFo;qj+E2z^Cv^8rB z28t2^siEo;sJ@6o4(hGNLfzj{jGs&iP3w@_IIeY;%0$hhx=DF9l~10&P}(i;E!|5# z+7{oHq>fZw!quT^Y%G|_s=Ypz7(^BxtURUm5KmFL9-Xpp8F|#F-N@!7$xr#nd>(&! zlBPc8884Eq9I>-+r41S|Zx6N&8LvJ*mnE*)T75;?YTvjHy4%`5?{gBU>4<5)boUTW zG?A{u&&<-==L@qOlhZ~HVKLY2>^Q912r*x(!(^g~0&3MHmtv82X-to0AZjF~ugu6Y ze8*k=fKI;={2GI$l0{g7uRph)XPm5JQA~4|i*cpWT+x{%xQTo(za%-7Ob>im_6gq{ z*pi(_PpQ}h2%eQ^ru@o-+w%f~O@?T>+k4Qa^DOp1Mpp?shuD=_X)c43T$%}&()Q>z zJUbqAmg9sl-h?l{g*b*&5Z#=U&RVAAUdP}nAAx+g&H^3YVi=25O|E6_(wuAI>2KCT zxh{8&37O%ogiKJLODN|O>~76V>14pL_tb7ZZ<pkq zHEwXIG4UXqvKcv&+d`3?eYa$!mTC2apK|p{l*9fa{;It)oRcV-)TXc}&D%tiW;<0g zU1ySJQufD@IeGM=qHXz97W(#b^6du1c~;)Obh~*M1Z4){%yvcw+Eun%(yZZ9P;G8x zzhZm(%?@;3i0a;bW~GW@w$WgbMJ~y;UdyjI`Gl2|6ocJA|GeEhWm{s~5q|YbM;mdV zJMC9~6 zxDI6}m`KOm3!|8A;g6Nay$#}$b_b*b-RkfgP4+u-#ISUCzEff~#?SXJ(hN;JESGn} zUB1r;(QHK`1@xa2b)E8sW{HP+8^H^wvBsP#%nI!K94|BjGIHIaA`x%i@4o{wim*fu za+EBryTdo=x3+}V^3gA&7J+1aFIHpnopbEt8mUu?I=2p9+^yp3N0;$mK;{=%1Nn?W zahwUloumyBV(YDaf820vY}Ga3Y$L~Jf(u^-8*!dOk2<c;our2Y1)?O>t?CV;}~M_48PqZX})D8Z7aQavCIk&7?U*jLNt7nOmLnFRw< zwO0OE`kYnTl-gzgkjjJvp0@l;#2wDx{eYE@NLC7MCnZDX9Q&B`bCy<%hBeZ6`8 zy!HGv_!-0VTaN^`bvD$YerEt}gB|Vow&fnwb5?qq4zLTPl^PUr1Ne>B5f>!MK3Qa~ z6cF(81EZu{)I28bRlBe~8O=HOQ{peKo{pi%0fKislA!ym318xk9n0Y0d4c zO^ACy)*;MIyr+*46B^o42ZrS7rZiwk_!R!q96Bt_O|Uac%^h^zI_p~^%uTe{0n|Ml zi(-0xb$(`PX${c(9h_+_9fetM{xA}k8ZVCUz%XI6IkURCzP#wAkn5$b>mdq-KxYGG zu4&FTDla%I+9G7mHr~rrkgkCh595Yk8EmdhQ@G$vRUpFERjF_LXmv=4!EKdsSY>Y| zqylEq0nJkhdp93ki^&>oc%y>t`7=1#GAE!1yIJWgo5fgR$URuQ;R|s2Q#2bQ3C=rK zhFBQOr0^4C9q4O%KIIzVI@w?q*R+SXL1@WpLeL^oj?7wLN(lo>Q|0;O=4t*W#HZFn z*Ow26tN*T(MrzVxtfr_Odt=S8b{n*u%Qz@i&|M}v*O$1#{5F$T`U8|rasuTV-Mh(& zsT3SVPr&!@{@{(T+*A~lK`ws;r9NUJp+GtvRo*Bm$Lhhx$aZYj*ZgMMmsc;o+3XDe zTjyGL8h>mSmBv_PQGRyMh5$o8$TBQ&*tEh&W!_D1iK0AzJh-@qLkYGW(cn==dmR&& zf>U4YACysoy^2({(7f#uL#;Z5g3t(@n8mjd`Jiii=%-QQ(`Q} z#X~0ZU>`!Yl{+-r!|7OUG1l)SdMsG=Q@v82$U+vd*4&}~z0|E#?sfEt_9nxsQ+k|G znBGwB$SYc!Vz8tp{p^NJp(N_#JL1aW(m*75{0lKxgnq;&102D}U1aQ(JC5JmDL07T z_&Xtp-hp^b*gO#~3`E#vR%^!OQSG!g4Zu@}oz%NzFBH4#ebYDLAixX|L>nWjw+;|B zcK*6MPQgURBbb6=jGR(@asu7@9LV`dy0&6VfVEk#L#+Wik`Kt9Bb%N)Z*fhNyby~u z%H0;Nuj`jPj|ZrifI!|oSwxxMG7uNRn7A4n+dUdN&`ye7nogSCX;;xc-5b^4J_$Fp zEsxjSxYyz@U|$sc`|^wYhcABx)$tMK{~U(e7?E3&cc0W^D=A!5fGco&iN-*_qy+lx z1CP~ilZh&lC);=M8mS%5v%a30zxdhwo9Lz!dDXdu8Y`Do{9$C)kq7DVF^C`wvrL!j zNyw_0gvkhVXd@k-LY9$D7g7=QEttFtcUC;a%FcT^4aq4)`o<7@MlO?lgqYNjBLoL% zn~Xfa_n8aG%PGPHJr{fgsE=s5xIr2YnYSOC!_NA00(i=$SjB&TC)L7z@2{-Ow#tUV zv4mk-DMkg+j-}YwN~g+iE=VwR*mSJMP#$UAC%!p`D#A}x)v92fq&oWPALeN-HRU4y zU|*3*RfXiiqVh1#9gjL7n@S(m9&bhQ?KYh#l| zJqa&K%|cUPldD8#oJQs_-;WbyP?D^f@vmOwV7)e(Y#}mN6k?OMh2|Tt@dJuG2HKBG zMhJwBR3OANqQ>hBJcRZ)<0;vvx6tQM2Dipo8%I^fc5p&}*vqWX3>IUVF_!+fn26~(4m*RIAyG=y zG@7CTWh=2akTe}3E8W3^8j*l$;#uhPuqX!0ab5vBgUCLyFO3)QkBRL^%4!G+4)85fqw;mbq;m?>pb4@}m%O;pC)siD5?;Wljb|r2dT#)FAIS6s2z>axxmirA8 zTrF(ek_J{G4K=2MHEL>8c!5{Wiu7PKZZ}VCI(6}dTbcVU7xj=riUc(qXl&j~^N{4H z@>aYWv~~Z&Cn!soHESebf#pR*kPhwMPW9}otit0T3D%4C@<&7a0p!*s4+n?U3(IV$ zLpW)=chp&VD6S2-&zjx&GN>UXu+=%uo#Pv*9zyL8*qE3KsQu2cr&3;mGtP)@oA_K9 z`)IP3fGq859adj8GnUHCTF_Mh#h~LDr-rOZjC9*bv7^f0$VkUIL(?LJ;7F3W$P`ny z2ypAwh{~sn8{rocZ)1@}!&D0qs6~9UW7504p&PxUgWSuds_eYIjir>)Zd^OJ;eBdd zYL_VcBUr=l4WW?kL7ks1nuu9idlO^F*L)ac4wpeCE^v1|pmwg}yZ-FaH`ImC?2!B9 z>G>Yt!%P_`Qn4s81rDf4XeFs9j9D^=6S9=_EfPb|x=J|1`NZ{G19gqf|D<2CMPHua z`_K@}B_Ya^0vAyN>o^6LFa@NUc8@^%gvdxbu)5e`ux3N%>o9UkUhknX3*K#UjkLn? ztAB$1^r7qYfgSKeUF=BDvuf|)O58HQxAOzHK>4m1nr2(rd46tKFdc@ja3&3&nd6Xl zxKx9$mJqahi>;wmeS?-PwEDyQ3eBh~b-!p$uxv@VP*m%@wI-3Z`UzW;FU#CUBc8?V}S>`@)voYE+r`$klc3eU^e*) ze$P01BKfL$_K_WKB5H1YbbnBqzaY^0c|;t9;DEt+Tvz z+W3l?1Vu>}miuz`tB9sSbwKTXkFTqWz$BQm7Yd<7aQ{{hA`;Lw-Y z>f9JPv2PdD`E8v0=^UDO^z~!^u}+c&H<_}^biSs~?9S*)S6pAdA#tVOuhap~CpEQM zser;!{iC{aBZSAyeBz3X2onx?^(*25EUBX^RHljoI+6v0NzwJDu^^8S9)e`j!BTzhGzb^^Atb5 z7z*!5$HR9Hv`&wXfkDwGc7@U!CkLVyrWB6EQ_uN%Ei-LcIjaHt*_nY-BtgNd84()G zkSc+O>I?#vAe>zBYw>VM3uCw@lDC+e#(m^q)hJXB63_Y=PI+?_KNXNCMuga;zV@v$ z()>)#dc<9RT*k4F7j-A;C&^UJiNq+a=PeLYUMa_U3m} zv~(h5*ib10MkP}}54_3^C|z>L)fi{{(uVU1+g(#SydgB+KiRz!`fRSq`9QRRLZ0If z8INpt>z?lqcOX5Sb58rzX})2B;7Z}3Wo9i^Tfwjl32F*E$$l#s7Yyo#$Ek=-ova>~ zO#n|Oq%Us|5-@uB0uJi~0d2#Eh$q^(^2LM<6Sa+;z_8@vJBrzm_E6!LX z!$Kq~^@DaPqAWf!mfv`)7Y`Y(UHO+GP4Ukwk0x0D(4#Nn!`sgv%M%j@U$lBR%%fRP z+#L8&(Wjb(lxwT`ToO7BeCCzwP$NHE9EZ7yM*H3*NRxV?aJjmp7T05XhxwP+Ss{`0@u99#z zqMg7uSjy0-sEh3r7K@vNMKkcD*1m&Y9Atc9gvp+zvx_jUe)t|#AQXd>4VNMm52cbW z45boC#oQ2)#`RKH$4~9T-W8^t`nU_dF-VXnG}lF;o`TTIW0lD>@zM+0BfMF_q{#CM z$}KlMNB}vs3UG>({7SISLOcntKh^zzDpO>C`qET?Fs~Qb|NGe2|JQl^Kc}%s4MOWb zGo4Q@eaEkf*pJ^wD*e+Bg)^}fR(+_XDXK-uuM+W};^iC`7CjVU9#C`H|*d)>4< zSUTAMm>4}&{;`1`=H_}z!gkZ_aMgRt$n;R{cmQ?N?SKJgqumJp=AFASq(j{$!_>Jk zV9-gNL}U3-I`KIgoW6yc9Zvj|{M|EmV?j6d&t~JLDzXRZCLW7!{KX^hEx=cm`9r?H z0`sfz7ibp+GNjNMSfnX4{9!%SMi;|Q%wmWKkay6Xv5#wQ@p9-8P+V02FbfvUcd;qE z(mtFh5K9%sgho(iHN44Vf1D|Meytv2A1;xxBbXo$i@(-a2#xbhc6e->Am=}8zEf_&(MC;P%Onz;GDK6~3 z+07K>Fy_ zx`<(eJdP(y>ph_hlH ze--Wgb`oK>9ov&3LSz=GTMLJAdH}z#IHpH^9RAlgM}b~#h7%0~GhAs|mDD+MyWY}Q z8JBQ;@)AE%N@^Mc1{{~WZLoWJ#wNf6>=&%!zP^r&8~p+t#ZS>Ph!e+`OJtBLOtD~6 zH0C)gB?>l$a#I}LFgxL1wvPv1XM6HOw&vKFFWs*>@z2mBd`v}%aEKL^#R2*E_goz+ z4d+)>Y;?}<3X=N3xAHeJJWDY@=5 zt2V`N3`#{&yf>#q#8{GX`d~*P_(i4WYUabGBvCh~qyS0Bjc5ezQz5yw*0e)8RX0jq zRnVXM6-zY8Th=t`L1%3gh*?;I^k6DSC+zCEMMtfI3XE12)xlPNRi?1~Xs~g4WzOW5 zrfM^kb0;StYrtNKpy6SgFpFeXX>47d%&^rqS|&b*SYH^eNHN$ zP~YS;;dXUC2?ND2$zeOCq66rJqMDLCBIK}yfXbIj(o0lq8v`~BF{>o2q^ksU4=+66 zA-|ndJyW@w((w@K%Phzze?nEwHSm3X@?F!Apc=5=FG0qpp}+b~S#6ouH)^(J^#pbL zi0-M4lvGs4vPwmsSTv7Lu2gcL9;vUn1Km_i`O1xVodQlzw*D2}47b!0BeB@4?6`wj@FwE1>Q8KxX^_ z7Q_XAR(I%8`6mifDt&tYjRG|`8RddKChxnP!eSdS^7VanNRlyyq-@NxoH36QD`5fy z>m}2CR}3y<`PXBj%uMw?M_%1!pmB2IlFsSaFdGz7W1TUO8cW=D^kR$Mbg0Jh0Unej zp2@NOlkeuMo1me>-=6hVpHrR?Cp8WpLl5$4zH)JUu!JsoXZkhNE%as$d5h$Eo@S~z z(!@)NSs@rOygeEOQjoH7wgncJ)iNt>DeF1L@ubzE8F->8AO`uAzt-clFHNu?;yCGj zF2j8gctyYaiLmgZxBIvilgyMHB?J@5H<+Qq7wtD87gf86udu5$B4hA zJK>bpTze|fI)Q^xh+g#Nks74;+#YaXme!;QDI>diw?q@%8No;o_!Pm!5%@yJ$no09 zvw{@qFs$y;U!#}uC&C6s*ky3zwCBS9MqFo+7h0pZ?g_ekmONFPMNCg#1taE3c78 z79`7NAY*0}_t#<4>AjlZ!&ox9Sf8igQum``Lw!6M_kHsIWke@WfU7~JDIPoI%YT-= zR7SqeeGOpq&IBHC(MXI5eF7P@5*qUuPY4iKBGoM8YY;7JOe_S0_t2fiZsrU8&cBL8 z^O|oWK)2JUkaz799p&i4A?S(&X!-xr0)VuJvc~28sp!#E8O5s&{I&WM+mf@}qG#XO zgY9@|`=SOqgGyTLpINUw!?Uh0TY-sOQ!g(HUZAsg&eS);j_p!TZ&pVrt^meeWV8FB z&`gv58bRYpT+4@y0dbT4I+lg+Yz)>at!%5iI;oB}d55l?X+xI+c5@#e1AeE^iCJWG z0&R{u8=_n;^F!};h`4&yykb~*jE@ck1+M9WVf>_%FGAV%>v7q30^Z0gr6p^nid8RW z=4ghde|BCHMNoI=i;Z9~IHEA`6-HHqCJ&k4i&4N&e;5qsCz62s@W2?s+C*+x3*5mexMd^fwPW}Ws1t3NeMI~bWn>s~6) zw@xZA4k=iwOH-te@`tA7cUF>ZCS7zqyTqm4Q~~>FCaWqg-``CIRv@;JHhU9D#lIz~ zZWKA1hc_gg7Xa5ANZ?1xV%G(dj$-UvyR#DL*f`hxf(&ZcZkUy&R%#kfAJ<71M zWeQ-2i_~mL3MyO_#~kFmLxf4W6X=p0-~3>JqJTTjWR{5fh2n>mL^hrseC-|lE?hP# z>c%5)utP+!!ziR;5Fa#l!KMj*Hze!qRQu?8VG|B=8~v_kM8g%>7oc;PM-o~^3d3$& z5RN2SeR=F_tfs4EYP6qmU#VzLA9f>g=AV>VV6{pfU)7M~V&LkT<%Hs7YR%dN^JpA% z+9b1E28!e;FN)=1&5^{_heBLe^Vu)+@;&yVqPJi5<)Rf*EXK;}=F|=-9oa*32q%Np zCAEn?hAa%%P3^v6tDrIM@NVT;L1Qt5ixKu2m)hMRVm|;|js)D7xC>z%}_DHR9ZwZXb}b-vq1X zHYCZN&?RIBXGL#KTyi`|8ads`H2WCm&$|?(gbj+Qi=H~GA* z3nwz@B{w4hXDaJ))q>>kqV*skCM4?=b=UKw&Q;8>AcM0zrWlKtwqNHTOPe|Z&<%2-a-++x-21`p|Dvd+-b`bm1D)i5a7O}m-= znrRF(reuh2JqD8!qMZ{zu~Y@tCU_iK4v_a}grmNWvc-rb3bUFlLiQc$?eQYvpsYxoz2SZ0*p$@+ceX3kJt1jyl}86s_y;mk!@N_$^KT zgi<$O$RAq0PtVQ#r!890mVqW)EO;Hnb2N+gGO+l9Lto9;V2!dIY~xIRQ2}r@sH}b^7{OznuZb)Du)X9Ce+b7XZ9bIYtH6MT&o{beYUES(k^2F6I7#3I=2kAu#1_ft-3{x~npLCkwjDc}uB0zV?k9~zKc(&B~G;O@1 zi%QCiwqROrx>gu|h7kv{{oVRAV0X@?8#?H&`Zb@%C7HX&%pqjHL^OoW_`4l@u|y#~ z_e`q4OJwZk?UPkb_=lLdYW3Zdj2L6%mu8ZoGh*uX>|z$kd03AXxY1EAvhP3A(U?+iZCtwcP1@qW9pCee>_C*_t>o> zg|+czGvUZ8_T-)@6rIVVADjxQQ5FeaJRt%(mS;L?t=jcu3{EH5D9F~FVebTgMduGP zM*Y4ShPLr@(tyA3`M(|I*8`_+Vgn#MTd`cPqu^0$ko);#l)5OmzeZ_U=+c(fr#_xSpoJ9XeDTpiy-`n# z&x@SW0bl3+1^sTu$kpoj{hK_^q1x&=qBTTgH#S1Z1ClVlbAN42Ds~Wa8v^FHXKeIY z-*xwt2QfC}VB|@2HcMmVZSIlWNO&)pV6V7OslTkG+=dIpS*bV_edesCW(x;mlD}J~ z#?{AqIEHR~EgiC}$oQP4gl$fetp)j2stl~TQA3sM7mWs|HaJ{SVjyrHfjASsJP^`q zSMrF=NeYkW?s>xTJt62}ln_Uuh4Jl3Y7%QPw9Io}=mI}MB0OE zJ1OrgV)114vpC*17@_*DC{zGen5XTWbA6(CXTjB+6;;E(g5TwFMp|LDbUSOsQ zPuY~#mh9A_CMg*_7AsLEoB)RygE>6A$+0?r=d3C&gN&$jnWg$;r!5gg*pPb6@wYI> zPQ5MjRHJ1KX6bQ+jIIR%SIl>!`;Cu9#(Dk?8g;KVy)7f__yTc#4ZNP`gUaSy62^3n ztY1&Q)2 zxJOZ2NjPn8iRyP^T+rfp4CM=0mW+N#L(&xBp}Fwt;3$M*{y`EJCu*<;@{2-W*2$#6 z-v@MxU`I{q#s$-)tBn20DJ~dcWf1W|ikUEd|7<4MQ z464QawC(iwLB5&cqggO!Zq^j3}0!cmQJ zSFs3~mgfRUiLSgI>gx0fue^1)lK(FClq_G|bVBOBx~Ms8NdYw1QZ9g@95%>rFMMim zj+U`gUM0EjTuzt28mphXPke4utAO|CwgQ2L`1$Zq_5==uiEkI9KC*-Yj{_t*#XLwfEK{2RLHa8b~K}*X` zARU*k)gG`um(mG3qVnVH30u*6=*>B~OVP`^(FwH$`>OG7)Dyn#q2-#NWa{3emQ#Am zGi&m;m~9K2wj6ur28h%><+dc}JJ(jX1l=;TVr+B1uvL2Z<-0UX@Sx??de7|&x6lgu z*Q&d;OZM;z_D_|!$QQwY7mRfufCYRw`9E-VUi=e?IF8HV7Pg+Q?u{QrOQKr>`K640 zu3cWW1)h*rh67m`gz!b0cmr^M{=^+74@i#`m9An8TD&1+RVvumZ^| z&01zxV1&UU4l)QEGEl%YEqRmQIK6*t%l1&h>v66KyI_Oj-rI1g8(4}0H)LqgYFi|o zHYoNA5KCs)oUNZgToj5VE=5E|6~8dH#})^NyDA6$j}7+px+NU)%7L z`VsQX^Vk+&ypTbEX18WUc74#?Dovgv;LVoi7Xy;%1R(Ok)k>p0`JDP!H={0an1&uO z;fu)gwOU*|=Hcj)bePB}bI7pu(rYMVEpA~#_fc)NUFgl4B^sCSzqNPTTeds z&Xr(9{-a?fXW236avkXq;aMdI@qwtQE)CVh0a8?Jib{(8e*^w9^SC#7XJM;3nM0kl zI8`T~xphXmVcX(~hQVYj@#HJNGS$C18o%ZTvS1A5u&bzkBm05`Kw(>w1-k<tbVnE@?M*|fK#&o?B`z$sNAZ{`^h2ph*3IL3NpOW}63K}@ z-6j%qh9AWVHM-JJ_~ybHwF{9506~+apXZS4OBL!w*=+$emqqve9}uqpNDE%FKxp`% ztZe^vJ<9ywE4TkeS|X-qhORa)|ACPxnL69s{43=Oxmwzom^%Fr&5fwd*kg;L{Kj6J z9nNe>W(rtNnroIDlWSTOu&fnZ+A1Msri9gZYXig?6U7bAkRght z%!w!oqo;T5fT`>Mk6ogk7xkRZZ*;TV=^!VVGh-fzWp{SA7e7+KPT8 z1#9h3pz^XqaAMavmQ%(NxE#X(+d0O@jzby9KDFi$rj|B}WzTUqo(yxjgcn->S>oH&8cPbW{WTL!~b{c zhL5%f6QYtVYL;Oh*>UXS-d$qlCDTuJS~7KVXq(kQ%8=OsgcLa5Xu6-H5iECb5iED; z5lfHV0nQ#HV=O3)9X6%G!T|CVwmTGB1)X@6W2>f(Iy%s_WpK1G3^lByCzZH?255F2 zfQo9&EtBSErJ}K6U&BqKt1fLGBKoN{n6%Po(Yv-BrtBp%2ZsC=jRNLAhUzF8 z-sss;EFDd%)K@cX`8C2asd+t-ZFAv-*V37MxM0P)`Haa1R4aIKF=#+^UxdQpOIB7Wj{rIf0q*A~uRqo!3=cE-Xq<4EAkZNZ9^U3LqkrD#2pcDRlxbw*ZZN9X_y>1xbEyrdxB zBtU+GPC)o-uR5&AgDsQIGU~zG+!g$$?54@ib!_8;iA6NDDE2}Qd-+8EZ0aXw4XwGt z-qMHipBb@g_`&p)^VhcEmkO+0GR^+$8NB5K0<2cBEcc$1C6w~#+h4t;^E74r+50eV zKzv^Q2^#2=)aeb1{EijP0T%rqivAG0dcO-|ngNEH7p2TxPm4UMkX{T(YDUE54C9Xv z1Sk)icSc-E0A@M32_VMBFZO>8M1(OYVc!1&5&gflUHt#wr^UZ^kN*{vZvWHf!E1lH zV&}r(XA6gjqR6H|1wpkgRBoJ+IFHE|8I7N2heG3qd;SmR>z@)Q5+gQb{!4M_YZ^&> zC%Q^@derTG+jYAA^8N9BO&(xc9ZEoeDF*dOghYfFf;b`!7mXA)gredxN(_0JolY{$ zK`$NQ>_=l1O4wO*Q?VRW*;9^|XMfsg8a7_)nBPX*_O-v(43Bx#ZHq0pvY<^{G?GBK zlm&Y%VBZn;*lS2B?)9x(Wl8oMPE~cY+Df!0 zlh$f|TZdCTQSW?Yd0V$d$q3?pTuo0I8s^|CSIZ-{Xn8uTHwHxBrD|rjDOcvXEjhvV z1{+2gbdjyut;meSw8v~d>a2wVj{zk)l=xdjoo1U)MXGiPTKRi@Hly{tmU*~#ohxsn zs3LV*SlfLQj`N=UJu0O_d%H3xw=jF#&g6rkNzQGs#B8$yTbqpk)xrLO$e!d7>{l3> zN$p-_SUIfa_lDdUYSv_HG=~nxSZ0(X93z}#6a$PNKb}ybEtAa?Te{RM&Tl^Si~cJZ zH*9(5k2gB8@AhlY6=6?6I*&M8jL-eaK*Afe1283vi;48kM% z7T_n)F6URC1mhMFj8_BCvAkhtmOnb5y{iGr;FmhcUqT()yL&>Uhak(hbI{@U&2N8|C;Q;cZ0CJ*S3>YsXi7&y)-GaOp zA{PdQN)WDy6siHZFsU*Ff81dN0-s0-y+x7Aj3Mpn1Y-ZyMc%Df54a*9Ar(>sKw|7j z{{O1$53h)n(|=%q%l-c+H1Pi!1^^Z9*K24I+BQx4@h2Tnzm#;01aS4k*=Ut~BX z7X8SeAMbQ6gK|4Zo_tS9+O1qLU$~`s=iUAhO#CSq(#JiLPx<Vx zUfidA!mols;wz}Guk;`<)vHwOU%{aBk;(9*o!F~rnDSIW^)3F9hKEo1b_;RCEy`6n z=y9Z&wqT-pLM4-8YuTu)hO!<=G;T>Uwo27aR26llVj>$#xeyN50sk}UtExf$>OB5k zaRe|a={}D6lvN>Az{4PmM*^=_po3R9t_kN^4)u5x=)&Jm2(Ns!Pn9xGeC9_&h;f|K zbUZKT8N-v7Bo}A-Uz!REOA?KON zqm@`j{QyH=ooG(=K!Ylm5?_|JuF@Kj#F-)^=sNDKi2K0PnJKRheP%_di@K-^Nm}C4 z6;V5RX2qyWD`_l!Trw=+iRCSD zEeij))ag{giH`JCap#?62{c7VLP@819KGs+^r0k0M+`=Yb{yGc(DW zqC+jQPPst1H+ODZfRnv+f_;L0@tQVeOKL(+%C6|hjmk+p)2HlMH??egdBQf!Ji4zhEI=sZl%;U-<|QRWJQDY5PX` z=$opW)O}%yu9HhZ9b7Vh4AQraiuoPV=yZbRo$?()7q^s1esP&Og{NwKcK-H}%7>&c zzp>#V+T}TksIPj^JR^95I;FdEoL_Z6{$W;PtZsh!(lVo4@ZXw=BihN&4x+xALH;9m z3eWT;{kbOng=KFQ$iBkOSIYMmsMjfcg$F{*efE@B#mujUugFQUsl0_{d&>71JAd(m zuiU7w0m9!zyB`5aPNMhOly7vUgF`uvn53dPe^M>~BJjLqwx64XU%^IS!FByY{N&$? zN&SgmqAz{!BY*BA`?CjrxOZ(TKateFm;RU~{5fpZr1a3Y$)c3ZMGP@H?7L ztjaq>DsDVn0{q-j@w-GS{E;SHpXSN2y9O%!v9YS^2ziA!klZJzRC=TSG{Xj^y0V$mhc~q@t&MHAxnGRn-YKg}s!QrBwAAI*l^PmjhKj<0 zt`3Lbs+m)}?cR=(I~Mh!QntFX`uSt$8v7R(G&*NnS44Ja3==vkZJqAQ!q(pI#@5bC zGgD1VTUFLz&wB+HZ=af-R@xgd{Q`t$9*0|7(dMEri)d=3r z2Fr4>V`@WTrGrT7SzTcB`K&F7Q6G!-<3{Ke_Ta(U8b|4%(ohokT9N=vbdFTI8rUF$ zD8Lt4yk!MRI+xm8gASWW{mOWNK^`BgZ7p@Lq0IzfO@{@94WQDj`}q-aHTKV5zNxh{ z!?TX}2rZwP+E7)n0Z?`B%AaV28z(2%$GQ1AM3pg7i}kkW0Mfd)*y`=&N110^9gycr zEH%eBxXvyhv~=>xx#DPIY-yTx+|eh@AmC?2Y%J`g1d6gOC`MBd2F`7@HqUmpb|k#B z@!>FmP_X!F$e{5Si^6kYF_vaT8rDSn<%KkcCRbSb+XgkTyi zxmu?<+W^@O7_HFvwo;Ec;fc|g7g6xaV9q>+uP@jMtZ^(F!o%Ml6*cDris%FL;n`?fY^ z7kapDK+j3eNy!TPp-_22FQ{_x+KZXlu454gDqtlAomAo+m5s%Svc_{pVH9>%tQdKD zB%)w{VKXol6uDN+=HgZIf9l7x%cqCe2PBv$BdEIRtVk789P(@L&S5H%LnXpu1xd^s z${M&9sK8h|e93fiUr_I}(mc^QK^QY%h+*R5;}_#1+86p{@B{-tKd)e zhGy7x|O=$j=|zJs8cF2BRWAX8uz*~m!{S=Z%On*e7`zh@-2>xPC(U{b6`m0K|J zvWVp?1Z+KSMND^?`EBv&k=((k8ymBf+|TEPSk@()Z&+(QlK_YO5*iVCH=wh!{4M5= znp8Z}!EtqCv%tvqVsA$_hL~fAiu=7kP*==$G?JWUID=7MWZAbf)De!G zz_ILU7N_`fT_um<51kdj1;54IvJ@Rbt*6GB_G;*Ob3}`x#qhi zYJ*?LMla5AL6$8e!{Ri{M((>Xiosgklu@vYsj`!fnTSdWeVQo~#juH(3L6QLYLtO# zF#-A>$E|R>*Eh;#Ict-`nP&ISwDPH;%j>cfC&FS0mx+w5KP%i?oLi79Xdaxur94Or zQ%w7I5ea4l7{%<9WKP+CQ6Ru#g!j}^3a)oFoRb6}Yr>Qmu@Go`4Y4rVC6F!jeO`wI+x|oC(S#oPYn(b5Q#-G!1af#IZqXq6S$<@53zWrvtV9NJZT4MT&%aS=?`uq2SA>WLMU#5$BZ7&s`L z2Nl7$LVa zBV!4gj|LB?t$H4nW&UA~*S;1?qx`9f=0rzR-iAcZ^X&LV+ zS>6uFu^@JfTE^&Pw|9$D1~3M~VzXm3Q+PJiKQa<0lI5`qB+&$1OmGNo8xVDN9Vq~o z;$?pSL*}Hc;ceZMix5u8@X?ff+8`(sA938Sd@xH6RX<|a;Ky!mn{*$3rC8iYxv-1; z2OAQ4TZwc$8iQqo6m>sLi7f2*)X2cHpSe7qTeEjzIjVT9M8**>_}MX%#?gDLW{FFw zWT?Lu+{A?No;+YkhD1{;3Q?PsNuj>H%|ucwuHg_dswzs)h`|rtZbKu9w27IO$+2aQ zdb)(QEfo@bSkA^O$#XYw4sa0XlBqPC?j*ys{9g#VLa>;DVIk4ppaH9tG77?o z5Yr`1b>KL_;M?f<)N9f?Mi%eP;lldf+3TC%N>j3lyqhG9Y>zE|6XVb6rWMV{`Bh-L35LqhQGDv1@7_Roz6C>du;$^;0&Y zLC{F>a_7Psiv_DtbmIt0hKrv3V>AlpkVqz4vM;PTJRiFpr;;^$cG`h_4v64`*Ts93 zw$@I!GmBEP2r>X6?~r+}?Gf9S9a+1~%INJ^aIdrW#W1ld<2{nE7QLdhG}17>#ByE# zaAA1rq-W@~5FujMQ?-MRm8vXZjiLu_*}>=9@py^{Kd|VCb&t$fFJda zHqer$4PvPhc1O4=jCnMM8wtie-(s|fxpIJvZAx2TS&`8$RCN?G-q^z+)`)ZY9Fb(; z?r9`}gafbg8lqTL@9!1zdmWqEJZP$x9N0M4O{QFeqL%EK@FXQmCNEsiF;%=OU(F_M z+=vXVZxLI|M7;~$;-z%3Rif0S8c8fw??%gAj5mi^{Wl^C3b|_cz$0!5NZaCiMI`+u zv{N^W!n|VXDoSLYM5C^S*LbB;EqXc}I#Tuez=LN*2ve(%Tr1#7h;)^F#F&azHwUE_ zq^heHeXX_fF_L3Ysye7l+W`?4Un?v5&ePM=2*pf8DPj~sswl?e4D_+QK8*oYTceP9 z2RcS|R7r-an)V-oSum^F>SkgOwHjqCiAc~ajjRrz+HF)T9uNrlY4609Ms@jy`PrJV zWDH!ou0XNpy*^LS%K@#RUG_HPe1@`VUQY$Qc6^o*10gEkBwW6`-3Y9&RwPm1%mDpZ zJK2MOdhb`GZWV0&i@tUhEaP$?uK*yo*Ne5<^2JtX`)UU*yG`2cgAK^s5+#bHl`qp# z%vL0kKCU5<>=<)}p%9ARa8D{pjH)pwV^~BusoeNB6WX7VUvrB%ShaEdNdaJLhKaH5 z_c`q$B*crm+;Z(~=jy`rxTN`*Az*Wd3h0moCl^r?|Feb*Q0TWx+Z6}~ZZ0(we2IOC03KHreT$AkLFHOuK#@s|MA}YVkzh|v=V7-+1uGc za&f+GVhKC7_D<cwi4c?$+8wsG z-k!||+=5|;mYIn!hp6_G)HOs2E8p>(&9_J3 zlkTSw$jP*@Qah+w~GmnFnjy^DU)FP&v-Y}^s33-kRetm~ zZ!x~rgtyR%5d2FXp!x#_fp>>7WTAorCMgr_wvAW}Q3vXC{M8S#! zD+)Uc2X;;^OK%J)Fx|Ex#Es*uq=(}mFzRSs^`b0hi<&{4$x)50dSk0rKDhjmfy~@v z97phv>!epoULH)r_sNaeJvXg3@vG_ABS|BgbLw&sJc^NP)?^ztk3#Z8Lh}&A!2aN>pWM%H+Oi$8 z^TUZ7mJL~bfs=^#L99x~BEX)9<4|A8_@#}`o}5~I>8zC8Kfb-E=;Yr+zl)~m$h4&^ zI8l`wKsw+5^jMg2fTYq8s)r{&H*I9pY`SI%Zj2JjFJsbKWv8gV>LiH&gvOj90 z_*IR%KWwu2arX%u-!|%7e90A$`w!m|`T5CAY-4dx=c>K&VtL1ZM~sT%!sZjtAdkyQEH4&`o6a&xf+oR zI$!cYCq2Cfc5w};gxC?PI)Cc=9N^JpI=taWD$@mBMDBDkpfd> z%19#2Od*9`Udy4#cq)8ClA4A$>`pX@DZW#R#Xpg^{=$^eK-K;OP|e6%eP_=4gX6E4 z{7^iR`PBUsMAk!DKr16xU3BMusB%hg@g@3`MAkzUtNb=~M5kYntxow)Ny=Yz#44q? zx^{g97m9BA1^ZJv`0qjc;~d*Jv-|XVHM29=f2Nt7o18n)DH<&Aml92&&#}Yf_uGa6hzi&_9>MIXrm~`b2)=}bvI@T}x zZ)WXJ&At7aR_wCmcIH#-6WsAPxnjsiGjE_zw5-a8thzXhWtj+_Frmq;xB2;V4}g~x(?Ngkz7ftfLzWYff1vTb&)P0E^W6xns^i=|ST3qrW_(RLGi zTibi%YFAU+8KZQOne*C0f;)fXJfcuvoH z3u#xwwrskcym6qrupqN7*P@NDjW4S1tZ|0cjln%p+Xj>#Gcn6vbA2719EuF@K0kUiEnCVvXo;4lg3{V`TC})2i`m%{mk0cDIE~^wbm; z+Oj%Y9mUk&`*WDCOy2dIYnMuFBe;RGb+CtI6ut6wFh_hay5)j@Y)Y6gYK|+bH4Kr& z;P{rv{TDWOw=)Np&8~quNLc|}1b9R{ z47DB=npBGgAeWf4rANv?ViPDMY&uP`^|2~8MRS~+3|c&as$=o#!g3iprTonN{qn}F z)oKl~0}#7xa>i9_R#W@ZbDSBs`4Q^WiTYv+HiwdhkWsL)G-GU$f!!vc4@p()4>s>n zH3Chtt*A!SZL$ORhA_Dl$MQ;*uH4v@jb-A&IMi{wD{7DTBp} zvm_8tD95gbOecfCe0~Au^>Gx!4r2$TUTQN=Ay@_S&95TQXYq`p$(7q{7u%)Y`6Sdl za{||#$I(-kgNySgFQ0=K8OeTxcFaE?5_c%+Bb2mBY9X<$Bhyz4D(D4;ikz81Okx@t#~aU7%Ue3ZrbwBl)qzr*w8@<61GcGt|@b!#F|9y!4`+tOQxx6xqnLGCQz zAd#Pc{$!Ltt*#(nSrryYrg#_&^1CJ@Umx}+TSIb>)#GK>53v1VrnCaW*+hHZ%@y-% z;PZm^e5!T&#jJrr;o^~$sWLsuxZ;Z!u;`HGjhNei{OH;ZH0!R8)}6v@M`x(DfFUjPSPE5jd z;df`ELy__KCNP;?D)WaA(Gn#9z)Uf204TI^X;FnbaDwYmn&CYl>n;SQ4(SFRLTm6q zwe}^Y8D`w(#cbg-et3?PplPgXU>wx@Dh>1599}QiC^75><+MYlPvhQVA&jyzW*{KX zhMHI=rvc7_!WwmYh3iqo?1DAHxsNhlF|vhYWc&$uI3g3my-kf1xHpsyTuhUNdpl*x zHJRHPa{f`i>_XxMXft=2>C0Sj&stN!{PGGo#=84mUj?p4X}$E1Q+7tp^Mm0RHYmv= zk$aZQEbU0S?|V$T2nU)zA4z9W^-|-Cr8lh9CzMbfR5{m_f}u8dZ%rKzf=udSu49TGG$QVNY( zLySDeWQn{Z;44bUnRmJ>C6%%%K^WLQC!7PU7kq4a8svQk6UF(6OI=pAuxfF2!9Y%f@QXbFS-cmTEgyl`@p{>h zSOQMZoo9W8Z&JG2HOe-$;_Q^yWxt09;*4A?YbTc+lxj+?=uNf_ttV0qIgwgh z2%hCDrU*P;OJqrR)TGJ_tUvIxq#B=ouY?dyeH$aG=Fm>V;&R^E>iL-mbmod`z>U-K zwO4LdN;&pB%8(Wtv%^Tb@San9sJU*jH^`_~(vXuVeYl23{*t^c;6JI$(yn+P`&Bj% z%)r*SQIg|0T)?l2D{9Pvb{S>fdsj?0j(H>xp?sjn5v$VIIk9W^W z+Pkk!1p`^|uNku!{z>1NiS(K^sd=~L&HQ1?@$XqW;HVvrFNAtToYBs3=; zPme;Z_^OkY!8Nm+$%=_o1s=j|-VFmcpqcy9!?$|`LIoxYZ~s#afF zS5I55ue03<6|KeA!qR?oT;Mqj=PLUID)+Arb{{QPEWepHjJA8(VR6=G)aFKJ)-byb zTALU9<*tYJzMZu*YX>pk5RPx0xxsC~Z$u4=1hU!UAwve|1K-ne7_nb3 zPPQ;ryx+8ihswr10}>x=HzRr+F}thc^H{QvG$-SVUXY6?PvFno`D!P!8tQ?$zU5f? ziLFEYy`&|gw)g0>HHtP+IDXBfK}nPoM77n1(;ju8)ClEX1zgP3Dk`cAb+z>6m6d&Y zPf{*BF!i6j3FDv4e~CzK(!tmP1pvv@wSTa}f$E?2eW1s>dF%!+pSa1*-?lO>68{%fBXakr zp|gygP6YDhhye3|wMJyV(qn9qBMVMNtV7;glU@en`S6e3GBNAdypa4|y?O7l_c@oU zo8^P-7$hJ3Nrt4+e!nga?=)Egi#*NoEcP{nVEeykd15S7g6JzZd_CLCLAAtFbs^;n z83U3%9(s8b`*2UDiK@1CznW?j*=hA^yQ^j97f2)C1q%9JMd)MOALlUNKzVff$Cl2v z5nmpjL3G?ew78-e;6x^iDv?z+9fAl@+X#aMH;7Y?j?;=Z%m;n)_}0HG?O6K6z?#J+ z_vXO|1)0eHU1hzjv#aeCN7UPkhx4&unTP(MBqoA__+?l()F!9KXPLrl*0=-kD#^1D zJI5OKRj~S`{epUh)`n|P;2~GQPyT;+|Aq*?Ibj*=lQ(J8Z|EHWYG3JIL~0I$wyw#h zJOR1Iy8&m=!f1Clxv24ga<;kaJ|6yT($|C6c}sV;mGI`W_`Y&mLI)rK`qn|LxO;?>or zW?X+vZg5wIs~yyzGpCKnPuHgB&DJ3Hpd-r`p-G;N3o&raGVsFEG~xT|jeYcMSRwd*%}DRnEI!&P|mR=01y zTaYt20`+P(*qJi7_bJRB_hR7ac~# z?42LNHvH%(;inrJjxYK$ELrxC3 z^V)lThAu$rm5{~^UC{HDk%eh`zvq=wdyFpFY6G<)d6!iArHrmeH54}$%-%W2;Asy< zJFZ^%u~kt8XJA9&2bg0EAk)aXYlLK=6R zO5!ik(|Oo^gyEpw-g|Ls5PE?>yUg$)r!E7eGqi*_Zi02W1QL}N46s5yx3Eex^l0O! z0ah2jSp&EMpEp8Uy?B1+H;9~>cRr%+5lkz3t>NcB-U=l6`k_OHYf}?~I_p~eAj=*U zx3=La#gz`|Gt3|TA*^XmDKnfG5hVB1l~E55JgOg`YLe}jhxv!`-p^ArfJ&x5><5V< zP;a8@7uM#DRmDQ+1}##+b&Iuk9F@647v9l2OPbU**SZ2 zx54VC!~0HTGk3xHg8a!3C18U-5O8n!sI|J#vvG~Yc`AA_Jvu?+1y8&<9OT(<;1iJd zW@WrjMf$&RajEj4$W?8 zDQ-i>n_Pf!WCBwOb5Y%_@`I9}hVi$xo zCJvb6)DBP)o7eeWaYZk%FsWIg)+d~p)LitGY?7qH`pX~Sp%|$SyoIxAoZuY@MbdJ7 zH-I$JrKqPgK&NDYj&*#5P|pSPdWDai1Y?LhVg?1nHX60H zn%zKHWx^$h;GvxHSKGjq#8{k*onL_LImqQir*G(6J9Br85^)SSOJVXPJVh0^z3rSU zaWYYGaWvcrclQSTEEHTUO&09i8?#po(J`W~B@)z!m?0_;Ltk-&p zEm045{7u_1ZfYoZ$OF2O?9cf=(Zjz{!#yBi_2BEmVT3y2V&bixQQh|BOGiBbs1~gp ze!a+2_eQ9}!D|H|u^x@P5vwXl671O;;bDs6oYq|ixO#cR`N(o&haS9VCLy-tWdTI1 z!lgb`GU>VwLEU&($D{eN=FrX=b{RuMQ5kAR*wb*%l18|r@)2z)rI^y9U zwh((mSz;FruObFl0ela77*w}ITSHft$jDd7l+cL2VZ7ETw5%o=q9@y9^by=539$Pv zp+zZqf=&Ktmmi!Mg#7XHxyG~D5YaFp!rynYAohFP5+1~+ZNyL!IM7S<*`?yy$_=JB0dwW<#L#Z3qxwuy^kYUQ0%Oj@XqTeo z>S)gT#~%rrCloXT{tl7{p51H^QzgI$v+w~iy-Q&H72i+JYifhdZUOu2qnwRfuR12R z)+TCoevM}izW;o(~p$6Xd7|JO#)NlhUd=m@-KV;q8YXLj^1bSKp+f2;o zj{&I>pHpT$1%4@z6vjcIw1D3E4)ZlxK>&X%;bj)tXp+Gq+J$551qQogHUKG0{O7(U z2T;DRi*7*pxsmu*#>ubS&s=3mgQAj&Ys z2)uIUIOJlk(K$SPGMvI+#RD?r=-~IM{e^#Q;#xzNxR#uLNB(R|MQ`H*Y6CmM%aQ+?YZ5ebng~+X%zKapzDMEk`jSydR2g?nQ?Fif0+HZ^MC&r~c zy5QohD@CqdrzOft$hL-TP;_u$_~hy_kof!Tw+M;(cb#mAWD}*lRTg<449@78k(v($ zc>eYeBN4Bbd8Yi3oSTRd*r}_SI7bl1g|&p=kevfoI{QZ|L8yuZB23c^>QQ)5vr>Yh z3sVvb0sZ*6nu)|Z`?<;4!-<2WD^qmBw2?Ctj}F!dL9%fIA~L$?5chr>tKy0ZaAl2} zK#8W{HWuu$Q2Db%ZLyRb^=1d%uv;x-Q_kX?8(YD3GXdTV*6cH(M=k5np)k*NggG_C zQCWOyRrkd3>H1%xwWd%UU)XjYVumYp2pIQFKs_K|n{*<__Aa z$^ERz{Q%m?Z5+){2L<17;Tvz_$o%T!d~KirJ4e{y&(}@_-E16Q02~&p*O*QW@-rc+ zm~z(xh1h@;M;G!~9Wo`_xUws}7+b3oI#$`d> zx5{{ZmqEQRugUs0!+bB`!?i5KkRR4`t3A?`0Aw*Cd{71xC}RR0rqWQT zgbmo3a->iZ8$>42dZ-HW1%a;37X%CI9O#JQx#qI$?k)3kGb-I-~IVA@3 zJQ=>1Crktt0%KT)A-MZ5Eh z#(vqzn+_C6X&nmU_5`xNoDc%00v0KZ%V1FYo%_K=$-X{SQQMNNCp1DXq@qRI@a0QUUL5}`qgP#YKS&;~iEE{j-;2q6#S;?l@3!-Q~>W#Bc1 zqMXy;yb{%NgVES)ALWoE;Gx75V%F$q6m@43c!xr**)?PGT|`;x6?m>fy#hC!@C>aS zLKo=Z``_O(j;a?VuxUMABkObycCll{e}1OL4L3msuOS&M z!<7hY zDruYm!*LVj7uRLjZpz3o|})yz{!Ph3_NkOEMajh zanTOr)&q!)BR7O+j4i`3{h_^`Yj6lWW+gc5_%b{8#v7SMQR*)k*p z0rbqDd7nt$!O@upnTvk|Z6OZXpbf(y6ifpQc7YFm&~0Fs*erJuEr_;817H^``UI4W z#WJ8nxfAva8~6DoV;%Mv!Jw;i54!q%ifeyLV%!zz;l&~djD%K`z=cEunQba(0e608 z0bYz6jm!ZBc#HDAEo=sr51U|bh=N(nhGI%49P!#WAnPBk(N!|m zFQ<%3ya-bb^vr<8gYn=6VX+YA%?MJaXUmW|%ME{VnZS~7)GJH>$2L#zrSTubz_&yV z=GI*irbktjv^)r!cr1-lOhhSse(!fOAK!2vU;CL=yuBwwI^CI=6IqsNe>}$TvPOaF zm${oVdv~GVpgBqW-xw)G^0qlZajtzaW94gRO&n=H>BK#5QMU!xL}K=-9mrkO64Mgb z{@2$5hwfRYx#`Z#EK$Wd;~a-(iFMefdVpZvy<+_%vRK8Nv+@Jczcl106*(C7lp&w! znv-~$IeF^hG~J1&$W8JvxlX~;s^SAOt}H3#hxs}= z5UN&i)r#bTJ(tWYYzJnhKgX2X;n__8iVeI~f$ zsl<3JVJpb93zd37$Ee$f`nZy#l(!9`Jj+oi`GY(zb>(YpgGMKgGClj1k6v?+IHp=WlK#o7i1ZAg8rTB<6BK`C9OMoe@u?#;>z$T)7L zP{HPTNrslE@-HqJv=g1{t(t_@O2V@K8F5wJ7{;m5PiHHT){daNE|v~$1nP7#p%hA2 zRS2H>cICix?feIRfXB|qyj?AjTNOQXf-k=?W>B~eD7f%jGA73%8tmCchweQPz;Y?9OjuT>A6GmA} zUTlMfJ=BSnmu$*W>J(zyJOq7Z5tiiwr%5&ZQJhH zwr$%^I>w}GYNn>!P>dz$B??& zm+>b$^e^z-JiEmf8H>2)B&4|m2_;wMC|znHaQL3uZRJ7cgG}ruZ;Z=mz@a3q&}T4fy??6kW#V_cv)$8P+pX zrFp$6Cdh()@^u^y;KCs^UIB zH8VO^_Uo>LY=G*Ca{d5NtxssZ5&afCJsH*fM8xB`f_1!S1NdC59`T#a<;Xy3k39Nc z$%80YZ{%~Kp;C4wkB7Gn$RCyz#I&Dz^bhb%7Ny^mTiNNt8^MT7A4BzIIuW zxS}|G1j(@h{jn7K#=xT{8d5omVx;8dzj+Y2)YX1#KR_U_2%N8uMjCM1-E7E{eo*sZ zf3;LYPfl&vmA%hmcNYtR%;dO$^{nW18X=qM;QZ-VhV8arF>Z809@9t^E-6C6PKZ^G zDSczpL$zydD9v2dyD%qE91Cqo(=Iu`Qn@O39Xq?%JpyO%;pBUSpM^A!cZBn2D{IU{ z=Qf3#qs#hr}6WW zv%$>tfPehGU^q}3c#K2aVm8=b;vLDX10UZSFGw$pR0NC@OGZZ|z8GQg_F;O-{ zC9)}U=AaumHWFAIDz-l?shKE9=+$89@7g_(5{OzvK^Wq*givJdM3cf+IV97NLk)~q zg}PBQ&OlGpn_;dQppFM?d#;(jVK2HU=Nx#>Y3RIh55`4K`T(b_)B(|H>RqgpWcyVQ zTArIuI9;dhUp>y-5aQV_5TEcs*qp+yLrIk4`T_2-_Iy~;XF>n4)v4_y?Jynghlah+ zh^iu3k|^F8uyr(UfmWfO;{1)wGZ)Kj*_!DHHaU_g^w3Kqqxng8Yr)8?C?Up4kKMB2 z{g1s7-nj9Fv|b@$9QdFHvb}04T?E3N{_b)|H)|9bX<^`_27TkKd24x&*w2yRtPFD(VOk?~iAXB-valET2(|CZixgd7f?az9ZM-GQUwW^* zPlfwH4}C@!8=mQeZFX&s-4nHgriF{5r=d-;Q)iIB>dj%8MA4vN-PZ?}_2+j`gY44F z{3ag(_ntwiWgsKqDAEJnw&aiW#Qdn7_78=xrS#g%hhuZ0&s?4=S#ha5c&f()U!Cl- zR%PeLyD_^liLq5xUg;}wsl~*#M&tffr~#fi09V_FX}$fM?faM3>=4>@Fk>HKx;@iu zuvoyq-=PH1IbtEX!4kJj>jUroRK8Pa2R9zGxwL^i{$FsbKpxhRuBB3UE#3xbY?OB+ zIfo;4rD&#gYOm5yN*_J|{F!a-G}5(0DH854uEUPO8-X+Cx8S?^=dyH~Gz#Xs4l%l< z*oM+OSo!J9OAAL*{+yjghDi9j=;r9)#{Z2ap@&TpwIcfUtHS61(VA5>G5Bvl#F93+ zKFY|FFZ23RP7Ep%(C_{vV5LP_rXd*=Vv^rLsPY5KuW_mbao2|($U~%%4sM&c==Ph@ z4(vmJV(Ox)2YDUj_BrSrVzW71kw%7({p?)--mw1uLMES_zMk^B@iN&?%3f;V=Xs>~ zCB5(0)NkIr1_fXHGXQkZMSn)<$TeY?xe_ng7Ol%DcZ6HAE6Jd=$U9V`O0L;JZCDz# zXb}Qz3PauG9ZHk8hOSH2c}Wg+E4IXkJ}s=dHw0%~6%%!oc?5=RsXWV0i}wYCKQlCW zMcBQ{o@$eM`|*km>3O}Pa(HEb<<$1yT}pU9q454RVcx5(`QM|Hc?WWuYEP;zJ)VGg zed8li%U)JDPRA~kI|UQAi_CgT_u-X4;v-s6p2*v~WrlLg-9txr zir2kF9{HBOgoePK-w9Fi=dMPS--9CL&YqYnAo0Cro9N4)*r~o`hfN0}2@kc9ym5QF`V08knef*F)a~UtlsH<1pym2<+luTp_R3Y&r%;_y zTPS#@`m0sdCz|JOKIdD<7piN+pG!5tP}3g=etD*d4hf))f-A&l4}(7tp33qi**ej9 zr=dH{EKOlkgEnr`|bIZ;n#Wu6s8J&(z(wb^-t^a<#L*mIMCw%rCls34(o|{PZSSRu)s#SlDTF<@*T!Rtzm^Y#!gbvp$DR z$LzDlq%`5BHncA7xl~!ZHKWZqRXMR(U(S~>$!BP3Pd7iQz{Es~tJIwJuFE;OBdVw8 z38SGI?k%yoVw>O1eo57s))9t(vbHU6^RiONytJFPJST zf8sB^3s~a%r zFTjm23`n>aW&bIpTS!r1&SZk_&5&zZW-XX38A`YI9<}|Ys(VAfoI)$0ZW% z-gWJ2cHc#0DH%2yK33n1py`v2z<>9`>{qX73Wl9uHLxeaM>kHSEFqBu`cyd<;j|fa-S9%nVVwPdNnTNI;oIcY-0fVGpM36#`nuNO(t4k-1ub`^C+; z^4GD6gDZhuRD&Tl@zxd;V;3lL&IIjDzx8y}ox(jKv5bSX4dVX);W< z2&rIZu#q&DLAPN&6<`5F#EYmNYfIA}nc#BtnHx}zGH1ae+mM8nr z%C&4!J*?d;GE_rcWk>;(ue;c0A2>NhW=ob)%}bP#4uLMIQRc?p%6hrU8t!(DaTSJ6 z3mWH!Y^j(azd_Q`wUnE{Bhed^0zAl5f)tLMb{E(25N7-vS>uf!hAYO}7GmY5AD@?d zaMtGvaSC&Sx%_>Ir;nGc- zrLzP_gbf4xWscv9ZBH8^wjoxX0oSfwLBD?)FVO~~O`nIu?TkiAjJSZI|2WW|Vws9s zMnYVaR1`>%hb-^-@+pRbSWcG*`mBf$COf00wXUXu9_F(saPRTu9e0>4v90R<5NIo? z(w~u8vx;n7Oge#hpV8s`%x5hhsvx$jL`EM4Uc)v2G0)gB>|xxP^zD8mi|>s@F(6sO zB$cl}JGt|FAfBo-xbI#BSry+Q<(YJz$Ywpu9q5vH_8@99m8CJb?%oi;Pa5%++k&EL zuE7gGU^42@nFK&HL%pA0#6N&=p8@!i+6ccl3hnYlw|eo))w&AN3=V4lCJv-{T{>G= zyqH;@(Z#$t2W&-i3e(MIU+-&hi<}9G0^mE?(`RBmGAR}1LzIdCX29h$m0}$cOGV)h zJlMXyb-e_$OFo3lbZjn53?=>4lZi1pbqEW#hcop*uIi3@g6a*z&y+5Mj7xeK1LR9G15Xlf$nK{V5EaUleVZkzLo)^UzZf zUw$H;S`VD5HH1B&L1;8<`N1FKwFGy`2Xp@ZR$y19&)^bXewd%100_-gg4fZX2TY6l zXfNQKl62>jj||dx6ME`5Xk9qAbwy7%)%=(vX#mkazPMiIRP!(v0uNkKUCq&N3MilQ z5(Y@(YH>sMK7m%-N*J4-hwX+!rAtWMqx9?-p~sFNc=KItq^-^vrVUCDk(essvR4Z$0XtLZ@ieI0 zK`piVYL&MXmntug$t?p1R6Jrs)VCE-a=nREop5$#weWZfdz|jNM^-PIU`9YCWtXS3 zs+?SsTb1qHtfed8UnzZIOrZf`*{(tH#m(k_2KXk@=Q1Kd!X(L!Ku3~P-EY$oP9%}cJ7!}zL39^s``E>!n4nIQ4UisZ-*fl?{G1S`LT0uJ7m zbI0P)%O}T`lZzX^l#S&XF)3a3+8AXrKAEcC@ zlw4EB>5qP@Ww7_Asr3`5PmWYId3t8@SCUk|<@FQkWjdlw)Mc(s<0%cORNS#ss_Bud zdV_SP@=4k?DjMus;+lGe^$lyBR2PP&RGp$nD+zzu9%zI9aS7>^-s|06p!x#F?GD+? zKTLh00m%D*kV{d^^;lbR_g|`=l5+}?YP0L)iS1hw=0+IOQ0TwgbZ9d|i$Gkm1HO#q zFZ?R*H(pfty}5xPAA7_~OFJSHQkFG0M8Wz?1hcGJF`}=sb#Sr%$yP5dA3JUcz5RM% zpr^A`>5ksXzvq6{q3X%BeAe%iH8U&w(DlVfeXjK8CWGz<=v3ckQ|%1l%kLRT!+5jr z1Y%YXn;`3{b9S-)omf6Qt#5L*QeMicc2&#NIh06#zSRXwM6NB`dm=Eomk&CXVe?Ej zUEqhjaLqI?z6DqLvid>*?30}6x3;Ri;(ajy2=_V?8`?LxH7VhSUzxD0f7`%mSs`@! z6YZ9NAbwGxdZ~P2w8!vI=gPk%Qu#&jSKs@1SN1#Qdrd+)d)2U6`L$>wrX41;9gl-;B1&X zHLU?DfdHnBlwLBazInfa|IPDP{FH~t!3sYM^TZoK<#NM98Djf)R9|ynRU0#E(*uN# zZsLx1R9?M4e6Vu)@*Vc+VPc?;PZ5nebI}3FE|r+lI9s}@T}y7QwS&uRS9j~Gmd(l7 zT^TwI78+Of8){rUnw9D}!!2;u&Vjlv_-(=Q?|Ls7+-uTzx4^#4JA~{CD?45zmdLup=c3_ry zyYK`#T=h*tbet2kKGNLiM;zH#=c5VqE=FNc9I|A);<+W5zDJ4Nu$Et?$bgcmRY-8U za*eog|5guL+9}mfcGj&X$$>iETO)L46|aS_^fLwlR~Fl-+yQx?su#1qcK0b{P@SJs zTUpJv)*T-P*g0s6Umm2Hmr5mWpK|Z(jfn`ayBv1MhLhDlK=_m+$>>&9VK~OE5XGQH zf?%GA*vm5&lje@dp}*S*GiV@@$DI5-g0*3>DzYqf<>um1P@P}((1JTSp_%JBlC{h4 zk=wnty*m##(!}p}zB>rZy&aH~3iUxx+(f4pbTop+ju*dVaKj|;!i1TaiUjKo6JY`} zeTj2zH^EST>eHSh>POd=@UcLO)==5u;|w3Zj>12&N;KbB!<(LwEr3iI4%^WB3cp@FcEp;ytcQ9DN!g zcZVV7GU_n^2=m?#Co0vZ@c^9k<;(jaHt zG9F`VDp+H|%^q4?VK7&t=wz7xj+UyBRpMkDC|Rf&i8{#`si00jAVni5<7{rt8Q?fT zg6{hbq=;z|7rVF=N1l06e6vB;xCcI^W3;Q=`#Zwq5_6Lk39&v4j5z^!5Vdt^E=px{I15SVm6iBJxY3|Au%1bQ zzP-Kg^4d(T*nSF6nWf)PAm~NfmcPHVf~l#%Ra#Kf)>+V9P*dMn;Rv}sSz}I-895+; zk3OEpIJ*+iV~ud65|kS~rsvk5b@b3PeNZ5b_a)q{{@B&dVdo@T3b_umsQD?uJziO8 zj`9XH@~6l0wuY-@y|<>74+Wc7Yh|N;eUGuZs2*Te8oAz88GYh$M-KC)f#M@w1^?X| z6vZze@{Q_0KOC}tTwk&N7IFNxKHSbEqMem?Sr@STXDREgM(46e)!>QKx!-emowGQk z@qFQV-$TYCiysYr)7Mg81%XMIT#{~kvxOro8gGjIS?YLq0BQ2mU_##~yc%4J%jbX= z;_+Q0)K~Jiup)eiOZ1Szh+E!| zy|J+n6S!YZPv%a~B(gf)^Nvq-CwlDGPMnpCH->HM@}^`^jW+5^86*1J>lepm2;M3D zKpr|C2v`qTuNnN_=fEw*GWc8{yn_!69{LLTu7raRR1VsTk66d&Eq0Ng*erkK^Gx5v z{wwrtL2EZi59-QJ-^BhKROh+fH`aC!oSnW8=$~7%4?MqD;BA>-po+Ka^gVfTdwyNL zuDi4VenSgUA^*%f&qxB#34%9-8k@Nle!qS?EK=}uo|zNe|Q*rYQe#-LM}f(gsj=! z*7!4IJj@6m&dN?W+= zU>7u4pH^XTm11%|L(h4H&C>CTv#s!`nAd<<a~=ZXgB3J2>6 z1nY?e>jff3`LCURgPy*VJ$^AgdQrdmzro{%o z=L{aD3? z5_+&n4ir$C4E?e}ve`C+Okw7|A-}`OOoJdL_)_#l#o6YAjFEoOZ(#KbWGoAD#}}ug z)?_3{{ife6f3TvR)x%JLp>0P-*Sf*Q=+R(qb0fY(c6*#ZQdRtiW_2+dwsrvT$Rf?Z zXsijx!0EFXRbt#f!Rj@R&kk9qm>HG&zGf4uw|(9`AlC6r-c0zko* zdI>5Fo%+#T>R^;$4rqoDB2CcBV>Kf9D zPl;tFY~I__{lRh0J5S<)#hQ<{^HtlLFU$mcN*qJDNP2U?Va0Hv&pJ$Eq4BmPvi3~g zIs>WajFJZYbdKQ@k~_lol%<|<#1ug*iVj0|C!$)sULmB6G32KDwP565@8j)LDRX9- zQ&x8k6W5h_pHWn9DBnokyt5@3)>V-`9(v|2hvqGY)v!?sW-PXhd(@BZ1Dj_UlV|<` z8XurI$!ThR&2GRfSUbiFFdRQ1M8@+NCC){~;1MDdY3M)GW5}l$@#LnCFrBZr$Fobn zr9k6}2{)aGz{^d)O`~v^hJu3677wspxVOjK$+%6UahDD^ow3KEL_@|Kfy%`(yDekw zcjhs9@L}-3ACWg!2|(o2imF@GI5{QcVYfa{bVQ+`93bR2DYCnrW5SI0-a40Rxxgb9srS4b)#kl~(`4APv ztCo}*VKQ64I8kH`;8yjbdXVn?aFc{5%uTO)Co-^5tFntO0r>IyF zL2O0|rUgVLq4F7ElJ(0X^_yb#pTiE_yBMtPOR824oyG+g8VRE0V?o&fvXYkg@;S+b zq=IKP?tGU*jEeGkGs->75ONJ3Pxf$Ud^JdMS$%pEfMPLRI16Hy$E6`(5Nc|kY7X~xp zkNjS3Gksli;{k2l2Z61+Bv7@W*5>uiCPliyF#w@rz)X{{w8-+o`Rp_nOnhPVW0I-y z>v8RGwG8Y20);$VNs{W2U0npwXO=-;T*spHI;Kq`!pB39h4X~lMl3=Uaq4oY;N@YY zc8p*;1F7iO`?+E7wp=`l(no*dO>L<-eGQnvGDQ@TF;F;+_|`|J2Bi#CiH!f-`! zr{pe%DBSryhk-EVQmY_N^WMRnrj*vj4ADXJJ|Px@FxAq`Ocj3DE#S*^)90tb(_IE> zE1?)_1v9WNnpxlzhN-?zeSlq>c*mmb-F93@=;r|nKRDX>2Pfk~@+SecDK>STFi~h$ zJ{Ri8!pe8o+SvgtrHTaQDr374!B^0?hO9-rTm1(G3JPL!)Z8b3^qYTNnsr_Z2C!Jp z*}MoGtPBV$Z3v3RdU^SDfi!1^7=$`Np!3D@Bsw8FUr-c@H9>9jD)RI?uv7D_vt&BZ z7sa&p?asJadMI2kZw{=3?tFJ61)_K*UX-=$cEqM1=+`cED{Utm50c1uxe$ zoa4Gt_0{&|n*b_P{pjWjH^IN|#Pz^d0jaPY@WN)hwe(xjh+h21J6ESsxC~ed=#m|I zBA&lWq&f^z7NK3{0kwZTAyg&3dMSBfw&scLYZ}q%lJEeP#pJtWXA-TV>+o8|W_z+{ zoU4Sqz#X;QkuHw&V1H&_@Gc=e&j`4PST8A4ddrA$i%4U>#XXy!2-+8s+=IUNgu7gV z2DsHr=T35jLreFYf_b!!#J_EWf4lB+R_bs}waW}SPB}eA zV(#_3%gOY{USK}OS{8u=n~fhBDg7UzM&~OTq&;DyKf$oxWjJ)-cqik&enA(v=(jz> zaTK`)?+pWMT4Aiw{_~<(t`-wZgmFn<;HlB^WzFrUF1LV>w5rprStb^*pxo3YdM)@f z9ZwNa&&U@NNiiOxU|56=-sa8^WmVWOb{ESK!8c6t22*$njf4CJR#-Hn&_=J1vn&yR z78kLt`dMQnyGKw5IsVVgR}TvjaUxphQkmH2FY7TS>E5TRw1juggPa7Ep^U_%@fR)C z1Fn1;T!OEE{CuA}H3@rItS77yJC+xs_|bE(g$n4q15_YGnc>t7*QX$dk)7b`Q)d*e zfGVMkZ0MJx-)KSuf%r5U5^XP>0Nfk9(7SE(^sH|wqdRTsRF{t-vE}HKP+hdw@qShA zW4|0_E@c{r?-Pb~0jAID$t>F30~7q`BG zJP$>z|qdVI1&X1|fic<17$ z@J|{3dnCv?<}C3fVbCh3MhYPwf*Jqc_Yw^9IiQ7yOdOgyu%h=k9I83c7h@OONj5=kGVJ=3FEd^Tp=kExE*-nJbnIzyADIyKM@1Y(`?A@v3IH6hc%+xm)L z9;?lV3HJN8fkylg$q^N(5OuD|d%&Q*%F09+4a~I@C;~f4$Js_p+W7=8(fA|#AOzb0 zf;!m1$}vc6{Bd%_+qD>814tNj^r9m);2oVn=f>bPiE9018i0pGwpMLj(AZI{J;*lX zocQe9j7`v+@zQ?rdi3t3jx~J^y&HJYqhC1Hwak$baJ|Z%aEJ~sx(e!l=XIWuowwxH zV2IIH@-8UcWFf1FDds)(AJBZj{V2Aq^Y^(VGkI^R8KXjN5yGm7a)WV?tuaV)fr*bE z^s~Hu^I~I_S7$!D44VY(Qv&jE?-ai2s1Sryb`)KpzdCA6UreL&v+aH0H)|pAKgRJ0 zwPqMo^+UT*xG#?4XupvjCR7+SyO $9aCGcMm1Q_pV*y5cfSo_Rib?Vkhv&M(mw} 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